keil5消除蜂鸣器并将输入单片机的正弦波信号转化成方波并显示出频率的代码
时间: 2024-03-03 10:50:41 浏览: 57
下面是基于STC89C52单片机的示例代码,可以将输入的正弦波信号转化成方波并显示出频率:
```c
#include<reg52.h>
sbit beep=P1^5; // 蜂鸣器控制引脚
unsigned int time1,time2; // 计时器1、2计数值
unsigned long fre; // 频率值
void main()
{
EA=1; // 开启总中断
TMOD=0x10; // 定时器1工作在模式1
TH1=0; // 定时器1初始值
TL1=0; // 定时器1初始值
TR1=1; // 启动定时器1
ET1=1; // 允许定时器1中断
while(1)
{
if(fre>0) // 如果有频率值
{
// 这里可以将频率值显示出来
fre=0; // 清零频率值
}
}
}
// 定时器1中断服务函数
void timer1() interrupt 3
{
time1++;
if(time1>=500) // 每500个计数值为一个单位时间
{
time1=0;
beep=~beep; // 控制蜂鸣器输出方波
}
}
// 定时器2中断服务函数
void timer2() interrupt 5
{
time2++;
if(time2>=500) // 每500个计数值为一个单位时间
{
time2=0;
fre=500000/TH1; // 计算频率值,单位为Hz
TH1=0; // 定时器1初始值清零
TL1=0; // 定时器1初始值清零
}
}
// 外部中断1服务函数
void exint1() interrupt 2
{
TR1=0; // 关闭定时器1
TH1=0; // 定时器1初始值清零
TL1=0; // 定时器1初始值清零
TR1=1; // 重新启动定时器1
time2=0; // 定时器2计时器清零
}
```
该代码通过定时器1和定时器2来实现将输入的正弦波信号转化成方波并计算出频率值。其中,定时器1用于产生方波输出,定时器2用于计算频率值。在输入正弦波信号时,需要手动触发外部中断1来重置定时器1和定时器2的计数器。在每个单位时间内,定时器1和定时器2的计数器的值都会自动增加,当定时器1计数器达到500时,就将蜂鸣器的状态取反一次,从而实现方波输出。当定时器2计数器达到500时,就根据定时器1的计数器值计算出一个频率值,并清零定时器1的计数器,从而准备下一次计算。在主函数中,可以将频率值显示出来。
阅读全文