LED在单片机项目中的重要性!

嵌入式大杂烩 2021-12-01 21:30


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

虽然技术更新迭代很快,但有很多基本的技术,仍然在实际项目中会用到,今天就拿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的产品,那就意义非凡了。


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

------------ END ------------


往期推荐:

第一个编译器是怎么来的?

一份硬核的QT开发经验及资料分享,长文收藏!

分享一个简洁易用的嵌入式操作系统内核


点击阅读原文,查看更多分享

嵌入式大杂烩 专注于嵌入式技术,包括但不限于C/C++、嵌入式、物联网、Linux等编程学习笔记,同时,内包含大量的学习资源。欢迎关注,一同交流学习,共同进步!
评论 (0)
  •  探针台是半导体测试领域的重要设备,用于支撑和固定待测芯片,以便进行jing确的电气测试。在使用过程中,探针台可能会出现位置偏移,这时就需要进行复位操作。下面,我们将详细介绍探针台复位的zui简单三个步骤。  一、确定复位基准点复位操作的di一步是确定复位基准点。通常,探针台会配备有明确的复位标记或感应点。用户需要仔细查找并确认这些标记,确保复位操作的准确性。找到基准点后,将探针台移动到该位置附近,准备进行下一步操作。二、执行复位动作在确认基准点后,接下来需要执行复
    锦正茂科技 2025-02-15 09:36 80浏览
  •                           春天来了,我们中国的传统节日--春节到了,随着国家富强,人们民族文化自信心的增强,这个中国年过的还挺热闹,挺红火。一段山村过新年的快乐时光,即兴而发赋了两首新诗。《渔家乐·山村新春》白发垂髫同喜乐,新春佳节意情奢。烟花璀璨腾空起,山村美景醉心涯。晓雾轻笼林野静,晚云淡抹岫峰斜。自然恩赐千般好,福满人间岁月嘉
    广州铁金刚 2025-02-17 15:59 81浏览
  • 随着科技快速进步,蓝牙技术也在持续演化。Bluetooth LE Audio(低功耗蓝牙音讯)因其省电及音质提升等特性,俨然成为目前热门的音讯技术之一。对于经常性使用耳机、手机或笔电的人来说,音频传输的延迟性能不仅影响游戏体验,也同时影响着影音同步与通话质量。然而,由于目前市面上针对LE Audio延迟测试的工具和服务实属不多,厂商在验证设备性能往往面临到技术困难。有鉴于此,百佳泰所提供的专业延迟量测验证服务,可有效协助客户了解产品表现,从而提升市场竞争力!百佳泰技术小词典延迟指的是从声音讯号发
    百佳泰测试实验室 2025-02-14 10:38 74浏览
  • 电磁铁通电时会产生磁场,磁力随电流增强而增强,表现出吸引铁磁性物质的特性。电磁铁是一种能够产生磁场的装置,其特性在于可以通过通电来控制磁场的产生和消失。那么,当电磁铁通电时,它具体会表现出哪些特性和现象呢?一、产生磁场通电是电磁铁产生磁场的关键。当电流通过电磁铁的线圈时,线圈周围就会产生磁场。这个磁场与电流的大小和方向密切相关,电流越大,产生的磁场也越强。同时,磁场的方向可以通过改变电流的方向来改变,这是电磁铁灵活性的重要体现。二、磁力变化随着电流的增强,电磁铁产生的磁力也会相应增强。这种磁力的
    锦正茂科技 2025-02-15 09:59 95浏览
  • 《哪吒2》票房破百亿背后的科技密码:解码中国动画产业的技术跃迁与制造底气2024年夏季,国产动画电影《哪吒2》以雷霆之势席卷全球院线,不仅成为中国影史第二部票房突破百亿的现象级作品,更以多项技术突破刷新行业纪录。这些成就背后,不仅是中国动画工业的崛起,更是中国科技创新与高端制造业协同突破的缩影。作为深耕PCB行业多年的捷多邦小编,今天带您从技术视角,解读这场银幕奇迹背后的制造密码。一、从“数字造神”到“算力革命”:动画技术背后的硬核突破《哪吒2》的视觉革命始于AI工业化管道的深度应用。影片中大量
    捷多邦 2025-02-15 17:57 397浏览
  • 文心一言准备免费,说实话,这个是好事情,但是他也会产生非常大的影响,总体来说,对技术的发展还是起到积极的作用。文心新苑为什么要免费呢?无非就是市场的原因,绝对不是文心一言不想利用这个AI赚钱。我分析下原因:1、市场竞争:在人工智能技术高速发展的背景下,各类AI产品层出不穷,市场竞争日益激烈。尤其是DEEPSEEK的出现,真是的非常重大的一个事件,作为同类产品,文心一言非常无奈的被迫的选择全面免费策略,旨在迅速提高用户量,争夺市场份额。通过免费使用,文心一言能够吸引更多用户,形成网络效应,进而提升
    curton 2025-02-14 10:30 419浏览
  •  芯片设计中的软硬件接口概述作者: Insaf MelianeInsaf Meliane 是 Arteris 的产品管理和营销经理。在加入产品团队之前,她是一名现场应用经理,为客户提供复杂 SoC 设计集成支持。在加入 Arteris 之前,她曾在领先的半导体公司担任过其他设计和应用工程职务。Insaf 拥有法国格勒诺布尔国立高等电子与无线电工程学院微电子专业系统级芯片方面的工程学位。软硬件接口 (HSI) 在芯片设计中扮演着重要角色,用于将物理硬件与其对应软件连接起来。它为复杂的系统
    ArterisIP 2025-02-14 10:28 73浏览
  • 在设备间通信日益增长的需求中,对于十几米甚至更长距离的高速外设数据传输变得尤为重要。RS-232C接口,凭借其仅需简单的接收、发送及地线配置,以及成本效益高的双绞线连接,凭借其卓越性能,成为了连接通信接口芯片的关键纽带。为了在这种长距离高速通信场景下实现线路的可靠隔离,并有效抵御外部噪声对通信信号的干扰,虽然上一期介绍的晶体管类型输出系列光耦能够满足100kbps速率的隔离传输需求,但面对更高的速率稳定性和性能要求,业界更倾向于采用速率可达300Kbps的KL6N138和KL6N139达林顿高速
    晶台光耦 2025-02-14 13:40 49浏览
  • 导读:2025年1月6日,在 ChatGPT 诞生两周年之际,OpenAI 的核心人物 Sam Altman 回顾了一段波澜壮阔且充满挑战的历程。九年前,怀揣着对通用人工智能(AGI)的坚定信念,OpenAI 踏上征程。彼时,质疑声不绝于耳,多数人认为这毫无成功的可能。但他们未曾动摇,毅然投身这一充满未知的领域。直至 2022 年 ChatGPT 的推出,如同在科技领域投入巨石,引发轩然大波,开启了前所未有的发展态势。然而,荣耀背后是难以想象的艰难。围绕新技术构建公司,犹如在黑暗中摸索前行,每一
    用户1739588245528 2025-02-15 11:03 108浏览
  • 文心一言免费对于创业来说是一个很大的机遇,加油!虽然是一个很大的挑战,但是好处还是很大的。文心一言的免费开放为创业者提供了一个低成本甚至零成本使用先进人工智能技术的机会。在以往,创业者若想在项目中融入AI技术,往往需要支付高昂的研发或授权费用。而现在,他们可以直接利用文心一言的强大功能,如语言理解、生成能力、深度搜索等,来构建自己的产品或服务,从而显著降低创业成本。文心一言的全面免费开放为创业者提供了广阔的创新空间。创业者可以基于文心一言开发出各种创新的应用和服务,满足市场的多样化需求。例如,利
    curton 2025-02-14 13:37 279浏览
  • 近日,紫光展锐蜂窝物联网芯片V8850荣获国密一级认证,标志着展锐V8850在安全能力方面获得权威认可,位居行业领先水平。这是紫光展锐继短距物联网芯片V5663在2020获得ARM PSA Level 2认证,蜂窝物联网芯片V8811在2021年获得ARM PSA Level 1 认证后,第三次荣获安全行业权威认证。荣获国密一级安全认证,意味着紫光展锐V8850能支持智能支付、共享经济、定位追踪、安防监控、智能表计、工业DTU、公网对讲,以及车载通信终端设备上的国密升级改造,可为移动支付、短信
    紫光展锐 2025-02-14 19:26 62浏览
我要评论
0
0
点击右上角,分享到朋友圈 我知道啦
请使用浏览器分享功能 我知道啦