51单片机编程 第六节:低频频率计

发布者:创新火花最新更新时间:2016-10-22 来源: eefocus关键字:51单片机  编程  低频频率计 手机看文章 扫描二维码
随时随地手机看文章
第六节:低频频率计

实例目的:学时定时器、计数器、中断应用
说明:选用24MHz的晶体,主频可达2MHz。用T1产生100us的时标,T0作信号脉冲计数器。假设晶体频率没有误差,而且稳定不变(实际上可达万分之一);被测信号是周期性矩形波(正负脉冲宽度都不能小于0.5us),频率小于1MHz,大于1Hz。要求测量时标1S,测量精度为0.1%。
解:从测量精度要求来看,当频率超过1KHz时,可采用1S时标内计数信号脉冲个数来测量信号频,而信号频率低于1KHz时,可以通过测量信号的周期来求出信号频率。两种方法自动转换。
对于低于1KHz的信号,信号周期最小为1ms,也就是说超过1000us,而我们用的定时器计时脉冲周期为0.5us,如果定时多计或少计一个脉冲,误差为1us,所以相对误差为1us/1000us=0.1%。信号周期越大,即信号频率越低,相对误差就越小。
从上面描述来看,当信号频率超过1KHz后,信号周期就少于1000us,显然采用上面的测量方法,不能达到测量精度要求,这时我们采用1S单位时间计数信号的脉冲个数,最少能计到1000个脉冲,由于信号频率不超过1MHz,而我们定时脉冲为2MHz,最差多计或少计一个信号脉冲,这样相对误差为1/1000,可见信号频率越高,相对误差越小。
信号除输入到T1(P3.5)外,还输入到INT1(P3.3)。

代码

1.       unsigned int us100;   //对100us时间间隔单位计数,即有多少个100us。   

2.       unsigned char Second;   

3.       unsigned int K64;    //对64K单位计数,即有多少个64K     

4.       unsigned char oldT0;   

5.       unsigned int oldus, oldK64, oldT1;   

6.       unsigned long fcy;    //存放频率值,单位为Hz   

7.       bit HighLow=1;    //1:表示信号超过1KHz;0:表示信号低于1KHz。   

8.     void InitialHigh( void )   

9.      {   

10.    IE=0; IP=0; HighLow=1;   

11.   TMOD = (TMOD & 0xf0) | 0x02; TH0=-200; TL0=TH0; PX0=1; T0=1;    

12.    TMOD = (TMOD & 0x0f) | 0x50; TH1=0; TL1=0; T1=1; ET1=1;   

13.    Us100=0; Second=0; K64=0;   

14.    oldK64=0; oldT1=0;   

15.    TCON |= 0x50;  //同时置 TR0=1; TR1=1;   

16.    EA = 1;   

17.   }   

18.   void InitialLow( void )   

19.   {   

20.    IE=0; IP=0; HighLow=0;   

21.   TMOD = (TMOD & 0xf0) | 0x02; TH0=-200; TL0=TH0; ET0=1; TR0=1;   

22.    INT1 = 1; IT1=1; EX1=1;   

23.    Us100=0; Second=0; K64=0;   

24.    oldK64=0; oldT1=0;   

25.    EA = 1;   

26.   }   

27.   void T0intr( void ) interrupt 1   

28.   { if( HighLow==0 ) ++us100;   

29.   else  

30.   if( ++us100 >= 10000 )   

31.   {  unsigned int tmp1, tmp2;   

32.   TR1=0; tmp1=(TH1<<8) + (TL1); tmp2=K64; TR1=1;   

33.   fcy=((tmp2-oldK64)<<16) + (tmp1-oldT1);   

34.   oldK64=tmp1; oldT1=tmp2;   

35.   Second++;   

36.   us100=0;   

37.   }   

38.   }   

39.   void T1intr( void ) interrupt 3 { ++K64; }   

40.   void X1intr( void ) interrupt 2   

41.   { static unsigned char sts=0;   

42.   switch( sts )    

43.   {   

44.   case 0: sts = 1; break;   

45.   case 1: oldT0=TL0; oldus=us100; sts=2; break;   

46.   case 2:    

47.   {   

48.    unsigned char tmp1, tmp2;   

49.    TR0=0; tmp1=TL0; tmp2=us100; TR0=1;   

50.    fcy = 1000000L/( (tmp2-oldus)*100L + (256-tmp1)/2 );   

51.    Second ++;   

52.   }   

53.    Sts = 0;   

54.    break;   

55.    }   

56.   }   

57.   void main( void )   

58.   {   

59.   if( HighLow==1) InitialHigh(); else InitialLow();   

60.    While(1)   

61.    {   

62.   if( Second != 0 )   

63.   {   

64.   Second = 0;   

65.   //display fcy  引用前面的数码管驱动程序,注意下面对T0中断服务程序的修改   

66.   { unsigned char i;   

67.    for( i=0; i<8; i++ ){ Display(i, fcy%10); fcy /= 10; }   

68.   }   

69.   if( HighLow==1 )   

70.   if( fcy<1000L ){ InitalLow();}     

71.      else  

72.       if( fcy>1000L ){ InitalHigh();}   

73.   }   

74.    }   

75.   }   

76.   //修改T0的中断服务程序,让它在完成时标的功能时,同时完成数码管显示刷新   

77.   void T0intr( void ) interrupt 1   

78.   {   

79.    static unsigned char ms = 0;   

80.    if( HighLow==0 ) ++us100;   

81.   else  

82.   if( ++us100 >= 10000 )   

83.   {  unsigned int tmp1, tmp2;   

84.   TR1=0; tmp1=(TH1<<8) + (TL1); tmp2=K64; TR1=1;   

85.   fcy=((tmp2-oldK64)<<16) + (tmp1-oldT1);   

86.   oldK64=tmp1; oldT1=tmp2;   

87.   Second++;   

88.   us100=0;   

89.   }   

90.    if( ++ms >= 10 ){ ms=0; DisplayBrush(); } //1ms数码管刷新   

91.   }  


关键字:51单片机  编程  低频频率计 引用地址:51单片机编程 第六节:低频频率计

上一篇:51单片机编程 第七节:电子表
下一篇:51单片机编程 第五节:键盘驱动 例子

推荐阅读最新更新时间:2024-03-16 15:16

单片机编程教程-初识单片机
所谓 单片机 ,通俗的来讲,就是把中央处理器CPU(Central Processing Unit),存储器(memory),定时器,I/O(Input/Output)接口电路等一些计算机的主要功能部件集成在一块集成电路芯片上的微型计算机。单片机又称为 微控制器MCU 。中文 单片机 的称呼是由英文名称 Single Chip Microcomputer 直接翻译而来的。 单片机的主要分类: 1、 按应用领域可分为:家电类,工控类,通信类,个人信息终端类等等; 2、 按通用性可分为:通用型和专用型。 通用型单片机的主要特点是:内部资源比较丰富,性能全面,而且通用性强,可履盖多种应用要求。所谓资源丰富就是指功能强。性能全面通用
[单片机]
基于TEC9328可编程定时电路的循环式定时控制器
    摘要: TEC9328是深圳天潼公司生产的四位定时计数电路,利用它可以对控制对象进行循环控制操作。文中介绍了它主要特点、引脚功能和内部结构。并给出了利用TEC9328设计的循环式定时控制器的实际应用电路。     关键词: 循环 控制定时器 TEC9328 在日常生产及工业应用中,有时可能需要对某一控制对象进行循环式控制,即让对象工作一段时间(如1分钟),然后停歇一段时间(如10分钟),再工作一段时间,再停歇一段时间,如此循环地工作下去。通常的定时器仅能使对象在停歇一段时间后继续工作,而不能实现循环控制。而基于TEC9328可编程定时电路循环式定时控制器则非常适合于这种循环式的自动控制操作。 1
[半导体设计/制造]
51单片机PWM直流电机PID控制转速源程序
AT89C51单片机PWM直流电机转速PID控制源程序,重点介绍利用MCS-51系列单片机控制PWM信号从而实现对直流电机转速进行控制的方法。设计中采用了专门的芯片组成了PWM信号的发生系统并且对PWM信号的原理、产生方法以及如何通过软件编程对PWM信号占空比进行调节从而控制其输入信号波形等均作了详细的阐述。另外本系统中使用了红外对管对直流电机的转速进行测量,经过整形电路后将测量值送到单片机,并且最终作为反馈值输入到单片机进行PID运算从而实现了对直流电机速度的控制。在软件方面,文章中详细介绍了PID运算程序初始化程序等的编写思路和具体的程序实现。 1 单片机最小系统:单片机最小系统由51单片机,晶振电路,复位电路,电源组成。
[单片机]
51单片机特别功用存放器和位界说
接下来的几节,我们会带着人人编写第一个单片机程序。在此之前,我们先来理解一些 51 单片机特有的程序语法以及 Keil 软件的根本操作步调,请人人必定要有耐烦。 我们次要是用 C 言语来对单片机编程,而有的单片机有那么几条很特别的独有的编程语句,51 单片机就有,先引见 2 条。 第一条语句是:sfr P0 = 0x80; sfr 这个症结字,是 51 单片机特有的,他的感化是界说一个单片机特别功用存放器(special function register)。51 单片机外部有许多个小模块,每一个模块寓居在具有独一房间号的房间内,同时每一个模块都有 8 个掌握开关。P0 就是一个功用模块,就住在了 0x80 这个房间里,我们就
[单片机]
<font color='red'>51单片机</font>特别功用存放器和位界说
理解51单片机串口通信的波特率与USB转串口通信
串口通信的基本认识 通信分为并行通信和串行通信,并行通信时的数据各个位同时传送,可以实现字节为单位通信,但通信线多占用资源,成本高。以前用到的的P1=0x55,一次给P1口的8个管脚分别赋值,同时进行信号输出,类似于8个车道可以过去8辆车,这样的形式是并行的,一般称P0,P1,P2,P3为51单片机的4组并行总线。 串行通信,就是一个车道,一个只能通过一辆车,如果一个0x55这样一个字节的数据要传输过去的话,假如低位在前,高位在后的话,那发送方式是:0-1-0-1-0-1-0-1,一位一位的进行传输,要发送8次才能发送完一个字节 STC89C52有两个引脚是专门用来做串口通信的,一个是P3.0(RXD),一个是P3.1(TXD
[单片机]
理解<font color='red'>51单片机</font>串口通信的波特率与USB转串口通信
PSoC Creator简化可编程器件上的软硬件协同设计
采用 嵌 入式CPU内核的可编程器件为应对各种设计挑战提供了有效途径,而这些挑战仅仅通过软件或硬件的方法可谓举步维艰,或者说解决成本非常高昂。这些器件结合了能再编程的数字与模拟硬件资源,能提供您切实所需的功能。此外,设计工具能消除与可编程逻辑通常相关的大多数复杂性问题。例如,赛普拉斯半导体公司推出的PSoC Creator就是专为简化上述工作而精心设计的。借助PSoC Creator,用户不必一定要有完美的电路设计,仅需提供相关的设计元素即可,有点像在白板上绘画的感觉。随后,该工具能提供外设模块(即组件)的最佳布局和布线方案,并设置所需的时钟和电源配置,进而为用户优化设计。 下面以采用PSoC Creator进行设计为例,给出了如
[单片机]
PSoC Creator简化可<font color='red'>编程</font>器件上的软硬件协同设计
51单片机外设之——按键的检测(带有标志位的按键识别法)
前面提到了独立按键的扫描方法(延时,消抖的方法),可见这种方法很大程度上可以实现按键的准确扫描。但是仔细一看,可以发现,它有一个缺点——存在while语句的松手检测! 试想,倘若我们一直按着按键不松手,那我们的程序毫无疑问的一直卡在了while语句的松手检测上。这在很多场合是并不适用的。 对于独立按键的博文中所提到的配合数码管显示的实例中,由于我们数码管显示函数display() 位于主函数中,假如我们按键长时间按下,一定会存在数码管不能显示的情况。所以接下来给出一种不需要while松手检测的按键扫描——带有标志位的按键识别(在矩阵键盘同样适用,这里以独立键盘为例)。 首先附上原理图: 用跳帽连接排针 J5 的2脚与3脚,将键
[单片机]
<font color='red'>51单片机</font>外设之——按键的检测(带有标志位的按键识别法)
80C51单片机的引脚及其功能介绍
首先我们来连接一下单片机的引脚图,如果,具体功能在下面都有介绍。 单片机的40个引脚大致可分为4类:电源、时钟、控制和I/O引脚。 ⒈ 电源: ⑴ VCC - 芯片电源,接+5V; ⑵ VSS - 接地端; ⒉ 时钟:XTAL1、XTAL2 - 晶体振荡电路反相输入端和输出端。 ⒊ 控制线:控制线共有4根, ⑴ ALE/PROG:地址锁存允许/片内EPROM编程脉冲 ① ALE功能:用来锁存P0口送出的低8位地址 ② PROG功能:片内有EPROM的芯片,在EPROM编程期间,此引脚输入编程脉冲。 ⑵ PSEN:外ROM读选通信号。 ⑶ RST/VPD:复位/备用电源。 ① RST(Reset)功能:复位信号输入端。 ② VP
[单片机]
80C<font color='red'>51单片机</font>的引脚及其功能介绍
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
随便看看
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved