AT89C51单片机输出两路频率为30khz的PWM信号,按键按下A输出,再次按下B输出
时间: 2023-05-28 09:07:11 浏览: 76
基于AT89C51单片机的PWM调速
以下是AT89C51单片机输出两路频率为30khz的PWM信号,按键按下A输出,再次按下B输出的示例代码:
```c
#include <reg51.h>
sbit key1 = P1^0; // 按键A
sbit key2 = P1^1; // 按键B
sbit pwm1 = P2^0; // PWM1输出口
sbit pwm2 = P2^1; // PWM2输出口
unsigned char flag = 0; // 标志位,用于记录当前输出的PWM口
void delay(unsigned int t)
{
unsigned int i, j;
for(i = 0; i < t; i++)
{
for(j = 0; j < 125; j++);
}
}
void pwm_init()
{
TMOD |= 0x02; // 定时器0工作在模式2(8位自动重装载定时器)下
TH0 = 0x00; // 定时器初值
TL0 = 0x00;
ET0 = 1; // 允许定时器0中断
EA = 1; // 开启总中断
TR0 = 1; // 启动定时器0
}
void main()
{
pwm_init(); // PWM初始化
while(1)
{
if(key1 == 0) // 检测按键A是否按下
{
delay(10); // 延时去抖
if(key1 == 0)
{
flag = 1; // 设置PWM1输出口
}
while(key1 == 0); // 等待按键松开
}
if(key2 == 0) // 检测按键B是否按下
{
delay(10); // 延时去抖
if(key2 == 0)
{
flag = 2; // 设置PWM2输出口
}
while(key2 == 0); // 等待按键松开
}
}
}
void pwm_isr() interrupt 1 // 定时器0中断服务函数
{
static unsigned char cnt = 0; // 计数器,用于控制PWM占空比
if(flag == 1) // 输出PWM1
{
if(cnt < 30) // 占空比为30/256
{
pwm1 = 1;
}
else
{
pwm1 = 0;
}
cnt++;
if(cnt == 255) // 定时器0溢出,清零计数器
{
cnt = 0;
}
}
else if(flag == 2) // 输出PWM2
{
if(cnt < 30) // 占空比为30/256
{
pwm2 = 1;
}
else
{
pwm2 = 0;
}
cnt++;
if(cnt == 255) // 定时器0溢出,清零计数器
{
cnt = 0;
}
}
}
```
在上述代码中,使用了定时器0的中断功能来控制PWM输出口的占空比。为了输出30khz的PWM信号,定时器0的工作频率需要设置为60khz。由于定时器0的计数范围为0~255,因此占空比可以通过计数器的值来控制。例如,当计数器的值小于30时,PWM口输出高电平,否则输出低电平。这样,就可以实现占空比为30/256的PWM信号输出。通过按下按键A或B,可以选择输出PWM1或PWM2,以此来实现按键控制PWM信号的输出。
阅读全文