分享一个简单的频率计
仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)
单片机源程序如下:
- /******************************************************************
- AT89S51的T0,T1计数器对输入的信号进行频率计数,测量结果用五位数码管
- 动态显示,要求对0~65KHZ的信号频率进行准确测量,误差不超过5HZ
- *****************************************************************/
- #include <reg51.h>
- #define uint unsigned int
- #define A 3
- sbit P37=P3^7;
- unsigned char num=0;
- code unsigned char TAB[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};
- /*显示变量对应的数值*/
- /***************定时器0中断服务函数************************/
- void timer0()interrupt 1{
- TH0=0x3C;
- TL0=0xB0;//定时50ms
- num++;//记到20就直接停止
-
- }
- /**************************延时函数************************************/
- void delay(unsigned char t){
- unsigned char i,j;
- for(i=0;i<t;i++)
- for(j=0;j<125;j++);
- }
- /*************************显示函数**************************************/
- void Display(){
- uint number;
- unsigned char B1,B2,B3,B4,B5;//定义数的各个位,万,千,百,十,个位
- number=TH1*256+TL1;
- B1=number/10000;//万位
- B2=number%10000/1000;//千位
- B3=number%1000/100;//百位
- B4=number%100/10;//十位
- B5=number%10;//个位
- while(1){
- if(P37==1) break;
- P2=0xFE;//显示个位
- P0=TAB[B5];
- delay(A);
- P2=0xFD;//显示十位
- P0=TAB[B4];
- delay(A);
- P2=0xFB;//显示百位
- P0=TAB[B3];
- delay(A);
- P2=0xF7;//显示千位
- P0=TAB[B2];
- delay(A);
- P2=0xEF;//显示万位
- P0=TAB[B1];
- delay(A);
- }
- }
- void main(){
- P0=TAB[0];//刚开始显示00000
- P2=0xC0;
- TMOD=0x51;//T0 记时 T1计数
- TH0=0x3c;//定时50ms
- TL0=0xB0;
- TH1=0x00;//计数
- TL1=0x00;
- TR0=1; //开T0
- TR1=1;//开T1
- ET0=1;//开中断
- EA=1;//打开总中断
- while(1){
- if(num>=20){//记满一秒
- num=0;
- TR1=0;
- ……………………
- …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码
所有资料51hei提供下载:
数字频率计c.rar
(20.4 KB, 下载次数: 64)
|