【51程式設計經驗筆記】第二節:鴻哥的三區一線理論 & delay()延時實現LED燈的閃爍

FBshark發表於2024-12-07

第二節:delay()延時實現LED燈的閃爍。

開場白:
上一節鴻哥列出了初學者七大誤區,到底什麼才是初學者關注的核心?那就是裸機奔跑的程式結構。一個好的程式結構,本身就是一個微型的多工作業系統。鴻哥教給大家的就是如何編寫這個簡單的作業系統。在main函式迴圈中用switch語句實現多工並行處理的任務切換,再外加一個定時器中斷,這兩者的結合就是鴻哥多年來所有實戰專案的核心。鴻哥的程式結構看似簡單,實際上就是那麼簡單。大家不用著急,本篇連載文章現在才正式開始,這一節我要教會大家兩個知識點:
第一點:鴻哥首次提出的“三區一線”理論。此理論把程式程式碼分成三個區,一個延時分割線。
第二點:delay()延時的用途。

(1)硬體平臺:基於朱兆祺51微控制器學習板。

(2)實現功能:讓一個LED閃爍。

(3)原始碼講解如下:

#include "REG52.H"

void initial_myself();    
void initial_peripheral();

void delay_short(unsigned int uiDelayshort);
void delay_long(unsigned int uiDelaylong);
void led_flicker();

/* 註釋一:
* 吳堅鴻個人的命名風格:凡是輸出字尾都是_dr,凡是輸入字尾都是_sr。
* dr代表drive驅動,sr代表sensor感應器
*/
sbit led_dr=P3^5;  

void main()  //學習要點:深刻理解鴻哥首次提出的三區一線理論
  {
/* 註釋二:
* initial_myself()函式屬於鴻哥三區一線理論的第一區,
* 專門用來初始化微控制器自己的暫存器以及個別外圍要求響應速度快的輸出裝置,
* 防止剛上電之後,由於輸出IO口電平狀態不確定而導致外圍裝置誤動作,
* 比如繼電器的誤動作等等。 
*/
   initial_myself();

/* 註釋三:
* 此處的delay_long()延時函式屬於第一區與第二區的分割線,
* 延時時間一般是0.3秒到2秒之間,等待外圍晶片和模組上電穩定。
* 比如液晶模組,AT24C02儲存晶片,DS1302時鐘晶片,
* 這類晶片有個特點,一般都是跟微控制器進行串列埠或並口通訊的,
* 並且不要求上電立即處理的。
*/
   delay_long(100);

/* 註釋四:
* initial_peripheral()函式屬於鴻哥三區一線理論的第二區,
* 專門用來初始化不要求上電立即處理的外圍晶片和模組.
* 比如液晶模組,AT24C02儲存晶片,DS1302時鐘晶片。
* 本程式基於朱兆祺51微控制器學習板。
*/
   initial_peripheral();

/* 註釋五:
* while(1){}主函式迴圈區屬於鴻哥三區一線理論的第三區,
* 專門用來編寫被迴圈掃描到的非中斷應用程式
*/
   while(1)
   {
      led_flicker();   //LED閃爍應用程式
   }

}

void led_flicker() //LED閃爍應用程式
{
  led_dr=1;  //LED亮
  delay_short(50000);  //延時50000個空指令的時間

/* 註釋六:
* delay_long(100)延時50000個空指令的時間,因為內嵌了一個500次的for迴圈
*/
  led_dr=0;  //LED滅
  delay_long(100);    //延時50000個空指令的時間  
}


/* 註釋七:
* delay_short(unsigned int uiDelayShort)是小延時函式,
* 專門用在時序驅動的小延時,一般uiDelayShort的數值取10左右,
* 最大一般也不超過100.本例為了解釋此函式的特點,取值範圍超過100。
* 此函式的特點是時間的細分度高,延時時間不宜過長。uiDelayShort數值
* 的大小就代表裡面執行了多少條空指令的時間。數值越大,延時越長。
* 時間精度不要刻意去計算,感覺差不多就行。
*/
void delay_short(unsigned int uiDelayShort) 
{
   unsigned int i;  
   for(i=0;i<uiDelayShort;i++)
   {
     ;   //一個分號相當於執行一條空語句
   }
}


/* 註釋八:
* delay_long(unsigned int uiDelayLong)是大延時函式,
* 專門用在上電初始化的大延時,
* 此函式的特點是能實現比較長時間的延時,細分度取決於內嵌for迴圈的次數,
* uiDelayLong的數值的大小就代表裡面執行了多少次500條空指令的時間。
* 數值越大,延時越長。時間精度不要刻意去計算,感覺差不多就行。
*/
void delay_long(unsigned int uiDelayLong)
{
   unsigned int i;
   unsigned int j;
   for(i=0;i<uiDelayLong;i++)
   {
      for(j=0;j<500;j++)  //內嵌迴圈的空指令數量
          {
             ; //一個分號相當於執行一條空語句
          }
   }
}



void initial_myself()  //初始化微控制器
{
  led_dr=0;  //LED滅
}
void initial_peripheral() //初始化外圍
{
  ;   //本例為空
}



總結陳詞:
鴻哥首次提出的“三區一線”理論概況了各種專案程式的基本分割槽。我後續的程式就按此分割槽編寫。
Delay()函式的長延時適用在上電初始化。
Delay()函式的短延時適用在驅動時序的脈衝延時,此時的時間不能太長,本例中暫時沒有列出這方面的例子,在後面的章節中會提到。
在本例原始碼中,在led_flicker()閃爍應用程式裡用到的兩個延時delay,它們的延時時間都太長了,在實戰專案中肯定不能用這種延時,因為消耗的時間太長了,其它任務根本沒有機會執行。那怎麼辦呢?我們應該如何改善?欲知詳情,請聽下回分解-----累計主迴圈次數使LED燈閃爍。

(未完待續,下節更精彩,不要走開哦)

本文轉載自:

https://blog.csdn.net/yuanmeixiang/article/details/53990191

相關文章