2当被测信号频率较低时,为保证测量精度,常采用测周法。即先测出被测信号的周期,再换算成频率。测周法的实质是把被测信号作为闸门信号,在它的高电平的时间内,用一个标准频率的信号源作为计数器的时钟脉冲。若计数结果为N,标准信号频率为f1,则被测信号的周期为 T = T1·N被测信号的频率为 f = 1/T1·N = f1/N利用测周法所产生的最大绝对误差,显然也等于±1个标准信号周期。如果被测信号周期的真值为T真= T1·N,则T测= T1·(N±1) σmax= (f测-f真)/ f真= T真/T测 – 1=±1/(N±1)由上式可知,对于一定的被测信号,标准信号的频率越高,则N的值越大,因而相对误差越小。
5代码://#include#include#include#define uint unsigned intuint a,b,c,d;unsigned long x;unsigned long count;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; //设置内部振荡器为24MHZ OSCICN|=0x01; //内部振荡器4分频}void port_init(){ P0SKIP=0x00; //跳过P0.0做INT0.P0.1做INT1(P0.6,P0.7模拟输出不跳) P1SKIP=0x00; //跳过P1.2,P1.3,P1.4 XBR0=0x00; //交叉开关使能UART0 XBR1=0x60; //打开交叉开关 //IT01CF=0x10; //INT0配置在P0.0,INT1配置在P0.1 P0MDIN=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