利用外中断记录脉冲数,利用T0记录秒数,f=总脉冲数/总秒数,每10秒更新一次,1000秒后可以精确到3位小数,用于检测32768Hz晶振。
根据检测结果,在晶振电路中可串并合适的电容微调频率,提高走时精度。
单片机源程序如下:
- //利用外中断记录脉冲数,利用T0记录秒数,f=总脉冲数/总秒数
- //每10秒更新一次,1000秒后可以精确到3位小数,用于检测32768Hz晶振
- #define MAIN_Fosc 11059200L //定义主时钟
- #include<reg52.h>
- //#include "STC90.H"
- #include "INTRINS.H"
- #include "Delayms.h"
- #include "lcd1602.h"
- #define uchar unsigned char
- #define uint unsigned int
- sbit COUNT_IN=P3^2;
-
- unsigned long count=0,pul;
- unsigned long f=0,t10s=0;
- unsigned int ms50=0;
- //bit flag;
- void init()
- {
- IT0=1; //INT0负跳变触发
- TMOD &= 0xF0; //清定时器0
- TMOD |= 0x01; //定时器0:16位定时器
- TH0=0x4c; //11.0592Mhz50ms
- TL0=0x00;
- ET0=1;//开定时中断
- EX0=1;//开外部INTO中断
- TR0=1;//启动定时
- // EA=1; //CPU开中断总允许
- }
- void EXINT0() interrupt 0
- {
- count++; //脉冲数累加
- }
- void time0() interrupt 1
- {
- TH0=0x4c;
- TL0=0x00; //50ms11.0592Mhz
- ms50=ms50+1; //累计50毫秒数
- if (ms50>=200) //设定10秒刷新时间,200*50ms=10s
- {
- t10s++; //10秒累加
- ms50=0;
- pul=count;
- // flag=1; //10秒时间到标志
- }
- }
- void display_1602_plj(void)
- {
- DisplayOneChar(0,0,'P');//标题
- DisplayOneChar(1,0,'i');
- DisplayOneChar(2,0,'n');
- DisplayOneChar(3,0,'L');
- DisplayOneChar(4,0,'v');
- DisplayOneChar(5,0,'J');
- DisplayOneChar(6,0,'i');
- //DisplayOneChar(7,0,' ');
- DisplayOneChar(8,0,'t'); //累计秒数
- DisplayOneChar(9,0,':');
- if(t10s>=1000)
- {DisplayOneChar(11,0,t10s%10000/1000+48);}
- if(t10s>=100)
- {DisplayOneChar(11,0,t10s%1000/100+48);}
- if(t10s>=10)
- {DisplayOneChar(12,0,t10s%100/10+48);}
- if(t10s>=1)
- {DisplayOneChar(13,0,t10s%10+48);}
- DisplayOneChar(14,0,'0');
- DisplayOneChar(15,0,'S');
- if(f>=100000000) //频率
- {DisplayOneChar(0,1,f%1000000000/100000000+48);}
- if(f>=10000000)
- {DisplayOneChar(1,1,f%100000000/10000000+48);}
- if(f>=1000000)
- {DisplayOneChar(2,1,f%10000000/1000000+48);}
- if(f>=100000)
- {DisplayOneChar(3,1,f%1000000/100000+48);}
- if(f>=10000)
- {DisplayOneChar(4,1,f%100000/10000+48);}
- DisplayOneChar(5,1,f%10000/1000+48);
- DisplayOneChar(6,1,'.');
- DisplayOneChar(7,1,f%1000/100+48);
- DisplayOneChar(8,1,f%100/10+48);
- DisplayOneChar(9,1,f%10+48);
- DisplayOneChar(10,1,'H');
- DisplayOneChar(11,1,'z');
- }
- void main()
- {
- Delayms(255); //上电延时
- Delayms(255); //上电延时
- Delayms(255); //上电延时
- Delayms(255); //上电延时
- init();
- Delayms(50); //上电延时
- InitLcd(); //液晶初始化
- display_1602_plj();
- EA=1; //CPU开中断总允许
- while(1)
- {
- if (t10s>=1) //10秒取样时间到
- {
- f=pul*100/t10s; //频率=脉冲个数/时间,3位小数
- display_1602_plj();
- }
- }
- }
复制代码
附件内只包含Keil代码下载:
89c52 lcd1602频率计3位小数.rar
(48.68 KB, 下载次数: 11)
|