51單片機 | 頻率測量控制實現


————————————————————————————————————————————

頻率測量方法:

  • 測頻法:測試限定時間內檢測脈沖的個數(1s)
  • 測周法:采樣N個脈沖所使用的時間

————————————————————————————————————————————

測頻法實驗:

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

設計要求:

通過測頻法測出時鍾發生器的頻率並顯示在顯示屏上

 

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

實現過程:

通過DCLOCK時鍾發生器產生時鍾頻率,如下圖所示,一秒鍾產生233個頻率

T0接收時鍾發生器產生的脈沖,使用count變量計數,定時器T1完成1s后關閉中斷,並將此時的count顯示出來

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

元件清單:

  • AT89C51
  • 7SEG-MPX8-CC-BLUE
  • DCLOCK(在電壓探針列表中)

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

實現代碼:

 1 #include <reg52.h>
 2 typedef unsigned int uint;
 3 typedef unsigned char uchar;
 4 uchar code number[] =
 5 {
 6     0xFC, 0x60, 0xDA, 0xF2, 0x66, 0xB6, 0xBE, 0xE0, 0xFE, 0xF6, 0xEE, 0x3E, 0x9C, 0x7A, 0x9E, 0x8E
 7 };
 8 uchar code address[] =
 9 {
10     0xFE, 0xFD, 0xFB, 0xF7, 0xEF, 0xDF, 0xBF, 0x7F
11 };
12 uint count = 0, time = 0, temp; //一定要用int類型,char類型只有8位,計數只到255
13 bit flag = 0;
14 void Delay(uchar m)
15 {
16     while(--m);
17 }
18 int main()
19 {
20     uchar i;
21     EA = 1;
22     ET0 = 1;
23     ET1 = 1;
24     TMOD = 0x16; //定時器1為方式1,計數器0為方式2,T0選擇C/T=1,計數器方式,脈沖由外部提供
25     TH0 = 0xff;
26     TL0 = 0xff;
27     TR0 = 1;
28     TH1 = (65536 - 50000) / 256;
29     TL1 = (65536 - 50000) % 256;
30     TR1 = 1;
31     while(1)
32     {
33         if (flag == 1)
34         {
35             temp = count;
36             for (i = 0; i < 8; ++i)
37             {
38                 P2 = address[i];
39                 P1 = number[temp % 10];
40                 temp = temp / 10;
41                 Delay(500);
42             }
43         }
44     }
45 }
46 void Count0()interrupt 1
47 {
48     ++count;
49 }
50 void Time1()interrupt 3
51 {
52     TH1 = (65536 - 50000) / 256;
53     TL1 = (65536 - 50000) % 256;
54     ++time;
55     if (time == 20)
56     {
57         EA = 0;
58         flag = 1;
59     }
60 }

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM