找回密码
 立即注册
查看: 58|回复: 2

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

[复制链接]
  • 打卡等级:初来乍到
  • 打卡总天数:4
  • 最近打卡:2025-09-15 11:53:54
已绑定手机

1

主题

1

回帖

23

积分

新手上路

积分
23
发表于 2025-9-9 15:25:38 | 显示全部楼层 |阅读模式

新人求助,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++;
}
回复

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:562
  • 最近打卡:2025-09-18 04:56:45
已绑定手机

86

主题

6142

回帖

1万

积分

超级版主

积分
11378
发表于 2025-9-9 20:28:08 | 显示全部楼层
可以换8G1K08A,8脚带PCA
回复

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:4
  • 最近打卡:2025-09-15 11:53:54
已绑定手机

1

主题

1

回帖

23

积分

新手上路

积分
23
发表于 2025-9-10 11:15:20 | 显示全部楼层
Debu*** 发表于 2025-9-9 20:28
可以换8G1K08A,8脚带PCA

感谢!搞了半天解决了,我把PWM频率提高到10KHz再优化了下占空比。但最后应该会换8G1K08A来实现,还是得有PCA方便些。
回复

使用道具 举报 送花

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )

GMT+8, 2025-9-18 20:05 , Processed in 0.117832 second(s), 62 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

快速回复 返回顶部 返回列表