关于51单片机测频率的问题

2019-03-24 19:22发布

请问大家,我在一秒钟之内检测到的下降沿次数就是频率对不对? 我将比较器的输出端接到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模拟的一下是附件,各位有空帮忙看看。 此帖出自小平头技术问答
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
4条回答
dragonmei
1楼-- · 2019-03-25 00:33
测频率有测周期以及级数脉冲的两种方法。高频率可以用级数法,低频必须用测周法。否则误差好大。
Li_Lei
2楼-- · 2019-03-25 01:50
 精彩回答 2  元偷偷看……
mintist
3楼-- · 2019-03-25 05:45
我当时也是用这个办法的,总体差不多,不过工作方式有点不同,我的是          TMOD=0x15;//T0工作计数器状态,T1工作于定时器状态

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

        #include<reg52.h>
        #include<intrins.h>
        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;
            }
        }
beck_ck
4楼-- · 2019-03-25 11:00
假设测量低电平的话,要改为边沿触发方式,电平触发方式,由于在中断后你没能使P3^2口提升为高电平,,所以电平触发方式在这里是不行的

一周热门 更多>