新人求助,STC8G1K08-8pin做双LED呼吸灯,手册上面写8pin封装不支持PCA,于是用定时器模拟PWM,结果2个LED同时呼吸时候(2.5-5.5秒期间)会高频闪烁直到常亮,但是我关闭任意1个LED单独呼吸就很正常。求分析原因是代码写得不好?还是驱动力不够?又或者是有干扰?
#include <STC8G.H>
#include <INTRINS.H>
#define LED1 P32 // 第一个LED连接P3.2
#define LED2 P33 // 第二个LED连接P3.3
unsigned long system_time = 0;
unsigned char led1_duty = 0;
unsigned char led2_duty = 0;
unsigned char pwm_counter = 0; //pwm计数
void Timer0_Init() { // 1毫秒@11.0592MHz
AUXR |= 0x80; // 1T模式
TMOD &= 0xF0; // 模式0,16位自动重装
TL0 = 0xCD; // 1000Hz PWM周期(1ms)
TH0 = 0xD4;
ET0 = 1; // 使能定时器中断
TR0 = 1; // 启动定时器
EA = 1; // 全局中断使能
}
void main() {
P3M0 |= 0x0c; P3M1 &= ~0x0c; //初始化端口P32,P33推挽输出
LED1 = 0;
LED2 = 0;
Timer0_Init();
while(1) {
pwm_counter++;
// LED1 PWM输出
if(pwm_counter == 0) LED1 = 0;
if(pwm_counter > 255-led1_duty) LED1 = 1;
// LED2 PWM输出
if(pwm_counter == 0) LED2 = 0;
if(pwm_counter > 255-led2_duty) LED2 = 1;
// 系统时间处理
if(system_time < 10000) {
// LED1控制逻辑上电0.5秒开始呼吸,5.5秒后变成常亮,10秒后灯灭
if(system_time <= 500) {
led1_duty = 0;
}
else if(system_time <= 5500) {
led1_duty = (system_time - 500) / 20;
}
else if(system_time <= 10000) {
led1_duty = 255;
}
else {
led1_duty = 0;
}
// LED2控制逻辑上电2.5秒开始呼吸,7.5秒后变成常亮,10秒后灯灭
if(system_time <= 2500) {
led2_duty = 0;
}
else if(system_time <= 7500) {
led2_duty = (system_time - 2500) / 20;
}
else if(system_time <= 10000) {
led2_duty = 255;
}
else {
led2_duty = 0;
}
}
}
}
void Timer0_ISR() interrupt 1 {
TL0 = 0xCD;
TH0 = 0xD4;
system_time++;
}