reinlucis 发表于 2025-9-9 15:25:38

8G1K08-8pin做双LED呼吸灯但是会闪烁

<p>新人求助,STC8G1K08-8pin做双LED呼吸灯,手册上面写8pin封装不支持PCA,于是用定时器模拟PWM,结果2个LED同时呼吸时候(2.5-5.5秒期间)会高频闪烁直到常亮,但是我关闭任意1个LED单独呼吸就很正常。求分析原因是代码写得不好?还是驱动力不够?又或者是有干扰?</p>
<pre><code>#include &lt;STC8G.H&gt;
#include &lt;INTRINS.H&gt;

#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 &amp;= 0xF0;       // 模式0,16位自动重装
TL0 = 0xCD;         // 1000Hz PWM周期(1ms)
TH0 = 0xD4;
ET0 = 1;            // 使能定时器中断
TR0 = 1;            // 启动定时器
EA = 1;             // 全局中断使能
}

void main() {
    P3M0 |= 0x0c; P3M1 &amp;= ~0x0c;    //初始化端口P32,P33推挽输出
    LED1 = 0;
    LED2 = 0;

    Timer0_Init();

    while(1) {
      pwm_counter++;

      // LED1 PWM输出
      if(pwm_counter == 0) LED1 = 0;
      if(pwm_counter &gt; 255-led1_duty) LED1 = 1;

      // LED2 PWM输出
      if(pwm_counter == 0) LED2 = 0;
      if(pwm_counter &gt; 255-led2_duty) LED2 = 1;

      // 系统时间处理
      if(system_time &lt; 10000) {

          // LED1控制逻辑上电0.5秒开始呼吸,5.5秒后变成常亮,10秒后灯灭
            if(system_time &lt;= 500) {
                led1_duty = 0;
            }
            else if(system_time &lt;= 5500) {
                led1_duty = (system_time - 500) / 20;
            }
            else if(system_time &lt;= 10000) {
                led1_duty = 255;
            }
            else {
                led1_duty = 0;
            }

            // LED2控制逻辑上电2.5秒开始呼吸,7.5秒后变成常亮,10秒后灯灭
            if(system_time &lt;= 2500) {
                led2_duty = 0;
            }
            else if(system_time &lt;= 7500) {
                led2_duty = (system_time - 2500) / 20;
            }
            else if(system_time &lt;= 10000) {
                led2_duty = 255;
            }
            else {
                led2_duty = 0;
            }
      }
    }
}


void Timer0_ISR() interrupt 1 {
TL0 = 0xCD;
TH0 = 0xD4;
system_time++;
}
</code></pre>

DebugLab 发表于 2025-9-9 20:28:08

可以换8G1K08A,8脚带PCA

reinlucis 发表于 2025-9-10 11:15:20

DebugLab 发表于 2025-9-9 20:28
可以换8G1K08A,8脚带PCA

感谢!搞了半天解决了,我把PWM频率提高到10KHz再优化了下占空比。但最后应该会换8G1K08A来实现,还是得有PCA方便些。
页: [1]
查看完整版本: 8G1K08-8pin做双LED呼吸灯但是会闪烁