楼上给出的“开启一个定时器,计算一定时间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()
}
}
//******************************************************//
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)