5473|4

70

帖子

0

TA的资源

一粒金砂(高级)

楼主
 

关于51单片机测频率的问题 [复制链接]

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

我将比较器的输出端接到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

57.23 KB, 下载次数: 33

此帖出自51单片机论坛

最新回复

假设测量低电平的话,要改为边沿触发方式,电平触发方式,由于在中断后你没能使P3^2口提升为高电平,,所以电平触发方式在这里是不行的  详情 回复 发表于 2012-3-12 01:27
点赞 关注
 

回复
举报

16

帖子

0

TA的资源

一粒金砂(中级)

沙发
 
测频率有测周期以及级数脉冲的两种方法。高频率可以用级数法,低频必须用测周法。否则误差好大。
此帖出自51单片机论坛
 
 
 

回复

4005

帖子

0

TA的资源

版主

板凳
 
用定时器计数模式比较好
此帖出自51单片机论坛
 
 
 

回复

21

帖子

0

TA的资源

一粒金砂(中级)

4
 
我当时也是用这个办法的,总体差不多,不过工作方式有点不同,我的是          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;
            }
        }
此帖出自51单片机论坛
 
 
 

回复

53

帖子

0

TA的资源

一粒金砂(中级)

5
 
假设测量低电平的话,要改为边沿触发方式,电平触发方式,由于在中断后你没能使P3^2口提升为高电平,,所以电平触发方式在这里是不行的
此帖出自51单片机论坛
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/10 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表