0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

单片机项目中LED的重要性

jf_pJlTbmA9 来源:jf_pJlTbmA9 作者:jf_pJlTbmA9 2023-09-18 16:19 次阅读

很多初学者觉得自己学的东西很基础,担心今后实际工作用不到。有初学者问了这样的问题:单片机真正开发产品和学习的时候有什么差别,平时学的LEDADC这些东西,在实际项目中会用到吗?

虽然技术更新迭代很快,但有很多基本的技术,仍然在实际项目中会用到,今天就拿LED为例来说说吧。

LED有哪些作用?

别小看LED,它在实际生活中应用很广泛的。

首先就是以LED为光源的项目,比如呼吸灯、广告灯、LED显示屏等,这类控制LED亮灭(闪烁),或者亮度渐变。

再次就是LED背光灯,像液晶背光灯、按键背光灯等,这种也是需要控制LED变化的。我之前做过有按键的项目,按键背光灯需要渐变、配合音效控制LED不同频率闪烁,目的就是为了达到更好的体验效果。

再再次,LED作为指示灯,电源指示灯、状态指示灯,这种就和接近初学者的学习时的LED灯,但这种却在项目中很常见。

拿状态指示灯来说,一个项目的LED状态指示灯可以直观明了的指示设备的运行状态,比如:运行、故障、待机、死机等常见状态。通过RGB,或者红黄绿不同颜色LED组合,可以实现更多状态的指示。

下面针对LED状态灯,说几点细节的内容。

LED状态灯实现

这里结合代码为大家分享一些项目中常见的LED状态灯的实现方法。

1、单色LED运行状态指示灯

通过闪烁(一亮一灭)指示设备运行的状态的指示灯,一个关键作用:设备有没有死机。

很多产品中都会用到,你买一个开发板,提供的综合例程也基本都有。

裸机情况下(一般状态机),在某一个状态实现LED闪烁:

int main(void) { //系统初始化 while(1) { //do something switch(State) { case 状态1: //do something break; case 状态2: //do something break; · · · case 状态灯: ED_TOGGLE(); //LED闪烁 break; } } }

RTOS情况下,新建一个状态灯线程,在线程里面直接控制即可:

void StatusLight_Task(void *pvParameters) { static TickType_t xLastWakeTime; //初始化 xLastWakeTime = xTaskGetTickCount(); for(;;) { //do something LED_TOGGLE(); //LED闪烁 vTaskDelayUntil( xLastWakeTime, 500); } }

2、单色LED渐变

LED渐变在生活中其实也有一些场景在用,呼吸灯、键盘等,其实原来也很简单,就是控制LED亮度。

控制方法有很多,电压、PWM都能达到控制LED亮度的效果。当然,现在还有控制LED渐变的专有芯片

但是,对于单片机项目来说,单片机自身就能实现,如果单独用一个芯片,就显得有点多余。

使用DAC输出模拟量可以实现,但如果多路就不现实,因此这种方法不常见。

常见的是PWM控制IO高低电平(从而控制电压),这种对于单片机来说有两种方法:

定时器硬件PWM

控制GPIO口高低电平

a、定时器硬件PWM

一个定时器输出PWM波形的同时,还需要一个定时器定时更新PWM输出占空比(修改亮度)。

b、控制GPIO口高低电平

这个方法就比较简单,控制IO口高低电平时间,只是这个时间需要结合整个项目业务逻辑(特别是裸机情况下),不能出现“卡机”情况。

当然,在RTOS情况下,业务逻辑就比较简单,单独一个线程:

LED_ON(); vTaskDelay(TimesON); LED_OFF(); vTaskDelay(TimesOFF);

这里TimesON 和 TimesOFF是需要结合项目情况修改的变量(比如渐变时间)。

3、多色LED,多种运行状态

一个设备在没有显示屏指示状态的时候,通过LED指示状态也是一种方法,比如:红、黄、绿三色,分别常灭、常亮、闪烁三种状态。

这种相对第一种单色固定状态要复杂一点,但实现起来也不难,方法也有很多。

这里分享一些思路:创建一个线程,一个结构体,轮询各种LED状态,根据应用修改其各种状态,以及闪烁时间等。

LED状态结构体:

typedef struct { uint8_t Mode; //模式 uint8_t Status; //当前状态 uint16_t OffTimes; //灭时间 uint16_t OnTimes; //亮时间(ms) uint16_t Counter; //计数(计时) void (*OffFun)(void); //灭函数接口 void (*OnFun)(void); //亮函数接口 }SL_TypeDef; /* 状态灯 */

LED状态主线程:

void StatusLight_Task(void *pvParameters) { static TickType_t xLastWakeTime; xLastWakeTime = xTaskGetTickCount(); for(;;) { SL_Scan( sSLG_Structure); //红灯 SL_Scan( sSLY_Structure); //黄灯 SL_Scan( sSLR_Structure); //绿灯 vTaskDelayUntil( xLastWakeTime, SL_TASK_PERIOD); } }

这里结构体也是方便统一管理,其中SL_Scan浏览(扫描)函数的参数通过传递结构体指针,是为了方便读取并修改其中变量。

当然,SL_Scan浏览函数具体实现,就与你应用有关:

static void SL_Scan(SL_TypeDef *SL_Struct) { /* 常灭模式 */ if(SL_MODE_OFF == SL_Struct->Mode) { SL_Struct->Status = SL_STATUS_OFF; //状态置为"灭" SL_Struct->OffFun(); //灭灯 } /* 常亮模式 */ else if(SL_MODE_ON == SL_Struct->Mode) { SL_Struct->Status = SL_STATUS_ON; //状态置为"亮" SL_Struct->OnFun(); //亮灯 } /* 闪烁模式 */ else if(SL_MODE_FLICKER == SL_Struct->Mode) { /* 在灭状态 */ if(SL_STATUS_OFF == SL_Struct->Status) { SL_Struct->Counter++; if(SL_Struct->Counter >= SL_Struct->OffTimes) { SL_Struct->Counter = 0; SL_Struct->OnFun(); //亮灯 SL_Struct->Status = SL_STATUS_ON; //状态置为"亮" } } /* 在亮状态 */ else if(SL_STATUS_ON == SL_Struct->Status) { SL_Struct->Counter++; if(SL_Struct->Counter >= SL_Struct->OnTimes) { SL_Struct->Counter = 0; SL_Struct->OffFun(); //灭灯 SL_Struct->Status = SL_STATUS_OFF; //状态置为"灭" } } else { SL_Struct->Status = SL_STATUS_OFF; //状态置为"灭" } } /* 未知模式 */ else { SL_Struct->Status = SL_STATUS_OFF; //状态置为"灭" SL_Struct->OffFun(); //灭灯 } }

最后

以上的控制LED的状态,其实是一个项目中很小的一个模块,还有更复杂的LED实现和控制方法,相信做过这一块的同学就比较了解。

当然,LED在项目中是微不足道的一个模块,但是,如果针对莫个人设计一块LED的产品,那就意义非凡了。

wKgaomUD9YOAZHufAAQgzNBWJLU314.png

上面这种,相信很多暖(zhi)男都做过,就是不知道,最终那个女孩子感动了没有?如果感动了,那这个LED项目就是一生中非常重要的项目。

审核编辑:彭菁

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • led
    led
    +关注

    关注

    237

    文章

    22450

    浏览量

    645879
  • 单片机
    +关注

    关注

    6001

    文章

    43973

    浏览量

    620854
  • 显示屏
    +关注

    关注

    28

    文章

    4228

    浏览量

    72674
  • adc
    adc
    +关注

    关注

    95

    文章

    5651

    浏览量

    539481
收藏 人收藏

    评论

    相关推荐

    Syncer模块的重要性是什么?

    我在我的项目中使用25G以太网IP。通过打开此IP的示例设计,我们可以看到许多SYNCER模块,一个FSM模块和一个流量生成器模块。我想问一下这些Syncer模块的重要性是什么,我是否需要在我的最终设计中使用所有syncer模块。
    发表于 05-18 09:25

    代码规范的重要性是什么

    论代码规范的重要性
    发表于 05-19 13:07

    STM32F4时钟树的重要性

    STM32F4时钟树时钟是单片机的心脏,重要性不言而喻,STM32F4的时钟树是比较复杂的,所以不是一言两语能写清楚的,我只简单的描述下时钟来源,详细知识需要去看正点原子的视频讲解。整个时钟来源有五
    发表于 08-11 07:40

    时钟对于单片机重要性

    时钟对于单片机来说是非常重要的,它为单片机工作提供一个稳定的机器周期从而使系统能够正常运行。时钟系统犹如人的心脏,一旦有问题整个系统就崩溃。我们知道STM32属于高级单片机,其内部有很
    发表于 08-12 06:18

    时钟的重要性

    什么是时钟?时钟是单片机运行的基础,时钟信号推动单片机内各个部分执行相应的指令。时钟系统就是CPU的脉搏,决定cpu速率,像人的心跳一样 只有有了心跳,人才能做其他的事情,而单片机有了时钟,才能够
    发表于 08-13 07:31

    Keil5创建51单片机项目中CPU显示为空怎么解决?

    Keil5创建51单片机项目中CPU显示为空怎么解决?
    发表于 10-09 08:38

    讲讲MCU选型的重要性

    博客也大半年没更新了,大半年的时间因为做着其他的项目,对蓝牙的应用少了,更换MCU等原因。忙了个大半年时间,今天突然看到博客,才想起我的博客还有许多没写。今天我就不讲技术了,讲讲MCU选型的重要性
    发表于 11-03 08:46

    UPS的重要性

    中心机房的UPS太重要了,前不久就出现过停电坏了一个磁盘陈列硬盘的事故,一个2T的硬盘坏了,还好有一个备用的硬盘使用,否则磁盘陈列里的资料就岌岌可危了。服务器多了,UPS的重要性尤其重要,学校周边
    发表于 11-16 09:09

    单片机中断的重要性

    单片机中断有什么作用打个比方,你在房间看书,看书这个事是持久的,拖延几分钟也没事。突然淘宝买的衣服送到了,镖局的人敲门,你用书签做好标记去开门。拿回衣服,回去继续看书。这个事的发生过程很正常。同样
    发表于 11-26 07:34

    arm汇编的重要性是什么?

    arm汇编的重要性是什么?
    发表于 11-30 08:03

    单片机精确计时的重要性

    的。小到手机,大到汽车飞机,现在几乎只要是电子器件,就有单片机的身影。精确计时的重要性传感器能够感知外界环境,可以说是一切智能机器的基础。实际工程中,常常使用单片机或者控制传感器工作,或者采集传感器的...
    发表于 12-07 13:18

    led单片机应用中的重要性

    很多初学者觉得自己学的东西很基础,担心今后实际工作用不到。有初学者问了这样的问题:单片机真正开发产品和学习的时候有什么差别,平时学的LED、ADC这些东西,在实际项目中会用到吗?虽然技术更...
    发表于 02-23 07:09

    单片机程序架构之时间轮片法程序架构重要性解析

    单片机程序架构—时间轮片法程序架构重要性很多人尤其是初学者在写代码的时候往往都是想一点写一点,最开始没有一个整体的规划,导致后面代码越写越乱,bug不断。最终代码跑起来看似没有问题(有可能也真的
    发表于 02-24 06:52

    Keil5创建51单片机项目中CPU显示为空

    Keil5创建51单片机项目中CPU显示为空
    发表于 11-23 16:36 12次下载
    Keil5创建51<b class='flag-5'>单片机</b><b class='flag-5'>项目中</b>CPU显示为空

    单片机项目中LED重要性~

    很多初学者觉得自己学的东西很基础,担心今后实际工作用不到。有初学者问了这样的问题:单片机真正开发产品和学习的时候有什么差别,平时学的LED、ADC这些东西,在实际项目中会用到吗?虽然技术更...
    发表于 12-29 19:28 2次下载
    <b class='flag-5'>单片机</b><b class='flag-5'>项目中</b><b class='flag-5'>LED</b>的<b class='flag-5'>重要性</b>~