有初學(xué)者問了這樣的問題:單片機(jī)真正開發(fā)產(chǎn)品和學(xué)習(xí)的時候有什么差別,平時學(xué)的LED、ADC這些東西,在實際項目中會用到嗎?
雖然技術(shù)更新迭代很快,但有很多基本的技術(shù),仍然在實際項目中會用到,今天就拿LED為例來說說吧。
?拿狀態(tài)指示燈來說,一個項目的LED狀態(tài)指示燈可以直觀明了的指示設(shè)備的運行狀態(tài),比如:運行、故障、待機(jī)、死機(jī)等常見狀態(tài)。通過RGB,或者紅黃綠不同顏色LED組合,可以實現(xiàn)更多狀態(tài)的指示。
下面針對LED狀態(tài)燈,說幾點細(xì)節(jié)的內(nèi)容。
?但是,對于單片機(jī)項目來說,單片機(jī)自身就能實現(xiàn),如果單獨用一個芯片,就顯得有點多余。
使用DAC輸出模擬量可以實現(xiàn),但如果多路就不現(xiàn)實,因此這種方法不常見。
常見的是PWM控制IO高低電平(從而控制電壓),這種對于單片機(jī)來說有兩種方法:
LED有哪些作用
別小看LED,它在實際生活中應(yīng)用很廣泛的。 首先就是以LED為光源的項目,比如呼吸燈、廣告燈、LED顯示屏等,這類控制LED亮滅(閃爍),或者亮度漸變。 再次就是LED背光燈,像液晶背光燈、按鍵背光燈等,這種也是需要控制LED變化的。我之前做過有按鍵的項目,按鍵背光燈需要漸變、配合音效控制LED不同頻率閃爍,目的就是為了達(dá)到更好的體驗效果。 再再次,LED作為指示燈,電源指示燈、狀態(tài)指示燈,這種就和接近初學(xué)者的學(xué)習(xí)時的LED燈,但這種卻在項目中很常見。
LED狀態(tài)燈實現(xiàn)
這里結(jié)合代碼為大家分享一些項目中常見的LED狀態(tài)燈的實現(xiàn)方法。 1.單色LED運行狀態(tài)指示燈通過閃爍(一亮一滅)指示設(shè)備運行的狀態(tài)的指示燈,一個關(guān)鍵作用:設(shè)備有沒有死機(jī)。 很多產(chǎn)品中都會用到,你買一個開發(fā)板,提供的綜合例程也基本都有。 裸機(jī)情況下(一般狀態(tài)機(jī)),在某一個狀態(tài)實現(xiàn)LED閃爍:
int main(void)
{
//系統(tǒng)初始化
while(1)
{
//dosomething
switch(State)
{
case 狀態(tài)1:
//do something
break;
case 狀態(tài)2:
//do something
break;
·
·
·
case 狀態(tài)燈:
ED_TOGGLE(); //LED閃爍
break;
}
}
}
RTOS情況下,新建一個狀態(tài)燈線程,在線程里面直接控制即可:
void StatusLight_Task(void *pvParameters)
{
staticTickType_txLastWakeTime;
//初始化
xLastWakeTime = xTaskGetTickCount();
for(;;)
{
//do something
LED_TOGGLE(); //LED閃爍
vTaskDelayUntil(&xLastWakeTime, 500);
}
}
2.單色LED漸變LED漸變在生活中其實也有一些場景在用,呼吸燈、鍵盤等,其實原來也很簡單,就是控制LED亮度。
控制方法有很多,電壓、PWM都能達(dá)到控制LED亮度的效果。當(dāng)然,現(xiàn)在還有控制LED漸變的專有芯片。
- 定時器硬件PWM
- 控制GPIO口高低電平
LED_ON();
vTaskDelay(TimesON);
LED_OFF();
vTaskDelay(TimesOFF);
這里TimesON 和TimesOFF是需要結(jié)合項目情況修改的變量(比如漸變時間)。
3.多色LED,多種運行狀態(tài)一個設(shè)備在沒有顯示屏指示狀態(tài)的時候,通過LED指示狀態(tài)也是一種方法,比如:紅、黃、綠三色,分別常滅、常亮、閃爍三種狀態(tài)。
這種相對第一種單色固定狀態(tài)要復(fù)雜一點,但實現(xiàn)起來也不難,方法也有很多。
這里分享一些思路:創(chuàng)建一個線程,一個結(jié)構(gòu)體,輪詢各種LED狀態(tài),根據(jù)應(yīng)用修改其各種狀態(tài),以及閃爍時間等。
LED狀態(tài)結(jié)構(gòu)體:
typedef struct
{
uint8_t Mode; //模式
uint8_t Status; //當(dāng)前狀態(tài)
uint16_t OffTimes; //滅時間
uint16_t OnTimes; //亮?xí)r間(ms)
uint16_t Counter; //計數(shù)(計時)
void (*OffFun)(void); //滅函數(shù)接口
void (*OnFun)(void); //亮函數(shù)接口
}SL_TypeDef;
/* 狀態(tài)燈 */
LED狀態(tài)主線程:
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);
}
}
這里結(jié)構(gòu)體也是方便統(tǒng)一管理,其中SL_Scan瀏覽(掃描)函數(shù)的參數(shù)通過傳遞結(jié)構(gòu)體指針,是為了方便讀取并修改其中變量。
當(dāng)然,SL_Scan瀏覽函數(shù)具體實現(xiàn),就與你應(yīng)用有關(guān):
static void SL_Scan(SL_TypeDef *SL_Struct)
{
/* 常滅模式 */
if(SL_MODE_OFF == SL_Struct->Mode)
{
SL_Struct->Status = SL_STATUS_OFF; //狀態(tài)置為"滅"
SL_Struct->OffFun(); //滅燈
}
/* 常亮模式 */
else if(SL_MODE_ON == SL_Struct->Mode)
{
SL_Struct->Status = SL_STATUS_ON; //狀態(tài)置為"亮"
SL_Struct->OnFun(); //亮燈
}
/* 閃爍模式 */
else if(SL_MODE_FLICKER == SL_Struct->Mode)
{
/* 在滅狀態(tài) */
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; //狀態(tài)置為"亮"
}
}
/* 在亮狀態(tài) */
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; //狀態(tài)置為"滅"
}
}
else
{
SL_Struct->Status = SL_STATUS_OFF; //狀態(tài)置為"滅"
}
}
/* 未知模式 */
else
{
SL_Struct->Status = SL_STATUS_OFF; //狀態(tài)置為"滅"
SL_Struct->OffFun(); //滅燈
}
}
最后
以上的控制LED的狀態(tài),其實是一個項目中很小的一個模塊,還有更復(fù)雜的LED實現(xiàn)和控制方法,相信做過這一塊的同學(xué)就比較了解。 當(dāng)然,LED在項目中是微不足道的一個模塊,但要做到兼容項目,又方便移植、又可刪減增加功能,其實也不是想象的那么簡單。
審核編輯 :李倩
聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。
舉報投訴
-
led
+關(guān)注
關(guān)注
242文章
23848瀏覽量
674309 -
單片機(jī)
+關(guān)注
關(guān)注
6067文章
44992瀏覽量
650688 -
光源
+關(guān)注
關(guān)注
3文章
745瀏覽量
69982
原文標(biāo)題:單片機(jī)“花式點燈”實現(xiàn)方法
文章出處:【微信號:strongerHuang,微信公眾號:strongerHuang】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
相關(guān)推薦
熱點推薦
瑞薩RA8D1單片機(jī)IO中斷配置實現(xiàn)方法
本文為結(jié)合瑞薩e2 studio工具,以及CPKCOR_RA8D1B評估板,給大家講述瑞薩RA8D1單片機(jī)IO中斷配置實現(xiàn)的方法。

單片機(jī)Debug工具性能對比 單片機(jī)調(diào)試常用命令
單片機(jī)(Microcontroller Unit, MCU)調(diào)試是嵌入式開發(fā)中的一個重要環(huán)節(jié),它幫助開發(fā)者發(fā)現(xiàn)和修復(fù)代碼中的錯誤,優(yōu)化程序性能。不同的單片機(jī)和開發(fā)環(huán)境可能使用不同的調(diào)試工具和命令
使用單片機(jī)實現(xiàn)直流電機(jī)的PWM調(diào)速控制原理圖
使用單片機(jī)實現(xiàn)直流電機(jī)的PWM調(diào)速控制
發(fā)表于 12-10 15:29
?6次下載
上位機(jī)如何實現(xiàn)發(fā)送參數(shù)給單片機(jī),單片機(jī)保存接收的參數(shù)重復(fù)運行指定的功能
簡單說明一下發(fā)這個貼子/問答的原因,很早以前就想實現(xiàn)這個功能了,但是一直沒有找到好的方法,也沒有什么思路,所以發(fā)帖問一問大佬們,希望大佬們指點一二。
需求/功能 描述:
上位機(jī)部分主要是設(shè)定一些參數(shù)
發(fā)表于 12-04 08:19
單片機(jī)調(diào)試常見問題與解決方法
燒錄到單片機(jī)時,燒錄軟件顯示無法與單片機(jī)通信。 解決方法: 檢查單片機(jī)的電源是否正常,確保電源電壓在規(guī)定的范圍內(nèi)。 檢查燒錄線的連接是否正確,包括數(shù)據(jù)線和地線。 確認(rèn)燒錄軟件是否選擇了
如何實現(xiàn)51單片機(jī)與PC機(jī)的串行通信
51單片機(jī)與PC機(jī)的串行通信是一種常見的通信方式,它允許單片機(jī)通過串行接口與PC機(jī)進(jìn)行數(shù)據(jù)交換。這種通信方式在嵌入式系統(tǒng)、工業(yè)控制、物聯(lián)網(wǎng)等領(lǐng)域有著廣泛的應(yīng)用。以下是
單片機(jī)怎么寫入程序
單片機(jī)(Microcontroller Unit,MCU)是一種集成電路芯片,它將計算機(jī)的CPU、存儲器、輸入/輸出接口等功能集成在一個芯片上。單片機(jī)廣泛應(yīng)用于嵌入式系統(tǒng)和物聯(lián)網(wǎng)設(shè)備中。編寫單片機(jī)
單片機(jī)的中斷機(jī)制
單片機(jī)的中斷機(jī)制是一種重要的處理方式,它允許單片機(jī)在執(zhí)行主程序的過程中,能夠暫停當(dāng)前任務(wù),轉(zhuǎn)而處理外部或內(nèi)部緊急事件。這種機(jī)制極大地提高了系統(tǒng)的響應(yīng)速度和處理能力,使得單片機(jī)在各種應(yīng)用領(lǐng)域中得到廣泛應(yīng)用。以下是對
單片機(jī)基本io功能調(diào)試過程
所使用的單片機(jī)型號以及需要調(diào)試的IO口。不同型號的單片機(jī)在IO口的配置和特性上可能有所不同。 查閱單片機(jī)手冊 : 查閱單片機(jī)的手冊或數(shù)據(jù)手冊,了解IO口的配置
單片機(jī)燒錄程序用什么軟件
單片機(jī)燒錄程序是單片機(jī)開發(fā)過程中的一個重要環(huán)節(jié),涉及到將編寫好的程序代碼通過燒錄器寫入單片機(jī)的ROM中,以實現(xiàn)對單片機(jī)的控制。 燒錄器的類型
單片機(jī)燒錄程序的線比單片機(jī)上的少還能燒錄嗎
的存儲器通常分為兩類:ROM(只讀存儲器)和RAM(隨機(jī)存取存儲器)。ROM用于存儲程序代碼,而RAM用于存儲程序運行過程中的數(shù)據(jù)。燒錄過程就是將程序代碼寫入ROM中。 單片機(jī)燒錄方法 單片機(jī)燒錄的
單片機(jī)燒錄程序的基本步驟是什么
單片機(jī)燒錄程序是單片機(jī)開發(fā)過程中非常重要的一步,它涉及到將編寫好的程序代碼通過一定的方式傳輸?shù)?b class='flag-5'>單片機(jī)內(nèi)部的存儲器中,使單片機(jī)能夠按照預(yù)定的邏輯執(zhí)行任務(wù)。 一、硬件準(zhǔn)備
單片機(jī)boot0和boot1怎么設(shè)置
單片機(jī)的啟動模式通常包括從內(nèi)部ROM啟動、從外部ROM啟動、從外部Flash啟動等。 不同的啟動模式對應(yīng)不同的Boot0和Boot1設(shè)置。 Boot0和Boot1的設(shè)置方法 Boot0和Boot1通常通過
單片機(jī)中的幾種環(huán)形緩沖區(qū)的分析和實現(xiàn)
單片機(jī)中的幾種環(huán)形緩沖區(qū)的分析和實現(xiàn)一、簡介環(huán)形緩沖區(qū)(RingBuffer)是一種高效的使用內(nèi)存的方法,它將一段固定長度的內(nèi)存看成一個環(huán)形結(jié)構(gòu),用于存儲數(shù)據(jù),能夠避免使用動態(tài)申請內(nèi)存導(dǎo)致的內(nèi)存碎片

藍(lán)牙模塊如何實現(xiàn)單片機(jī)和手機(jī)端數(shù)據(jù)互傳
藍(lán)牙模塊實現(xiàn)單片機(jī)和手機(jī)端數(shù)據(jù)互傳的過程可以分為以下幾個步驟: 硬件準(zhǔn)備 : 確保你有一個支持藍(lán)牙通信的單片機(jī)開發(fā)板,如Arduino、Raspberry Pi等。 準(zhǔn)備一個兼容的藍(lán)牙模塊,如

評論