很多初學者覺得自己學的東西很基礎(chǔ),擔心今后實際工作用不到。有初學者問了這樣的問題:單片機真正開發(fā)產(chǎn)品和學習的時候有什么差別,平時學的LED、ADC這些東西,在實際項目中會用到嗎?
雖然技術(shù)更新迭代很快,但有很多基本的技術(shù),仍然在實際項目中會用到,今天就拿LED為例來說說吧。
LED有哪些作用?
別小看LED,它在實際生活中應(yīng)用很廣泛的。
首先就是以LED為光源的項目,比如呼吸燈、廣告燈、LED顯示屏等,這類控制LED亮滅(閃爍),或者亮度漸變。
再次就是LED背光燈,像液晶背光燈、按鍵背光燈等,這種也是需要控制LED變化的。我之前做過有按鍵的項目,按鍵背光燈需要漸變、配合音效控制LED不同頻率閃爍,目的就是為了達到更好的體驗效果。
再再次,LED作為指示燈,電源指示燈、狀態(tài)指示燈,這種就和接近初學者的學習時的LED燈,但這種卻在項目中很常見。
拿狀態(tài)指示燈來說,一個項目的LED狀態(tài)指示燈可以直觀明了的指示設(shè)備的運行狀態(tài),比如:運行、故障、待機、死機等常見狀態(tài)。通過RGB,或者紅黃綠不同顏色LED組合,可以實現(xiàn)更多狀態(tài)的指示。
下面針對LED狀態(tài)燈,說幾點細節(jié)的內(nèi)容。
LED狀態(tài)燈實現(xiàn)
這里結(jié)合代碼為大家分享一些項目中常見的LED狀態(tài)燈的實現(xiàn)方法。
1、單色LED運行狀態(tài)指示燈
通過閃爍(一亮一滅)指示設(shè)備運行的狀態(tài)的指示燈,一個關(guān)鍵作用:設(shè)備有沒有死機。
很多產(chǎn)品中都會用到,你買一個開發(fā)板,提供的綜合例程也基本都有。
裸機情況下(一般狀態(tài)機),在某一個狀態(tài)實現(xiàn)LED閃爍:
int main(void) { //系統(tǒng)初始化 while(1) { //do something 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) { static TickType_t xLastWakeTime; //初始化 xLastWakeTime = xTaskGetTickCount(); for(;;) { //do something LED_TOGGLE(); //LED閃爍 vTaskDelayUntil( xLastWakeTime, 500); } }
2、單色LED漸變
LED漸變在生活中其實也有一些場景在用,呼吸燈、鍵盤等,其實原來也很簡單,就是控制LED亮度。
控制方法有很多,電壓、PWM都能達到控制LED亮度的效果。當然,現(xiàn)在還有控制LED漸變的專有芯片。
但是,對于單片機項目來說,單片機自身就能實現(xiàn),如果單獨用一個芯片,就顯得有點多余。
使用DAC輸出模擬量可以實現(xiàn),但如果多路就不現(xiàn)實,因此這種方法不常見。
常見的是PWM控制IO高低電平(從而控制電壓),這種對于單片機來說有兩種方法:
定時器硬件PWM
控制GPIO口高低電平
a、定時器硬件PWM
一個定時器輸出PWM波形的同時,還需要一個定時器定時更新PWM輸出占空比(修改亮度)。
b、控制GPIO口高低電平
這個方法就比較簡單,控制IO口高低電平時間,只是這個時間需要結(jié)合整個項目業(yè)務(wù)邏輯(特別是裸機情況下),不能出現(xiàn)“卡機”情況。
當然,在RTOS情況下,業(yè)務(wù)邏輯就比較簡單,單獨一個線程:
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)要復雜一點,但實現(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; //當前狀態(tài) uint16_t OffTimes; //滅時間 uint16_t OnTimes; //亮時間(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) { static TickType_t xLastWakeTime; 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)體指針,是為了方便讀取并修改其中變量。
當然,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),其實是一個項目中很小的一個模塊,還有更復雜的LED實現(xiàn)和控制方法,相信做過這一塊的同學就比較了解。
當然,LED在項目中是微不足道的一個模塊,但是,如果針對莫個人設(shè)計一塊LED的產(chǎn)品,那就意義非凡了。
上面這種,相信很多暖(zhi)男都做過,就是不知道,最終那個女孩子感動了沒有?如果感動了,那這個LED項目就是一生中非常重要的項目。
審核編輯:彭菁
-
led
+關(guān)注
關(guān)注
242文章
23277瀏覽量
660896 -
單片機
+關(guān)注
關(guān)注
6037文章
44558瀏覽量
635356 -
顯示屏
+關(guān)注
關(guān)注
28文章
4488瀏覽量
74310 -
adc
+關(guān)注
關(guān)注
98文章
6498瀏覽量
544661
發(fā)布評論請先 登錄
相關(guān)推薦
評論