用NY8A051H芯片的中断函数模拟PWM做一个LED亮度程序,一共有三个LED,第一个LED亮度25%,第二个LED亮度50%,第三个LED亮度75%
时间: 2024-06-09 13:06:39 浏览: 133
项目源码九齐单片机NY8A051F-PWM Output数据手册
这里提供一个基于NY8A051H芯片的中断函数模拟PWM的代码,实现三个LED的亮度控制。其中,使用定时器中断来产生PWM信号。
```
#include <ny8.h>
#define LED1 0x01 //P10
#define LED2 0x02 //P11
#define LED3 0x04 //P12
unsigned char cnt1 = 0;
unsigned char cnt2 = 0;
unsigned char cnt3 = 0;
unsigned char pwm1 = 64; //25%
unsigned char pwm2 = 128; //50%
unsigned char pwm3 = 192; //75%
void isr(void) __interrupt(0)
{
if(INTFbits.T0IF) {
INTFbits.T0IF = 0;
cnt1++;
cnt2++;
cnt3++;
if(cnt1 >= pwm1) {
P1 |= LED1;
} else {
P1 &= ~LED1;
}
if(cnt2 >= pwm2) {
P1 |= LED2;
} else {
P1 &= ~LED2;
}
if(cnt3 >= pwm3) {
P1 |= LED3;
} else {
P1 &= ~LED3;
}
if(cnt1 >= 255) {
cnt1 = 0;
}
if(cnt2 >= 255) {
cnt2 = 0;
}
if(cnt3 >= 255) {
cnt3 = 0;
}
}
}
void main(void)
{
DISI();
BPHCON = 0x00; //关闭上拉
P1IO = 0x00; //P1设为输出
INTF = 0x00; //清除中断标志
INTE = 0x00; //关闭外部中断
TMOD = 0x01; //T0工作在模式1
TH0 = 0x0B; //周期为11
TL0 = 0xDB;
TR0 = 1; //启动T0
ET0 = 1; //允许T0中断
EA = 1; //打开总中断
while(1) {
//do nothing
}
}
```
以上代码中,使用了三个计数器 `cnt1`、`cnt2`、`cnt3` 分别用于模拟三个LED的PWM信号,通过不断增加计数器的值,当计数器的值大于等于预设的占空比时,LED就亮起来,否则就灭掉。其中,占空比通过 `pwm1`、`pwm2`、`pwm3` 这三个变量来控制,分别设置为 25%、50%、75%。
需要注意的是,定时器的周期需要根据具体的硬件电路来设置,这里设置为 11,可以根据实际需要进行调整。此外,本代码使用了定时器0产生PWM信号,如果需要使用其他定时器,则需要修改相关的寄存器配置。
阅读全文