
文章插圖
大家好,小跳來為大家解答以上的問題 ?;?1單片機設計數字頻率計,數字頻率計這個很多人還不知道,現在讓我們一起來看看吧!
1、頻率測量的方法常用的有測頻法和測周法兩種 。
2、測頻法的基本思想是讓計數器在閘門信號的控制下計數1秒時間,計數結果是1秒內被測信號的周期數,即被測信號的頻率 。
3、若被測信號不是矩形脈沖 , 則應先變換成同頻率的矩形脈沖 。
4、測頻法的原理框圖如圖所示 。
5、圖中,秒脈沖作為閘門信號,當其為高電平時 , 計數器計數;低電平時 , 計數器停止計數 。
6、顯然,在同樣的閘門信號作用下,被測信號的頻率越高,測量誤差越小 。
7、當被測頻率一定時,閘門信號高電平的時間越長,測量誤差越小 。
8、但是閘門信號周期越長,測量的響應時間也越長 。
9、2、當被測信號頻率較低時,為保證測量精度,常采用測周法 。
【數字頻率計 基于51單片機設計數字頻率計】10、即先測出被測信號的周期,再換算成頻率 。
11、測周法的實質是把被測信號作為閘門信號 。
12、在它的高電平的時間內,用一個標準頻率的信號源作為計數器的時鐘脈沖 。
13、若計數結果為N,標準信號頻率為f1,則被測信號的周期為:T = T1·N 。
14、被測信號的頻率為:f = 1/T1·N = f1/N 。
15、利用測周法所產生的最大絕對誤差,顯然也等于±1個標準信號周期 。
16、如果被測信號周期的真值為T真= T1·N,則T測= T1·(N±1)σmax= (f測-f真)/ f真= T真/T測 – 1=±1/(N±1)由上式可知,對于一定的被測信號,標準信號的頻率越高,則N的值越大,因而相對誤差越小 。
17、3、低頻段的測量,鑒于上述困難,對于低頻信號 , 為了達到規定的精度,要采取一些比較特殊的方法 。
18、例如,可考慮將被測信號倍頻后再用測頻法測量 。
19、或將閘門信號展寬 。
20、由于倍頻電路比較復雜,所以一般采用后一種方法,實際上閘門信號展寬與被測信號倍頻在效果上是相同的 。
21、閘門信號展寬比較容易做到,例如采用分頻電路就可以實現 。
22、若閘門信號高電平時間從1秒展寬到10秒,則相對誤差可以按比例下降,但響應時間也增大相同的比例 。
23、4、顯示方式:共用右邊四個數碼管,左三個顯示數據,最右端一個顯示單位,為0時單位為Hz,為1時單位為Khz5、代碼://#include
#include#include#define uint unsigned intuint a,b,c,d;unsigned longx;unsigned longcount;unsigned char flag=0;void Timer0_Init()interrupt 1{TH0=(65535-10000)/256;TL0=(65535-10000)%256;if(++count==40){count=0;TR1=0;x=TH1*256+TL1;TH1=0;TL1=0;TR1=1;flag=1;}}void show(void){if(x>=10&&x<100){a=0;b=x*10%100;c=x/10;d=x%10;ZLG7289_Download(1,7,0,a);ZLG7289_Download(1,6,0,b);ZLG7289_Download(1,5,1,d);ZLG7289_Download(1,4,0,c);}else if(x>=100&&x<1000){a=0;b=x/100;c=x%100/10;d=x%10;ZLG7289_Download(1,7,0,a);ZLG7289_Download(1,6,1,d);ZLG7289_Download(1,5,0,c);ZLG7289_Download(1,4,0,b);}else if(x>=1000&&x<10000){a=x/1000;b=x%1000/100;c=x%100/10;d=1;ZLG7289_Download(1,7,0,d);ZLG7289_Download(1,6,0,c);ZLG7289_Download(1,5,0,b);ZLG7289_Download(1,4,1,a);}}main(void){system_init();systemclk_init();port_init();ZLG7289_Init(40);ZLG7289_Reset();timer_init();while(1){if(flag==1){show();flag = 0;}}}#include #include void system_init(){PCA0MD&=~0x40;}void systemclk_init(){OSCICL=OSCICL+42; //設置內部振蕩器為24MHZOSCICN|=0x01;//內部振蕩器4分頻}void port_init(){ P0SKIP=0x00;//跳過P0.0做INT0.P0.1做INT1(P0.6,P0.7模擬輸出不跳)P1SKIP=0x00;//跳過P1.2,P1.3 , P1.4XBR0=0x00;//交叉開關使能UART0XBR1=0x60;//打開交叉開關//IT01CF=0x10;//INT0配置在P0.0 , INT1配置在P0.1P0MDIN=0xFF;//數字輸入P1MDIN=0xFF;P0MDOUT=0xFF; //推挽P1MDOUT=0xFF;}void timer_init(){TMOD=0X51;TH0=(65535-2500)/256;TL0=(65535-2500)%256;EA=1;ET0=1;TR1=1;TR0=1;}#ifndef __port_H_#define __port_H_void system_init(void);void systemclk_init(void);void port_init(void);void timer_init(void);#endif 。
本文到此分享完畢,希望對大家有所幫助 。