设计的目的
频率计作为测量仪器的一种,它的基本功能是测量信号的频率和周期频率计的应用范围很广,但是目前,市场上有各种多功能、高精度、高频率的数字频率计,但价格不菲。为适应工作的需要,可以用一种较小规模和单片机(AT89C51)相结合的频率计的设计方案,不但切实可行,而且体积小、设计简单、成本低、精度高、可测频带宽,大大降低了设计成本和实现复杂度。
设计的内容及要求
本设计以AT89C51单片机为控制核心,将外部的频率脉冲信号通过单片机计数端输入,由定时器/计数器T0负责定时,定时器/计数器T1负责对被测信号计数,该频率计的测量范围为1Hz~65534Hz,被测脉冲信号的频率可以随时进行调整,通过LCD液晶显示模块对被测信号的频率进行实时显示。该系统包括被测频率脉冲信号、单片机晶振电路、以AT89C51单片机为核心的频率测量模块、LCD液晶显示模块。
电路原理图:
proteus仿真图:
51单片机部分程序源代码:
- #include<reg51.h>
- #include<intrins.h>
- #define uchar unsignedchar
- #define uint unsignedint
- void init_lcd(void);
- void disp_str(ucharx,uchar y,uchar *p);
- sbit FS=P3^5; //被测信号FS输入端
- bit RDY=0; //测量完成标志
- uint msn; //定时中断计数
- uint count(void) //测量FS的频率
- {RDY=0;
- TMOD=0x52; //T0:定时方式2,T1:计数方式1
- TH0=TL0=6;//T0定时时间为250us
- msn=4000; //4000次中断正好1s
- TH1=TL1=0x00; //T1工作于计数方式,初值为0
- ET0=1; //允许T0中断
- EA=1; //开中断
- while(FS==1); //等待被测信号变低
- while(FS==0); //等待被测信号变高
- TR0=1; //T0开始定时
- TR1=1; //T1开始计数
- while(RDY==0); //等待1s
- TR1=0; //关闭T1、T0
- TR0=0;
- return(TH1*256+TL1); //返回计数值
- }
-
- void timer0(void)interrupt 1 using 1
- {msn--;
- if(msn==0) //如果1s已到
- RDY=1; //设置测量完成标志位
- }
- void main()
- {uint f;
- ucharstr[9]="f= Hz";
- uchar i;
- init_lcd(); //液晶屏初始化
- while(1)
- {f=count(); //测量频率
- _nop_();
- for(i=6;i>=2;i--) //测量结果转换为5位ASCII码
- {str=f%10+0x30;
- f=f/10;
- }
- disp_str(0,3,str);//显示测量结果
- }
- }
复制代码
|