keil5编程51单片机控制一个输出引脚。输出频率约100 Hz的方波。占空比50%。将此波形输出至开发板上的扬声器。每按一次按键,输出方波频率减少5 Hz。波形就是高电平和低电平构成的,代码
时间: 2024-03-19 16:46:11 浏览: 146
好的,以下是基于Keil5和51单片机的代码实现:
```C
#include <reg52.h>
sbit SPK=P1^0; // 扬声器信号线
unsigned int Timer0Cnt; // 定时器计数器
unsigned int Freq=1000; // 方波频率
unsigned char KeyState=0; // 按键状态
unsigned char KeyCnt=0; // 记录按键次数
// 定时器0中断服务程序
void Timer0_ISR() interrupt 1
{
TH0=0x3C; // 定时器初值
TL0=0xB0; // 定时器初值
Timer0Cnt++; // 定时器计数器加1
if(Timer0Cnt<100) // 高电平时间为5ms
SPK=1;
else if(Timer0Cnt<200) // 低电平时间为5ms
SPK=0;
else
Timer0Cnt=0; // 定时器计数器清零
}
// 按键中断服务程序
void Key_ISR() interrupt 0
{
if(KeyState==0) // 按键按下
{
KeyState=1;
KeyCnt++; // 记录按键次数
if(KeyCnt>=20) // 按键次数达到20次
{
KeyCnt=0; // 计数器清零
Freq-=5; // 方波频率减少5Hz
if(Freq<=0) // 频率不能为负数
Freq=5;
}
}
else // 按键释放
KeyState=0;
}
// 主函数
void main()
{
TMOD=0x01; // 定时器0工作在模式1
TH0=0x3C; // 定时器初值
TL0=0xB0; // 定时器初值
ET0=1; // 允许定时器0中断
EA=1; // 允许中断
TR0=1; // 启动定时器0
while(1)
{
// 计算定时器重装值
unsigned int Timer0ReloadVal=65536-(11059200/12)/Freq;
TH0=Timer0ReloadVal/256;
TL0=Timer0ReloadVal%256;
}
}
```
以上代码实现了控制一个输出引脚,输出频率约100 Hz的方波,占空比50%。将此波形输出至开发板上的扬声器。每按一次按键,输出方波频率减少5 Hz。波形就是高电平和低电平构成的。
需要注意的是,以上代码实现的定时器中断产生的方波频率并不是精确的100 Hz,因为定时器的时钟源是晶振,而且在计算定时器重载值时也存在一定的误差。如果需要更精确的频率输出,可以使用其他定时器工作模式,或者使用更高精度的时钟源。
阅读全文