国信长天的开发板好像用不了这个代码
时间: 2024-02-19 22:58:34 浏览: 60
感谢您的反馈!您提到的国信长天的开发板可能使用的是不同的芯片,因此需要使用不同的代码来实现相同的功能。以下是基于STC芯片的51单片机实现测量声音频率并输出的代码,供您参考:
```
#include <reg51.h>
#include <intrins.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 = 0x88; // 开始ADC转换
while (!(ADC_CONTR & 0x10)); // 等待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; // 开启总中断
P0 = 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值
// 将频率显示在数码管上
P0 = segCode[frequency / 1000];
Delay10us();
P0 = segCode[frequency % 1000 / 100] | 0x80;
Delay10us();
P0 = segCode[frequency % 100 / 10];
Delay10us();
P0 = segCode[frequency % 10];
Delay10us();
}
}
// 定时器中断函数
void Timer0Interrupt() interrupt 1 {
counter--;
}
```
这份代码使用了STC芯片的ADC模块和定时器,通过检测声音信号的上升沿和下降沿来计算声音的频率,并将频率显示在数码管上。需要注意的是,由于STC芯片的ADC模块和定时器与51单片机的实现略有不同,因此这份代码可能无法直接在其他芯片上使用。如果您仍然遇到问题,请提供更多的信息和反馈,我会尽力帮助您。
阅读全文