51单片机测量声音频率并输出的代码
时间: 2023-12-26 19:06:43 浏览: 26
以下是基于51单片机测量声音频率并输出的代码:
```
#include <reg52.h>
#include <stdio.h>
// 定义数码管段码
unsigned char code segCode[] = {
0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07,
0x7f, 0x6f, 0x77, 0x7c, 0x39, 0x5e, 0x79, 0x71
};
// 定义计数器初值
unsigned int counter = 65535;
// 延时函数
void Delay10us() {
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
}
// 读取AD值
unsigned char GetADCResult() {
unsigned char result;
ADC_CONTR = 0x80; // 开始ADC转换
Delay10us(); // 延时等待转换完成
while (!(ADC_CONTR & 0x20)); // 等待ADC转换完成
result = ADC_RES; // 读取ADC值
return result;
}
// 主函数
void main() {
unsigned char adValue, lastAdValue = 0;
unsigned int frequency = 0;
TMOD = 0x01; // 设置定时器模式
TH0 = 0xfc; // 设置定时器初值
TL0 = 0xfc;
ET0 = 1; // 开启定时器中断
EA = 1; // 开启总中断
P1 = 0xff; // 数码管初始值
P2 = 0xff;
while (1) {
adValue = GetADCResult(); // 获取AD值
if (adValue < 0xff && lastAdValue == 0xff) { // 检测到声音信号
TR0 = 1; // 开启定时器
}
if (adValue == 0xff && lastAdValue < 0xff) { // 检测到声音信号结束
TR0 = 0; // 关闭定时器
frequency = 11059200 / counter; // 计算频率
counter = 65535; // 复位计数器
}
lastAdValue = adValue; // 保存上一个AD值
// 将频率显示在数码管上
P1 = segCode[frequency / 1000];
P2 = segCode[frequency % 1000 / 100] | 0x80;
Delay10us();
P1 = segCode[frequency % 100 / 10];
P2 = segCode[frequency % 10];
Delay10us();
}
}
// 定时器中断函数
void Timer0Interrupt() interrupt 1 {
counter--;
}
```
这份代码使用了51单片机的定时器和ADC模块,通过检测声音信号的上升沿和下降沿来计算声音的频率,并将频率显示在数码管上。需要注意的是,由于51单片机的定时器只有16位,所以在计算频率时需要使用一个计数器来记录定时器溢出的次数。