51单片机测频率的程序

51单片机测频率的程序,第1张

频率时,频率高的时候,采用“定时计数法”。

楼上给出的“开启一个定时器,计算一定时间t内的count值”,就是这种方法。

但是,频率低的时候,这种方法是不适用的。

因为想要计几个数,就要花费很长的时间。

故此,频率低的时候,应该使用“测量周期法”,再换算成频率。

有的万用表具有频率测试功能,你只需要将万用表的正负表笔接在蜂鸣器的输入线上,将万用表的功能打到频率测试上就可以测试出来了,这里需要注意的是,大部分蜂鸣器的输入信号是规则波形,例如脉冲、正弦波等等,可以很容易测试出其频率,如果输入的是模拟的声学信号,这种信号和噪声差不多,测试的时候要注意电平的选择。

有些万用表不具备这个功能,例如大多数小表,只能想其他办法了,如果你的万用表是不具备这个功能的小表,你可以使用其他设备,例如示波器、有些带频率计的信号源、频谱仪等。

如果你没有这些设备,你可以在市场上找一下有没有频率传感器,这个东西价格应该不贵,和万用表配合也可以大致测试出信号的频率

首先使用电压比较器电路将正弦波转化成方波,以方便单片机接收,参考下图(该电路可接收峰峰值正负12V的正弦波),如果你的正弦波电路和单片机电路使用了不同的电源,则还需进行隔离处理

#include <AT89X51.H>

//********数码管位代码表(P0口)**********//

unsigned char code dispbit[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f}

//********数码管段代码表(P2口,共阴且高位接a,低位接h笔段)**********//

unsigned char code dispcode[]={0xFC,0x60,0xDA,0xF2,0x66,0xB6,0xBE,0xE0,

0xFE,0xF6,0xEE,0x3E,0x9C,0x7A,0x9E,0x8E,0x00}

//********8位数据缓冲器**********//

unsigned char dispbuf[8]

unsigned char temp[8]

unsigned char dispcount

unsigned char T0count

unsigned char timecount

bit flag

unsigned long x

//*********初始化模块**********//

void initial(void){

TMOD=0x15

TH0=0

TL0=0

TH1=(65536-4000)/256

TL1=(65536-4000)%256

TR1=0

TR0=0

ET0=1

ET1=1

EA=1

}

//******************************************************//

//*********显示模块**********//

void dataDisplay(){

unsigned char i

for(i=0i<8i++){

temp[i]=0

}

i=0

while(x/10){

temp[i]=x%10

x=x/10

i++

}

temp[i]=x

for(i=0i<8i++){

dispbuf[i]=temp[i]

}

P2=dispcode[dispbuf[dispcount]]

P0=dispbit[dispcount]

dispcount++

if(dispcount==8){

dispcount=0

}

}

//******************************************************//

//*********信号频率测量模块**********//

float frequency(float freq){

initial()

TR0=1TR1=1

if(timecount==250){

TR0=0

freq=T0count*65536+TH0*256+TL0

return(freq)

}

}

//******************************************************//

//*********信号周期测量模块**********//

float cycle(float count){

initial()

if(P3_4==1){

TR0=1TR1=1

if(P3_4==0){

TR0=0

count=1000000/(timecount*4000+TH1*256+TL1-61536)

}

}

return(count)

}

//******************************************************//

//*********定时中断服务程序1**********//

void t1(void) interrupt 3 using 0{

//initial()

//TR0=1

//TR1=1

TH1=(65536-4000)/256

TL1=(65536-4000)%256

timecount++

}

//******************************************************//

//*********定时中断服务程序2**********//

void t0(void) interrupt 1 using 0{

//initial()

//TR0=1

//TR1=1

T0count++

}

//******************************************************//

//*********主函数**********//

void main(void){

while(1){

x=frequency(x)

if(x<100){

x=cycle(x)

}

dataDisplay()

}

}

//******************************************************//


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/11803440.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-18
下一篇 2023-05-18

发表评论

登录后才能评论

评论列表(0条)

保存