51单片机用定时器输出两路不同的pwm波
时间: 2023-07-02 09:15:28 浏览: 74
在51单片机中,有两个定时器,分别是定时器0和定时器1,每个定时器有不同的工作模式,可以用来产生PWM波。以下是一个简单的例子,用来在P1口输出两路不同占空比的PWM波:
```
#include <reg52.h>
#define FREQ 1000 // PWM频率
#define DUTY1 50 // 占空比1
#define DUTY2 75 // 占空比2
void main(void)
{
TMOD = 0x11; // 定时器1和定时器0都设置为模式1
TH1 = TL1 = 256 - FOSC / 12 / FREQ; // 计算定时器1的重载值
TH0 = TL0 = 0; // 定时器0的重载值为0
ET1 = 1; // 开启定时器1中断
TR1 = 1; // 启动定时器1
TR0 = 1; // 启动定时器0
P1 = 0xff; // 初始化P1口输出高电平
while(1);
}
void timer1_isr(void) interrupt 3
{
static unsigned char count1 = 0, count2 = 0;
count1++;
count2++;
if (count1 > 100) {
count1 = 0;
}
if (count2 > 100) {
count2 = 0;
}
if (count1 > DUTY1) {
P1 &= ~0x01;
} else {
P1 |= 0x01;
}
if (count2 > DUTY2) {
P1 &= ~0x02;
} else {
P1 |= 0x02;
}
}
```
在这个例子中,我们使用了定时器1来产生PWM波,定时器0用来作为计数器来控制PWM波的占空比。在中断服务函数中,我们通过计数器来判断何时需要改变PWM波的状态。在主函数中,我们开启了定时器1中断,启动了定时器0和定时器1,然后在P1口输出两路不同占空比的PWM波。需要注意的是,这个例子中的PWM波的频率和占空比都是固定的,您可以根据需要进行修改。