有初学者问了这样的问题:单片机真正开发产品和学习的时候有什么差别,平时学的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)
{
//dosomething
switch(State)
{
case 状态1:
//do something
break;
case 状态2:
//do something
break;
·
·
·
case 状态灯:
ED_TOGGLE(); //LED闪烁
break;
}
}
}
RTOS情况下,新建一个状态灯线程,在线程里面直接控制即可:
void StatusLight_Task(void *pvParameters)
{
staticTickType_txLastWakeTime;
//初始化
xLastWakeTime = xTaskGetTickCount();
for(;;)
{
//do something
LED_TOGGLE(); //LED闪烁
vTaskDelayUntil(&xLastWakeTime, 500);
}
}
2.单色LED渐变LED渐变在生活中其实也有一些场景在用,呼吸灯、键盘等,其实原来也很简单,就是控制LED亮度。
控制方法有很多,电压、PWM都能达到控制LED亮度的效果。当然,现在还有控制LED渐变的专有芯片。
但是,对于单片机项目来说,单片机自身就能实现,如果单独用一个芯片,就显得有点多余。
使用DAC输出模拟量可以实现,但如果多路就不现实,因此这种方法不常见。
常见的是PWM控制IO高低电平(从而控制电压),这种对于单片机来说有两种方法:
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)
{
staticTickType_txLastWakeTime;
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
+关注
关注
237文章
22520浏览量
646479 -
单片机
+关注
关注
6008文章
44039浏览量
622404 -
光源
+关注
关注
3文章
626浏览量
67461
原文标题:单片机“花式点灯”实现方法
文章出处:【微信号:strongerHuang,微信公众号:strongerHuang】欢迎添加关注!文章转载请注明出处。
发布评论请先 登录
相关推荐
你用过哪些编程语言开发单片机?
C语言是最常用的一种用于单片机的开发语言,也是一种高级编程语言,具有较好的可移植性和可读性。对于单片机,通常使用嵌入式C来进行开发。 举例:用C语言写一段STM32单片机点灯程序。
发表于 12-04 10:18
•424次阅读
关于LED驱动单片机引脚输出能力的问题
51单片机点灯,本来是个很简单的东西...那么问题来了,如下图
其中16根线分别接STC89C52RC_LQFP44的两组IO,请问这样可以实现吗,采用贴片LED,IO的输出能力是否足够,LED是否有可能烧毁.....
发表于 11-09 08:16
单片机、CPU未出现前电路是如何实现功能的?
感觉现在做个什么东西都会涉及到一个器件:处理器,无论是单片机还是CPU这种,数据采集、通信,逻辑判断,驱动控制都需要有个处理器来完成。
那在单片机和CPU出来之前,电路是如何实现功能的,在这之前是否
发表于 11-06 06:52
基于单片机用软件实现直流电机PWM调速系统
介绍了基于单片机用PWM实现直流电机调整的基本方法,直流电机调速的相关知识,及PWM调整的基本原理和实现方法。重点介绍了基于MCS一51
发表于 09-22 07:56
如何利用单片机、buck电路实现恒流充电?
被用来控制恒流充电过程。本文将详细介绍如何利用单片机、buck电路实现恒流充电。 一、单片机实现恒流充电 在恒流充电中,控制充电电流是非常关键的。传统的
使用STM32单片机点亮LED
传说,每一个成功的MCU(俗称单片机)开发组中,都有一名“一灯大师”,他精通所有开发板的点灯方法,对于企业引入的新开发板,总是勤学苦练,从点灯开始,快速掌握新开发板的编程要点,带领团队
发表于 06-21 11:20
•4287次阅读
评论