標題: 基于51單片機的等精度頻率計設計(含程序,仿真電路,通過實測) [打印本頁]

作者: wxfhz    時間: 2017-7-21 17:09
標題: 基于51單片機的等精度頻率計設計(含程序,仿真電路,通過實測)
本設計以51單片機為核心,顯示采用1602液晶。頻率測量方法采用等精度頻率法測量,外部脈沖作為內(nèi)部高速脈沖計數(shù)的啟動信號,也是最后的計數(shù)的結(jié)束信號。保證外部脈沖計數(shù)的無誤差,通過內(nèi)部的高速計數(shù)保證測量精度。

等精度頻率計ppt:

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

設計論文:


單片機源程序如下:
  1. #include "STC12C5A60S2.H"
  2. #include "Intrins.h"
  3. #include "1602.h"
  4. unsigned char t0_hh,t1_hh;
  5. unsigned char dis_buf[12];
  6. //unsigned char code frequence[]={"frequence:"};

  7. #define FOSC 11059200 //18432000L
  8. #define BAUD 9600


  9. //sbit  RS=P2^0;
  10. //sbit        RW=P2^1;
  11. ////sbit RS=P1^0;
  12. ////sbit RW=P1^1;
  13. //sbit        LCM1602_E=P2^2;
  14. //sbit        LCM1602_Busy=P0^7;
  15. bit         firstex,secondex;
  16. unsigned long count0,count1;
  17. unsigned long count;

  18. void deal_data()
  19. {
  20.         unsigned char i;
  21.         float adata;

  22.         count1=t1_hh*65536+TH1*256+TL1;
  23.         count0=t0_hh*65536+TH0*256+TL0;

  24.         adata=(float)count1*10000000/count0;
  25.         adata=(float)adata*10/1.0851245;  //修正
  26.         count=(unsigned long)(adata+0.5);

  27.         for(i=8;i>0;i--)
  28.         {
  29.                 dis_buf[i]=count%10;
  30.                 count=count/10;
  31.         }
  32.         dis_buf[0]=count;
  33.         dis_buf[9]=dis_buf[8];
  34.         dis_buf[8]=dis_buf[7];
  35.         dis_buf[7]=-2;
  36. }

  37. //低頻液晶顯示
  38. void display()
  39. {
  40.         unsigned char i;
  41.         for(i=0;i<12;i++)
  42.         {
  43.                 lcd_char_write(i,1,dis_buf[i]+0x30);
  44.         }

  45. }

  46. //外中斷1
  47. void init1() interrupt 2
  48. { //lcd_char_write(10,0,0x30);
  49.         if(firstex==0)
  50.         {       
  51.                 TH1=0;
  52.                 TL1=0;
  53.                 TH0=0;
  54.                 TL0=0;
  55.                 t0_hh=0;
  56.                 t1_hh=0;
  57.                 TR1=1;
  58.                 TR0=1;
  59.                 EX1=0;
  60.                 firstex=1;
  61.                 secondex=0;
  62.         }
  63.         else
  64.         {
  65.                 TR1=0;
  66.                 TR0=0;
  67.                 secondex=1;
  68.                 EX1=0;
  69.         }
  70.                
  71. }
  72. //定時器1中斷處理
  73. void timer1() interrupt 3
  74. {
  75.         t1_hh++;
  76. }

  77. void timer0() interrupt 1
  78. {
  79.         t0_hh++;
  80.         if(t0_hh>=20)
  81.         {
  82.                 IE1=0;
  83.                 EX1=1;
  84.         }
  85. }

  86. void main()
  87. {       

  88.         AUXR= 0x40;
  89.         TMOD=0x51;
  90.         ET1=1;
  91.         ET0=1;
  92.         IT1=1;
  93.         EX1=1;
  94. ……………………

  95. …………限于本文篇幅 余下代碼請從51黑下載附件…………
復制代碼

所有資料51hei提供下載:
51單片機等精度頻率計.rar (1.03 MB, 下載次數(shù): 612)



作者: admin    時間: 2017-7-22 17:21
好資料,51黑有你更精彩!!!
作者: white1    時間: 2017-7-30 14:02
本帖最后由 white1 于 2017-7-31 15:16 編輯

好資源,謝謝樓主
作者: xiaoyuxinke    時間: 2017-8-1 00:27
實測精度好差
作者: lwj7474741    時間: 2018-1-14 14:40
哇!太感謝了!
作者: a25575703    時間: 2018-1-14 22:24
感謝樓主的分享。
作者: raymondau    時間: 2018-3-25 16:46
本帖最后由 raymondau 于 2018-3-25 16:55 編輯

請問樓主那單片機是用STC89C51還是用STC12C5A60S2的?
另外再請問一下這頻率計的測量范圍有多大的?

作者: raymondau    時間: 2018-3-25 16:54
另外再請問一下這個頻率計的測量范圍有多大的?
作者: 1258185790@qq.c    時間: 2018-5-26 20:23
請問是采用測頻、測周、混合、等精度中的哪一種
作者: 1258185790@qq.c    時間: 2018-5-26 20:35
可以STC89C52代替STC12C5A60S2嗎?
作者: fsj5098    時間: 2018-12-13 22:30
應該是采用測周法
作者: 1xiaosun    時間: 2018-12-14 09:06
xiaoyuxinke 發(fā)表于 2017-8-1 00:27
實測精度好差

精度好差可能程序有錯,這個原理應該很準的,0.001Hz~1MHz無壓力
作者: qq13337338077    時間: 2018-12-18 13:05
精度怎么樣?
作者: wljj1278824    時間: 2018-12-21 13:28
好資料,學習下,不過能達到這個精度嗎
作者: springcsp    時間: 2019-7-15 16:09

好資料,51黑有你更精彩!!!
作者: gxtyx    時間: 2019-11-22 23:33
這個資料正合適
作者: 9638527410ppp    時間: 2020-3-30 11:47
太棒了!感謝樓主!!
作者: jgjbd    時間: 2020-4-22 15:27
if(t0_hh>=20)         {                 IE1=0;                 EX1=1;         }  這一句的意義是什么啊
作者: jgjbd    時間: 2020-4-22 15:29
if(t0_hh>=20)
        {
                IE1=0;
                EX1=1;
        }
為什么沒有這步就不顯示數(shù)據(jù),這一步的意義是什么啊
作者: 1935501565    時間: 2020-6-8 17:13
很好的分享
作者: 1935501565    時間: 2020-6-8 17:14
很好的分享,謝謝樓主分享
作者: 1935501565    時間: 2020-6-8 17:15
謝謝樓主的分享啦
作者: 初晴2000    時間: 2020-6-8 18:00
感謝大佬。!愛了愛了
作者: 初晴2000    時間: 2020-6-22 16:21
精度很差誒!!
作者: 一個傅立葉    時間: 2020-7-9 11:55
精度有點低啊
作者: bm32    時間: 2020-7-10 17:37
好資料,51黑有你更精彩!!!
作者: lujuguo    時間: 2020-8-17 16:43
有黑論壇生活更精彩!
作者: 陳潤源home    時間: 2020-8-19 11:12
jgjbd 發(fā)表于 2020-4-22 15:29
if(t0_hh>=20)
        {
                IE1=0;

外部中斷配置,沒有就檢測不了引腳電平變化
作者: ykygky    時間: 2021-5-3 00:01
這仿真只能測到10mhz以下,沒有樓主PPT上面的那么高,應該要分頻吧
作者: jhjh123f    時間: 2021-5-18 17:04
這個誤差有點大啊
作者: aking991    時間: 2021-5-19 08:26
實際上51能測到那么高的精度嗎?我以前也試驗過,在24M有源溫補晶振的情況下,最好的狀態(tài)只能測到萬分之一的精度,還作不到百萬分之一的精度,雖然不相信,但也只能下載下來參考
作者: sharehope    時間: 2021-5-19 21:27
大家關(guān)注的確實都是精度這個點上,看看如何等布提高
作者: 卷卷zeta    時間: 2021-7-11 17:11
如果要把這個改成數(shù)碼管顯示應該怎么修改呀,小白求教
作者: 不必了啊    時間: 2021-7-16 16:14
        count1=t1_hh*65536+TH1*256+TL1;
        count0=t0_hh*65536+TH0*256+TL0;

        adata=(float)count1*10000000/count0;
        adata=(float)adata*10/1.0851245;  //修正
        count=(unsigned long)(adata+0.5);
問一下這里修正是干嘛用的,為什么要進行修正?




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