99久久全国免费观看_国产一区二区三区四区五区VM_久久www人成免费看片中文_国产高清在线a视频大全_深夜福利www_日韩一级成人av

工程師單片機LED項目

很多初學者覺得自己學的東西很基礎,擔心今后實際工作用不到。有初學者問了這樣的問題:單片機真正開發產品和學習的時候有什么差別,平時學的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)
  {
    //do something
    switch(State)
    {
      case 狀態1:
        //do something
      break;

      case 狀態2:
        //do something
      break;
      ·
      ·
      ·
      case 狀態燈:
        ED_TOGGLE();  //LED閃爍
      break;
    }
  }
}

RTOS情況下,新建一個狀態燈線程,在線程里面直接控制即可:

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亮度的效果。當然,現在還有控制LED漸變的專有芯片。

但是,對于單片機項目來說,單片機自身就能實現,如果單獨用一個芯片,就顯得有點多余。

使用DAC輸出模擬量可以實現,但如果多路就不現實,因此這種方法不常見。

常見的是PWM控制IO高低電平(從而控制電壓),這種對于單片機來說有兩種方法:

  • 定時器硬件PWM
  • 控制GPIO口高低電平

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)
{
  static TickType_t xLastWakeTime;
  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();                         //滅燈
  }
}

聲明:本內容為作者獨立觀點,不代表電子星球立場。未經允許不得轉載。授權事宜與稿件投訴,請聯系:editor@netbroad.com
覺得內容不錯的朋友,別忘了一鍵三連哦!
贊 2
收藏 1
關注 211
成為作者 賺取收益
全部留言
0/200
成為第一個和作者交流的人吧
主站蜘蛛池模板: 麻豆一区二区大豆行情 | 国模私拍一区二区三区 | 高清亚洲一区 | 国产二级一片内射视频播放 | 无码免费一区二区三区免费播放 | 91亚洲国产在人线播放午夜 | 亚洲国产精品成人久久久 | 嫩草视频网 | 欧美日本久久久 | 亚洲国产欧美在线人成最新 | 免费久久久久 | 5252aⅴhaose我爱久久 | 午夜精品久久久久久不卡av | 国产亚洲欧美日韩高清 | 亚洲日韩亚洲另类激情文学 | 精品视频在线观看一区 | 69堂免费视频 | 欧美一区二区在线刺激视频 | 内射吃奶嗯嗯视频 | 4hu四虎影视入口 | 性刺激的大陆三级视频 | 老司机亚洲精品影院 | 国产不卡一级无码视频 | 肥美欧美内射中出 | 亚洲乱码一区二区三区四区 | av免费高清| 9797色| 最新国产视频 | 91精品久久久 | 亚洲成人福利 | 欧美噜噜久久久xxx 日韩av一区二区三区四区 | 精品国产鲁一鲁一区二区三区 | 久久久久久免费免费 | 国产无遮挡色视频免费观看性色 | 日韩欧美精品一区二区三区经典 | 亚洲国产精品无码专区影院 | 亚洲国产精品无码一线岛国 | 欧美激情精品久久久久久黑人 | 精品视频无码一区二区三区 | 国产亚洲综合一区柠檬导航 | 欧美三级视频日日操 |