[求助] 关于51单片机测频率的问题

Learner_new   2012-3-9 23:30 楼主

请问大家,我在一秒钟之内检测到的下降沿次数就是频率对不对?

我将比较器的输出端接到P3^2口

 

程序如下

/******************中断函数***********************/
void int0() interrupt 0
{
 count++;  //每来个低电平进入中断,计算一秒之内下降沿的次数
}

/****************定时器1函数 处理频率**************/
void time1() interrupt 3
{
 TH1=(65536-50000)/256;
 TL1=(65536-50000)%256;
 tt++;
 if(tt==20)
 {
  frequence=count;
  count=0;
  tt=0;
 }

}这方法不知道为什么不对  请大家指教 我用protues模拟的一下是附件,各位有空帮忙看看。

    频率.rar (2012-3-9 23:30 上传)

    57.23 KB, 下载次数: 33

回复评论 (4)

测频率有测周期以及级数脉冲的两种方法。高频率可以用级数法,低频必须用测周法。否则误差好大。
点赞  2012-3-10 10:49
用定时器计数模式比较好
点赞  2012-3-11 12:03
我当时也是用这个办法的,总体差不多,不过工作方式有点不同,我的是          TMOD=0x15;//T0工作计数器状态,T1工作于定时器状态

下面是我的代码,在我单片机上面好的,我没有仿真过,单片机是AT89S52晶振:11.0593MHz~~~

        #include
        #include
        unsigned char code dispbit[]={0xfe,0xfd,0xfb,0xf7};
        unsigned char code dispcode[]
        ={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90};
        unsigned char dispbuf[8]={0,0,0,0,0,0};
        unsigned char temp[4];
        unsigned char dispcount;
        unsigned char T0count;
        unsigned char timecount;
        bit flag;   //标志位,初始值为1
        unsigned long x;
        void main(void)
        {
          unsigned char i;
          //定时器初始化
         TMOD=0x15;//T0工作计数器状态,T1工作于定时器状态
         TH0=0;
          TL0=0;
          TH1=(65536-3650)/256;   //定时为4ms
          TL1=(65536-3650)%256;
          TR1=1;
          TR0=1;
          ET0=1;
          ET1=1;
          EA=1;
          while(1)
           {
             if(flag==1)
               {
                 flag=0;
                 x=T0count*65536+TH0*256+TL0;    //读取T0中的频率
                 for(i=0;i<4;i++)   //初始化temp
                   {
                     temp=0;
                   }
                 i=0;
                 while(x/10)       //读取频率的每一位放在对应的temp
                   {
                     temp=x%10;
                     x=x/10;
                     i++;
                   }
                 temp=x;
                 for(i=0;i<4;i++)
                   {
                     dispbuf=temp;
                   }
                 timecount=0;    //复位操作
             T0count=0;
                 TH0=0;
                 TL0=0;
                 TR0=1;
               }
           }
        }
        void t0(void) interrupt 1   //定时器1中断服务程序,溢出后中断,系统自动调用
        {
            T0count++;
        }
        void t1(void) interrupt 3
        {
          TH1=(65536-3650)/256;
          TL1=(65536-3650)%256;
          timecount++;
          if(timecount==250)
            {
              TR0=0;
              timecount=0;
              flag=1;
            }
          P0=dispcode[dispbuf[dispcount]];
          P1=dispbit[dispcount];
          dispcount++;
          if(dispcount==4)
            {
              dispcount=0;
            }
        }
点赞  2012-3-11 19:38
假设测量低电平的话,要改为边沿触发方式,电平触发方式,由于在中断后你没能使P3^2口提升为高电平,,所以电平触发方式在这里是不行的
点赞  2012-3-12 01:27
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复