很多初學(xué)者覺得自己學(xué)的東西很基礎(chǔ),擔(dān)心今后實(shí)際工作用不到。有初學(xué)者問了這樣的問題:單片機(jī)真正開發(fā)產(chǎn)品和學(xué)習(xí)的時(shí)候有什么差別,平時(shí)學(xué)的LED、ADC這些東西,在實(shí)際項(xiàng)目中會(huì)用到嗎? 雖然技術(shù)更新迭代很快,但有很多基本的技術(shù),仍然在實(shí)際項(xiàng)目中會(huì)用到,今天就拿LED為例來說說吧。
01
LED有哪些作用?別小看LED,它在實(shí)際生活中應(yīng)用很廣泛的。
首先就是以LED為光源的項(xiàng)目,比如呼吸燈、廣告燈、LED顯示屏等,這類控制LED亮滅(閃爍),或者亮度漸變。
其次是LED背光燈,像液晶背光燈、按鍵背光燈等,這種也是需要控制LED變化的。我之前做過有按鍵的項(xiàng)目,按鍵背光燈需要漸變、配合音效控制LED不同頻率閃爍,目的就是為了達(dá)到更好的體驗(yàn)效果。
再次是LED作為指示燈,電源指示燈、狀態(tài)指示燈,這種就和接近初學(xué)者的學(xué)習(xí)時(shí)的LED燈,但這種卻在項(xiàng)目中很常見。
拿狀態(tài)指示燈來說,一個(gè)項(xiàng)目的LED狀態(tài)指示燈可以直觀明了的指示設(shè)備的運(yùn)行狀態(tài),比如:運(yùn)行、故障、待機(jī)、死機(jī)等常見狀態(tài)。通過RGB,或者紅黃綠不同顏色LED組合,可以實(shí)現(xiàn)更多狀態(tài)的指示。
下面針對(duì)LED狀態(tài)燈,說幾點(diǎn)細(xì)節(jié)的內(nèi)容。
02
LED狀態(tài)燈的實(shí)現(xiàn)
這里結(jié)合代碼為大家分享一些項(xiàng)目中常見的LED狀態(tài)燈的實(shí)現(xiàn)方法。
單色LED運(yùn)行狀態(tài)指示燈:
通過閃爍(一亮一滅)指示設(shè)備運(yùn)行的狀態(tài)的指示燈,一個(gè)關(guān)鍵作用:設(shè)備有沒有死機(jī)。
很多產(chǎn)品中都會(huì)用到,你買一個(gè)開發(fā)板,提供的綜合例程也基本都有。
裸機(jī)情況下(一般狀態(tài)機(jī)),在某一個(gè)狀態(tài)實(shí)現(xiàn)LED閃爍:
RTOS情況下,新建一個(gè)狀態(tài)燈線程,在線程里面直接控制即可:int main(void){//系統(tǒng)初始化while(1){//dosomethingswitch(State){case 狀態(tài)1://do somethingbreak;case 狀態(tài)2://do somethingbreak;···case 狀態(tài)燈:ED_TOGGLE(); //LED閃爍break;}}}
?
void StatusLight_Task(void *pvParameters){staticTickType_txLastWakeTime;//初始化xLastWakeTime=xTaskGetTickCount();for(;;){//dosomethingLED_TOGGLE(); //LED閃爍vTaskDelayUntil(&xLastWakeTime, 500);}}
03
單色LED漸變
LED漸變?cè)谏钪衅鋵?shí)也有一些場(chǎng)景在用,呼吸燈、鍵盤等,其實(shí)原來也很簡(jiǎn)單,就是控制LED亮度。
控制方法有很多,電壓、PWM都能達(dá)到控制LED亮度的效果。當(dāng)然,現(xiàn)在還有控制LED漸變的專有芯片。
但是,對(duì)于單片機(jī)項(xiàng)目來說,單片機(jī)自身就能實(shí)現(xiàn),如果單獨(dú)用一個(gè)芯片,就顯得有點(diǎn)多余。 使用DAC輸出模擬量可以實(shí)現(xiàn),但如果多路就不現(xiàn)實(shí),因此這種方法不常見。 常見的是PWM控制IO高低電平(從而控制電壓),這種對(duì)于單片機(jī)來說有兩種方法:
-
定時(shí)器硬件PWM
-
控制GPIO口高低電平
a. 定時(shí)器硬件PWM:一個(gè)定時(shí)器輸出PWM波形的同時(shí),還需要一個(gè)定時(shí)器定時(shí)更新PWM輸出占空比(修改亮度)。
b. 控制GPIO口高低電平:這個(gè)方法就比較簡(jiǎn)單,控制IO口高低電平時(shí)間,只是這個(gè)時(shí)間需要結(jié)合整個(gè)項(xiàng)目業(yè)務(wù)邏輯(特別是裸機(jī)情況下),不能出現(xiàn)“卡機(jī)”情況。
當(dāng)然,在RTOS情況下,業(yè)務(wù)邏輯就比較簡(jiǎn)單,單獨(dú)一個(gè)線程:
這里TimesON和TimesOFF是需要結(jié)合項(xiàng)目情況修改的變量(比如漸變時(shí)間)。LED_ON();vTaskDelay(TimesON);LED_OFF();vTaskDelay(TimesOFF);
04
多色LED,多種運(yùn)行狀態(tài)
一個(gè)設(shè)備在沒有顯示屏指示狀態(tài)的時(shí)候,通過LED指示狀態(tài)也是一種方法,比如:紅、黃、綠三色,分別常滅、常亮、閃爍三種狀態(tài)。
這種相對(duì)第一種單色固定狀態(tài)要復(fù)雜一點(diǎn),但實(shí)現(xiàn)起來也不難,方法也有很多。
這里分享一些思路:創(chuàng)建一個(gè)線程,一個(gè)結(jié)構(gòu)體,輪詢各種LED狀態(tài),根據(jù)應(yīng)用修改其各種狀態(tài),以及閃爍時(shí)間等。
LED狀態(tài)結(jié)構(gòu)體:
typedef struct{uint8_tMode;//模式uint8_t Status; //當(dāng)前狀態(tài)uint16_t OffTimes; //滅時(shí)間uint16_t OnTimes; //亮?xí)r間(ms)uint16_tCounter;//計(jì)數(shù)(計(jì)時(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ù)具體實(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(); //滅燈}}
05
最后以上的控制LED的狀態(tài),其實(shí)是一個(gè)項(xiàng)目中很小的一個(gè)模塊,還有更復(fù)雜的LED實(shí)現(xiàn)和控制方法,相信做過這一塊的同學(xué)就比較了解。 當(dāng)然,LED在項(xiàng)目中是微不足道的一個(gè)模塊,但是,如果針對(duì)莫個(gè)人設(shè)計(jì)一塊LED的產(chǎn)品,那就意義非凡了。
上面這種,相信很多暖(zhi)男都做過,就是不知道,最終那個(gè)女孩子感動(dòng)了沒有?如果感動(dòng)了,那這個(gè)LED項(xiàng)目就是一生中非常重要的項(xiàng)目。
責(zé)任編輯:haq
-
led
+關(guān)注
關(guān)注
243文章
24334瀏覽量
684737 -
單片機(jī)
+關(guān)注
關(guān)注
6071文章
45266瀏覽量
660943 -
光源
+關(guān)注
關(guān)注
3文章
770瀏覽量
70866
原文標(biāo)題:只會(huì)用單片機(jī)點(diǎn)燈,很丟人嗎?
文章出處:【微信號(hào):gh_c472c2199c88,微信公眾號(hào):嵌入式微處理器】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
什么單片機(jī)比較耐用
怎么測(cè)單片機(jī)系統(tǒng)頻率
單片機(jī)怎么驅(qū)動(dòng)電機(jī)?
單片機(jī)怎么燒程序
單片機(jī)和伺服有什么區(qū)別
PLC和單片機(jī)到底有什么區(qū)別?
單片機(jī)中斷技術(shù)詳解
單片機(jī)在電子技術(shù)中的應(yīng)用及發(fā)展
AFE4400的30管腳CLKOUT有什么作用,他需要和單片機(jī)相連嗎?連接到哪?
單片機(jī)Debug工具性能對(duì)比 單片機(jī)調(diào)試常用命令
51單片機(jī)中為什么很少出現(xiàn)printf的身影

單片機(jī)中LED有哪些作用
評(píng)論