標題: 用89C51單片機制作了一個頻率計 實測精度0.003%非常簡潔 附源碼仿真圖高清測試圖 [打印本頁]

作者: wzqwxx    時間: 2021-10-7 21:27
標題: 用89C51單片機制作了一個頻率計 實測精度0.003%非常簡潔 附源碼仿真圖高清測試圖
             如題,用AT89C52單片機制作了一個頻率計_實測很準_非常簡潔_附源碼仿真圖高清測試圖

下圖:信號發(fā)生器顯示100KHz,本試驗數(shù)碼顯示100003Hz,達到0.003%,比我的萬用表強
制作出來的實物圖如下:


下圖:信號發(fā)生器顯示10Khz,本試驗數(shù)碼顯示10000Hz


下圖:信號發(fā)生器顯示1.000 000KHz,本試驗數(shù)碼顯示1000Hz


下圖:信號發(fā)生器顯示220Hz,本試驗數(shù)碼顯示220Hz


下圖:信號發(fā)生器顯示2Hz,本試驗數(shù)碼顯示2Hz


下圖:信號發(fā)生器顯示454KHz,本試驗數(shù)碼顯示454020Hz,這也是最大量程


下圖:信號發(fā)生器顯示100K,萬用表顯示99.99KHz


下圖:信號發(fā)生器顯示200Hz,萬用表顯示199.99Hz


下表是ZT219萬用表說明書的頻率檔和電容檔介紹


這里有一段測試視頻,
基于五一單片機的頻率計簡單測試_嗶哩嗶哩_bilibili


附上單片機源碼,太簡潔吧
  1. /****************************************************
  2. 名稱:頻率計,用8位數(shù)碼管顯示

  3. 說明:用計數(shù)器1對外部頻率信號進行計數(shù),用定時器0每隔
  4.           一秒查詢計數(shù)器1的累計值,就是信號頻率。
  5.         89c52 主頻11.0592M         在開發(fā)板上測試通過
  6. ****************************************************/

  7. #include <REGX52.H>
  8. #include "SMG.h"

  9. unsigned long num;           //        儲存計算頻率值
  10. unsigned char T1_count;         //計數(shù)器1計滿65536的次數(shù)

  11. void init()
  12. {
  13.         TMOD = 0x51;// 0101 0001
  14.         TH0 = 0x4c;// 初值=65536 - 11.0592/12*50000;定時50ms
  15.         TL0 = 0x00;
  16.         PT0 = 1;
  17.         EA = ET1 = ET0 =1;
  18.         TR0 = TR1 = 1;
  19.         TI = 1;
  20. }
  21. void main()
  22. {
  23.         init();
  24.         while(1)
  25.         {
  26.                  smgxs8w(num);         //數(shù)碼管顯示8位數(shù)
  27.         }
  28. }

  29. void T1_int() interrupt 3        //計數(shù)65536次觸發(fā)一次
  30. {
  31.         T1_count++;        
  32. }

  33. void T0_int() interrupt 1        //50ms觸發(fā)一次
  34. {
  35.         static unsigned char T0_count;
  36.         TR1 = 0;
  37.         TH0 = 0x4c;//定時50ms
  38.         TL0 = 0x13;        //理論值0x00,實測0x13最準
  39.         if(++T0_count == 20)          //達到1秒
  40.         {
  41.                 num = T1_count *65536 + TH1*256+TL1;
  42.                 TH1 = TL1 = 0;
  43.                 T1_count = 0;
  44.                 T0_count = 0;
  45.         }         
  46.         TR1 = 1;

  47. }
復制代碼




仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)




Proteus7.5版本的仿真dsn文件和代碼下載: 頻率計—數(shù)碼管顯示.7z (71.08 KB, 下載次數(shù): 149)

IMG_20211007_180722.jpg (2.66 MB, 下載次數(shù): 157)

IMG_20211007_180722.jpg

IMG_20211007_180407.jpg (2.03 MB, 下載次數(shù): 149)

IMG_20211007_180407.jpg

IMG_20211007_175934.jpg (2.28 MB, 下載次數(shù): 169)

IMG_20211007_175934.jpg

IMG_20211007_175114.jpg (2.18 MB, 下載次數(shù): 170)

IMG_20211007_175114.jpg

作者: 一片一城    時間: 2021-10-8 11:32
仿真就這個?




作者: 一片一城    時間: 2021-10-8 11:38
信號輸入端呢?檔位呢?
作者: wzqwxx    時間: 2021-10-8 13:46
一片一城 發(fā)表于 2021-10-8 11:32
仿真就這個?

不好意思,仿真數(shù)碼管的圖在上面,源程序在附件打包文件里。這個是用LCD屏顯示的仿真圖,可能是在改用數(shù)碼管的時候一同復制到新文件夾里了。
作者: wzqwxx    時間: 2021-10-8 13:56
一片一城 發(fā)表于 2021-10-8 11:38
信號輸入端呢?檔位呢?

這個是我學習昨天學習單片機時的實驗作品,實物就是那個照片里的開發(fā)板了。
從仿真圖看,信號輸入端在AT89C52的P3.5腳,這個沒有檔位,最大量程實測在450000HZ,這以下能保證精度,這是單片機主頻時鐘決定的。
如果要實用和增大量程,輸入端還要加放大器、波形整形和分頻等電路。
本人還處在學習階段,請多指導。
作者: 一片一城    時間: 2021-10-8 17:49
樓主辛苦了。按你的電路和代碼仿真了一回,可我不會設(shè)置給它的合適的信號,請教了。








作者: 一片一城    時間: 2021-10-8 20:13
本帖最后由 一片一城 于 2021-10-8 20:15 編輯

在Proteus中我添加了一個方波發(fā)生器,加了隔直電容,可還是看不到正常的測量結(jié)果,是我哪里沒弄對?





作者: wzqwxx    時間: 2021-10-9 08:35
一片一城 發(fā)表于 2021-10-8 17:49
樓主辛苦了。按你的電路和代碼仿真了一回,可我不會設(shè)置給它的合適的信號,請教了。

如圖所示,點擊左側(cè)工具箱里的快捷圖標,打開虛擬信號源面板,選擇數(shù)字時鐘發(fā)生器DCLOCK,再打開它,設(shè)置參數(shù),特別是頻率。其它信號源,例如正弦波頻率要大于220Hz(實測)。如實際應用,P3.5端口要接0V—5V高低電平方波信號,頻率1Hz—400 000Hz。打字慢,只能說到這,不知可說明白了。
作者: wzqwxx    時間: 2021-10-9 08:44
從我的分析來看隔直電容C3不能加,因為P3.5要下降沿電平觸發(fā),即要輸入0V-5V低高電平方波,即脈動的直流電,不是交流方波。從你的555電路看,一是否起振了,二是看C1 R1 R2的參數(shù),頻率過高,三用示波器看看波形是否是方波。如實際應用,P3.5端口要接0V—5V高低電平方波信號,頻率1Hz—400 000Hz。打字慢,只能說到這,不知可說明白了。
作者: 一片一城    時間: 2021-10-9 10:53
wzqwxx 發(fā)表于 2021-10-9 08:44
從我的分析來看隔直電容C3不能加,因為P3.5要下降沿電平觸發(fā),即要輸入0V-5V低高電平方波,即脈動的直流電 ...

非常感謝你的回復。謝謝。
作者: 一片一城    時間: 2021-10-9 12:04
是我仿真時選錯了數(shù)碼管極性,改正后正常了。



有微小波動,總體十分精準。
  


作者: wzqwxx    時間: 2021-10-9 15:45
一片一城 發(fā)表于 2021-10-9 10:53
非常感謝你的回復。謝謝。

不客氣,祝你玩得愉快,我們一起學習提高。
作者: 傳奇爸爸    時間: 2021-10-15 06:53
樓主做的不錯,精度也可以
作者: 傳奇爸爸    時間: 2021-10-15 06:54
不知道樓主學習單片機多長時間了,我也剛開始接觸單片機
作者: wzqwxx    時間: 2021-10-15 13:04
        2019年10月看到能用C語言對單片機編,便產(chǎn)生了對單片機興趣,學了一個月吧,然后干其他事又耽誤了。30年前剛參加工作時,買過那種任天堂的游戲機,CPU好像是6502的8位單片機,試著匯編語言,太難記,放上一兩個月不碰,指令都忘了。那時候流動蘋果2電腦和8088、80286PC機,價格貴,我等貧民是接觸不到。本人英文不行,看到單詞就頭痛,90年代到2010年代斷續(xù)學習過C、C++,還有易語言,但由于正處在30、40歲年齡段,工作忙,幾乎沒有業(yè)余時間玩這些興趣愛好,F(xiàn)在已五十歲了,工作輕松了些,試著拾起小時候的興趣愛好(電子技術(shù)),一個月前由于要燒寫萬用表的EEPROM數(shù)據(jù),沒有編程器,看到別人能用單片機編寫一個程序就能解決,于是我又重新看書看視頻,參考別人源代碼,編寫了一段程序(主要是IIC協(xié)議讀寫AT24C02),完美解決問題。寫這段文字時,我還在看要不要學32位單片機呢,反正現(xiàn)在有大把時間,談死還早。
作者: 傳奇爸爸    時間: 2021-10-15 23:57
wzqwxx 發(fā)表于 2021-10-15 13:04
2019年10月看到能用C語言對單片機編,便產(chǎn)生了對單片機興趣,學了一個月吧,然后干其他事又耽誤了 ...

看到你這么執(zhí)著,我也不敢輕言放棄了,謝謝你說了這么多,確實很佩服您
作者: 清風慕雨    時間: 2021-11-20 05:10
wzqwxx 發(fā)表于 2021-10-15 13:04
2019年10月看到能用C語言對單片機編,便產(chǎn)生了對單片機興趣,學了一個月吧,然后干其他事又耽誤了 ...

這個代碼可以了,另外一種方法是外部中斷+定時間 ,測低頻要比這個準,不過挺佩服你的,這個行業(yè)是由淺到深的,用到的技術(shù)也很多,51的單片機適合簡單控制類,比如一些家電什么的,這行業(yè) 學海無涯
作者: zydl123    時間: 2021-11-23 12:57
這個可以,跟著學習學習
作者: chanmk    時間: 2021-12-29 21:27
這個可以測量1M的頻率嗎?
作者: 風158    時間: 2024-6-28 22:03
原理上講,頻率測量精度要想達到千分之一,測量時間需要1000秒。
作者: hbgcbyc    時間: 2024-10-3 19:23
下載了,里面有很多文件打不開




歡迎光臨 (http://www.torrancerestoration.com/bbs/) Powered by Discuz! X3.1