如題,用AT89C52單片機制作了一個頻率計_實測很準_非常簡潔_附源碼仿真圖高清測試圖

下圖:信號發生器顯示100KHz,本試驗數碼顯示100003Hz,達到0.003%,比我的萬用表強
制作出來的實物圖如下:
下圖:信號發生器顯示10Khz,本試驗數碼顯示10000Hz
下圖:信號發生器顯示1.000 000KHz,本試驗數碼顯示1000Hz
下圖:信號發生器顯示220Hz,本試驗數碼顯示220Hz
下圖:信號發生器顯示2Hz,本試驗數碼顯示2Hz
下圖:信號發生器顯示454KHz,本試驗數碼顯示454020Hz,這也是最大量程
下圖:信號發生器顯示100K,萬用表顯示99.99KHz
下圖:信號發生器顯示200Hz,萬用表顯示199.99Hz
下表是ZT219萬用表說明書的頻率檔和電容檔介紹
這里有一段測試視頻,
基于五一單片機的頻率計簡單測試_嗶哩嗶哩_bilibili

附上單片機源碼,太簡潔吧
- /****************************************************
- 名稱:頻率計,用8位數碼管顯示
- 說明:用計數器1對外部頻率信號進行計數,用定時器0每隔
- 一秒查詢計數器1的累計值,就是信號頻率。
- 89c52 主頻11.0592M 在開發板上測試通過
- ****************************************************/
- #include <REGX52.H>
- #include "SMG.h"
- unsigned long num; // 儲存計算頻率值
- unsigned char T1_count; //計數器1計滿65536的次數
- void init()
- {
- TMOD = 0x51;// 0101 0001
- TH0 = 0x4c;// 初值=65536 - 11.0592/12*50000;定時50ms
- TL0 = 0x00;
- PT0 = 1;
- EA = ET1 = ET0 =1;
- TR0 = TR1 = 1;
- TI = 1;
- }
- void main()
- {
- init();
- while(1)
- {
- smgxs8w(num); //數碼管顯示8位數
- }
- }
- void T1_int() interrupt 3 //計數65536次觸發一次
- {
- T1_count++;
- }
- void T0_int() interrupt 1 //50ms觸發一次
- {
- static unsigned char T0_count;
- TR1 = 0;
- TH0 = 0x4c;//定時50ms
- TL0 = 0x13; //理論值0x00,實測0x13最準
- if(++T0_count == 20) //達到1秒
- {
- num = T1_count *65536 + TH1*256+TL1;
- TH1 = TL1 = 0;
- T1_count = 0;
- T0_count = 0;
- }
- TR1 = 1;
- }
復制代碼

仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)
Proteus7.5版本的仿真dsn文件和代碼下載:
頻率計—數碼管顯示.7z
(71.08 KB, 下載次數: 149)
2022-4-27 15:11 上傳
點擊文件名下載附件
|