找回密码
 立即注册
查看: 46|回复: 1

通过定时器中断实现LED任意闪烁频率与间隔

[复制链接]
  • 打卡等级:偶尔看看I
  • 打卡总天数:10
  • 最近打卡:2025-07-05 10:36:05
已绑定手机

7

主题

11

回帖

101

积分

注册会员

积分
101
发表于 7 天前 | 显示全部楼层 |阅读模式
下面的代码用了一个二维数组来实现led定时间隔闪烁,直接把ledstate函数放进定时器中断就行,可以用外部函数改变ledmode,进而调整到不同的模式。
具体原理很简单,就是通过ledmode和currentbit这两个数值在二维数组中选值,然后与计数器做比较,定时器每次中断都会对计数器+1,于是就有了时间基础,每个1都是定时器中断的间隔。直到计数器的值大于从数组中读取到的值,才会切换读取数组的下一位。通过&运算让位数在0到3的范围里循环。
根据你的定时器中断间隔与与想要实现的闪烁,调整数组数值就行。
const unsigned char ledform[][4] = {//二维数组
    //每次125ms定时器1中断ledcounter++,将ledcounter与数组做比较
    {0,0,0,0},    //mode0,常亮(vcc>4200mv),数组中的0表示立即切换到下一位
    {16,4,16,4},    //mode1,2000ms亮,500ms灭 (3800<vcc<=4000)
    {8,4,8,4},   //mode2,1000ms亮,500ms灭 (3400<vcc<=3800)
    {4,4,4,4},    //mode3,500ms亮,500ms灭 (2750=<vcc<=3400)
    {1,1,1,1},    //mode4,125ms亮,125ms灭(vcc<2750)
    {12,1,1,1},    //mode5,1500ms亮,125ms灭亮灭,charging
};
void LED_STATE(void){
    static unsigned char ledcounter = 0;//局部变量声明
    //用于从ledform中选值,比如ledmode=1,currentbit=2,segtimes=4
    static unsigned char currentbit = 0;//当前位
    unsigned char bitvalue = ledform[ledmode][currentbit];//读取当前位值
    if(ledmode == 0){//对常亮的特殊情况单独设置
        P30 = 0;
        ledcounter = 0;
        return;//不继续执行下面的语句
    }
    //状态切换判断
    if(ledcounter >= bitvalue){
        currentbit = (currentbit + 1) & 0X03;
        ledcounter = 0;
    }
    //如果位值为0,位数+1,并退出函数,实现常亮,与下面的状态切换判断不能调换先后位置
    //定义位数对应LED亮灭
    if (currentbit == 0 || currentbit == 2) {
        P30 = 0; // 亮
    } else {
        P30 = 1; // 灭
    }
    ledcounter++;//led计数器加1
}

回复

使用道具 举报 送花

3

主题

428

回帖

-433

积分

等待验证会员

积分
-433
发表于 7 天前 | 显示全部楼层
在本帖中,作者介绍了通过定时器中断实现LED任意闪烁频率与间隔的方案,并使用二维数组管理LED状态切换逻辑。该方法具备良好的可扩展性与灵活性,适用于多种应用场景。

具体实现中,通过ledmode和currentbit两个变量共同作用于二维数组ledform[][4],以控制LED的亮灭状态。定时器中断作为时间基准,每次触发时对计数器ledcounter进行自增操作。当ledcounter与当前数组元素值相等时,触发状态切换,同时通过位运算确保currentbit在0到3之间循环,实现周期性变化。

该设计的核心在于:利用定时器中断提供稳定的时间间隔,结合数组中的数值配置不同模式下的亮灭周期。例如,在mode1中,数组值为{16,4,16,4},表示LED在2000ms内保持亮态(16个中断周期),随后熄灭500ms(4个中断周期),以此类推。用户可通过修改ledform数组内容或调整ledmode来快速切换不同模式,无需改动主程序逻辑。

此外,代码结构清晰,便于维护与二次开发。外部函数可灵活改变ledmode,从而实现动态控制。此方案适用于工业控制、智能照明、嵌入式设备等多种场景,具有较高的实用价值与推广意义。

综上所述,该方法通过合理设计数据结构与中断机制,实现了高效、灵活的LED控制功能,是嵌入式系统中一种值得借鉴的解决方案。

[本文内容由国芯人工智能辅助生成,仅供参考]
回复 支持 反对

使用道具 举报 送花

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

本版积分规则

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

GMT+8, 2025-7-9 22:25 , Processed in 0.100492 second(s), 54 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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