有初學者問了這樣的問題:單片機真正開發產品和學習的時候有什么差別,平時學的LED、ADC這些東西,在實際項目中會用到嗎?
雖然技術更新迭代很快,但有很多基本的技術,仍然在實際項目中會用到,今天就拿LED為例來說說吧。
?拿狀態指示燈來說,一個項目的LED狀態指示燈可以直觀明了的指示設備的運行狀態,比如:運行、故障、待機、死機等常見狀態。通過RGB,或者紅黃綠不同顏色LED組合,可以實現更多狀態的指示。
下面針對LED狀態燈,說幾點細節的內容。
?但是,對于單片機項目來說,單片機自身就能實現,如果單獨用一個芯片,就顯得有點多余。
使用DAC輸出模擬量可以實現,但如果多路就不現實,因此這種方法不常見。
常見的是PWM控制IO高低電平(從而控制電壓),這種對于單片機來說有兩種方法:
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高低電平(從而控制電壓),這種對于單片機來說有兩種方法:- 定時器硬件PWM
- 控制GPIO口高低電平
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
+關注
關注
243文章
24596瀏覽量
690869 -
單片機
+關注
關注
6076文章
45495瀏覽量
670380 -
光源
+關注
關注
3文章
792瀏覽量
71338
原文標題:單片機“花式點燈”實現方法
文章出處:【微信號:strongerHuang,微信公眾號:strongerHuang】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
熱點推薦
學習單片機快速方法
學習單片機的快速方法
先介紹下單片機。把單片機說成是電子信息類專業最重要的一門課程一點也不為過,你在街上看到的廣告彩燈、煙花表演、紅綠燈、自動開關門這些都可以用
發表于 01-14 07:42
單片機系統設計方法
現階段,單片機系統在軍事、民用、工業產品中的應用越來越廣泛.其硬件實現的功能是由軟件來完成,體積小巧、功能豐富、智能化程度高,而單片機最為顯著的特點是進行數據采集由于各個產業的急速發展,數據采集技術
發表于 01-06 06:23
單片機的入門準備
、修改例程,以學習板為載體,自己新建編程工程,用自己的編程思想讓外設電路實現想要的功能,程序是靈活的,每個人都有不同的編程思想,多試幾種方法,提高程序的執行效率,鍛煉自己的編程能力;
單片機進階篇
發表于 12-22 07:39
單片機系統硬件的調試方法
單片機的系統硬件調試,通常有靜態調試和動態調試兩種不同,前者是通過目測、萬能表測試、加電檢查、聯機檢查的方法,在加電于樣機之前.對樣機的型號規格,以及安裝要求等進行核對,同時檢查 電源 系統.防止
發表于 12-03 06:10
浮思特 | 智能洗衣背后的靜默力量,ABOV單片機如何實現精準控制?
ABOV(現代單片機)的長期合作代理商,浮思特科技希望通過本次技術分享,讓大家了解ABOV單片機在洗衣機控制中的關鍵技術實現。現代洗衣機是一
第1章 如何學習單片機
? 在錯誤的道路上日夜兼程,最終也無法成功,方法和思路絕對是最重要的。本章節講到的學習單片機的方法,都是作者學習單片機的無數經驗和教訓總結出來的瑰寶。通過作者前面的披荊斬棘,開辟了道路
單片機用什么封裝
單片機封裝是將芯片內部電路與外部引腳連接并包裹保護的結構,不僅影響單片機的安裝方式、適用場景,還與電路設計的緊湊性、散熱性能密切相關。不同封裝類型各有特點,適配從簡單電路到復雜系統的多樣化需求
什么單片機比較耐用
? ? ? ? 在工業控制、戶外設備、醫療儀器等場景中,單片機的耐用性直接決定了設備的穩定運行與維護成本。耐用的單片機通常具備寬溫工作范圍、強抗干擾能力、穩定的電源適應性和長壽命的硬件設計。深圳市安
單片機的儲存優點是什么
單片機作為嵌入式系統的核心,其儲存系統是實現數據存儲與程序運行的關鍵部分。與獨立存儲芯片相比,單片機的儲存單元在集成度、功耗、可靠性等方面具備獨特優勢,這些優點使其能適應從消費電子到工業控制的多樣化
用單片機怎么控制轉速
? ? ? ?在工業自動化、智能家居、機器人等領域,單片機控制電機轉速是實現精準運動控制的核心技術。通過結合硬件電路設計與軟件算法優化,單片機可根據不同應用場景靈活調整電機轉速。以下從控制方法
怎么測單片機系統頻率
單片機系統頻率是指單片機工作時的時鐘頻率,它直接影響單片機的運行速度和處理能力,準確測量系統頻率對單片機應用開發、程序調試和性能優化具有重要意義。測量
單片機怎么驅動電機?
在各類自動化設備和智能裝置中,電機是重要的執行部件,而單片機作為控制核心,需要通過特定的方式驅動電機運轉。單片機驅動電機并非直接連接即可,而是要根據電機類型和功率,搭配合適的驅動電路,才能實現穩定
單片機怎么燒程序
單片機燒程序是將編寫好的程序代碼寫入單片機內部存儲單元,讓單片機按照預設邏輯工作的過程,是單片機應用開發中不可或缺的環節。無論是簡單的燈光控制程序,還是復雜的工業控制算法,都需要通過燒
瑞薩Cortext-M85內核RA8系列單片機的串口輸出實現方法
串口是最常見的通信方式之一,也是單片機調試最常見的通信接口,也是現在的單片機必備的通信接口,目前(2024-05)最新、最強的Cortext-M85內核的RA8系列單片機也不例外。
單片機“花式點燈”實現方法
評論