利用外中斷記錄脈沖數,利用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();
- }
- }
- }
復制代碼
51hei.png (6.95 KB, 下載次數: 87)
下載附件
2022-1-14 07:37 上傳
附件內只包含Keil代碼下載:
89c52 lcd1602頻率計3位小數.rar
(48.68 KB, 下載次數: 11)
2022-1-13 11:30 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|