#include<STC15.h>
#define LED_PIN P1_0
void init_PWM() {
TMOD |= 0x01; // 定时器0设置为16位定时器模式,以供PWM使用
ET0 = 1; //打开定时器中断
TR0 = 1; //启动定时器
}
void delay_nms(unsigned int n) { // 毫秒级延时函数,可根据实际情况调节
unsigned int i,j;
for (i=0; i<n; i++) {
for (j=0; j<125; j++);
}
}
void main() {
unsigned char duty_cycle = 0; // 占空比,默认为0
unsigned char flag = 0; // 标志变量,用于判断递增还是递减
init_PWM();
while(1) {
if(!flag) {
duty_cycle++;
if(duty_cycle == 255) {
flag = 1;
}
} else {
duty_cycle--;
if(duty_cycle == 0) {
flag = 0;
}
}
LED_PIN = (duty_cycle == 0 || duty_cycle == 255) ? 0 : 1; // 避免输出高电平或低电平长时间照成LED损伤
delay_nms(10); // 延时10毫秒,可根据实际需求做出适当调整
}
}
void timer0() interrupt 1 {
TH0 = 245; // 修改定时器初值
TL0 = 245;
PWM_OUT = duty_cycle; // 修改PWM占空比
}
在上述代码中,循环呼吸灯的周期为500ms,可在 delay_nms() 函数中根据实际情况进行调整。同时,在 main() 函数中使用 flag 变量控制 duty_cycle 的递增和递减,从而实现循环呼吸灯的效果。在 timer0() 中断服务函数中,修改定时器初值并根据当前占空比设置 PWM 输出。 |