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

2020-12-13 電子產品世界
開場白:

上一節鴻哥列出了初學者七大誤區,到底什麼才是初學者關注的核心?那就是裸機奔跑的程序結構。一個好的程序結構,本身就是一個微型的多任務作業系統。鴻哥教給大家的就是如何編寫這個簡單的作業系統。在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

{

; //一個分號相當於執行一條空語句

}

}

/* 注釋八:

* delay_long(unsigned int uiDelayLong)是大延時函數,

* 專門用在上電初始化的大延時,

* 此函數的特點是能實現比較長時間的延時,細分度取決於內嵌for循環的次數,

* uiDelayLong的數值的大小就代表裡面執行了多少次500條空指令的時間。

* 數值越大,延時越長。時間精度不要刻意去計算,感覺差不多就行。

*/

void delay_long(unsigned int uiDelayLong)

{

unsigned int i;

unsigned int j;

for(i=0;i

{

for(j=0;j<500;j++) //內嵌循環的空指令數量

{

; //一個分號相當於執行一條空語句

}

}

}

void initial_myself() //初始化單片機

{

led_dr=0; //LED滅

}

void initial_peripheral() //初始化外圍

{

; //本例為空

}

總結陳詞:

鴻哥首次提出的「三區一線」理論概況了各種項目程序的基本分區。我後續的程序就按此分區編寫。

Delay()函數的長延時適用在上電初始化。

Delay()函數的短延時適用在驅動時序的脈衝延時,此時的時間不能太長,本例中暫時沒有列出這方面的例子,在後面的章節中會提到。

在本例原始碼中,在led_flicker()閃爍應用程式裡用到的兩個延時delay,它們的延時時間都太長了,在實戰項目中肯定不能用這種延時,因為消耗的時間太長了,其它任務根本沒有機會執行。那怎麼辦呢?我們應該如何改善?欲知詳情,請聽下回分解-----累計主循環次數使LED燈閃爍。




技術專區

相關焦點

  • 第17節:兩片聯級74HC595驅動16個LED燈的基本驅動程序
    開場白:上一節講了如何把矩陣鍵盤翻譯成獨立按鍵的處理方式。這節講74HC595的驅動程序。(2)實現功能:兩片聯級的74HC595驅動的16個LED燈交叉閃爍。比如,先是第1,3,5,7,9,11,13,15八個燈亮,其它的燈都滅。然後再反過來,原來亮的就滅,原來滅的就亮。交替閃爍。
  • led燈打開後不停閃爍是什麼原因 led燈如何選擇
    燈,而led燈它佔有很多優勢,也受到人們的喜愛。有很多人在安裝LED燈以後出現燈不停在閃爍,在晚上開啟使會覺得非常嚇人。那麼led燈打開後不停閃爍是什麼原因?led燈如何選擇?接下來我們跟著小編一起來了解吧!
  • led射燈閃爍怎麼解決 led射燈使用注意事項
    很多用戶在使用led射燈之後遇到過led射燈閃爍的情況,通常造成led射燈閃爍的原因就是使用不當的情況所導致的。那麼led射燈閃爍怎麼解決呢?下面小編就來介紹還有led射燈使用注意事項。不了解的用戶們來簡單的了解一下吧。
  • 第18節:把74HC595驅動程序翻譯成類似單片機IO口直接驅動的方
    要教會大家兩個知識點:本文引用地址:http://www.eepw.com.cn/article/201611/319790.htm第一點:如何靈活運用與和非的運算符來實現位的操作。第二點:如何靈活運用一個更新變量來實現靜態刷新輸出或者靜態刷新顯示的功能。具體內容,請看原始碼講解。
  • led燈打開後不停閃爍怎麼處理最好?教你兩招就可以排查出原因
    led燈是目前很多家庭首選的燈具,但是led燈經常會出現led燈打開後不停閃爍的問題,十分煩人,今天就告訴大家遇到led燈打開後不停閃爍的問題應該怎麼處理。一修房屋快修led燈維修首選要明白,led燈打開後不停閃爍的原因有兩種可能性,第一種是線路接觸不好,燈具開關或者接頭的地方有鬆動造成的,led燈就會一直閃;第二種是led燈的驅動電源供電不足
  • 「正點原子Linux連載」第二十章高精度延時實驗
    第二十章高精度延時實驗延時函數是很常用的API函數,在前面的實驗中我們使用循環來實現延時函數,但是使用循環來實現的延時函數不準確,誤差會很大。雖然使用到延時函數的地方精度要求都不會很嚴格(要求嚴格的話就使用硬體定時器了),但是延時函數肯定是越精確越好,這樣延時函數就可以使用在某些對時許要求嚴格的場合。
  • 自製交流LED節能延時燈
    在臥室床邊的插座上插上一個延時開關燈,睡前按下開關,燈就亮了,等安排好睡下燈會自動熄滅,夜間解手也同樣方便。如果採用白色高亮度發光二極體作光源,又節能又別致。  筆者製作了一個交流LED節能延時開關燈,用了一個帶插座的電視天線放大器電源盒,一個H型節能燈線路板,外加六個元件和16隻Φ3mm白色高亮度發光二極體焊接而成,電路如圖1所示。
  • Arduino基礎入門篇05—LED照亮你的美
    可以通過這些引腳來實現數位訊號的輸入輸出。1. 實驗材料2. 實驗步驟新建sketch,拷貝如下代碼替換自動生成的代碼並進行保存。 1 5 6 7int led = 13;   8 9void setup() {10  pinMode(led, OUTPUT); 11}1213void loop() {14  digitalWrite(led,  HIGH); 15  delay(1000);  16  digitalWrite
  • 搭建第一個程序控制電路LED燈,體會C語言的魅力
    {digitalWrite(3,HIGH);//寫數字引腳, 對應引腳的高電平,點亮LED燈。delay(500);//延時500毫秒。digitalWrite(3,LOW);//寫數字引腳, 對應引腳的低電平,熄滅LED燈。delay(1000);}效果說明:LED燈連接數字管腳3,亮半秒,暗1秒。
  • led人體感應燈優勢 選購感應燈注意事項
    led人體感應燈看似很專業的術語,其實說的就是led感應燈,因為「人來燈亮,人走燈滅」,在生活中極為常見,這種燈具有著令人羨慕與心動的優勢。今日我們就來聊聊led人體感應燈的優勢與選購注意事項,究竟如何選擇才是最正確的。
  • Arduino在中斷函數裡面怎麼延時
    據資料介紹,中斷會打斷代碼的正常執行次序,所以中斷函數裡不能使用諸如millis()、 delay()等由中斷實現的延時函數。又有資料說可以使用 delayMicroseconds(),因為這個函數與中斷無關。但是試用之下,感覺似乎並沒有起到延時的作用,很可能它也不能使用。
  • 「初識Arduino - 3」PWM控制LED燈
    改變PWM的佔空比,可以改變輸出信號的平均電壓,實現模擬電壓的輸出。在Arduino UNO中,可以看到板上有指明`PWN~`,也就是帶波浪號的3, 5, 6, 9, 10, 11這些數字接口是支持PWM的,我們可以通過analogWrite(pin, value)來設置佔空比,value的取值在0-255之間(255表是100%佔空比,即LED燈最亮)。
  • 想知道led吸頂燈閃爍故障解決方法,應先排查led吸頂燈閃爍的原因
    led吸頂燈憑藉自身亮度高,造價便宜的優點,已經走進很多人的家庭裡面,雖然led吸頂燈已經是所有燈具裡面故障率最低的一種燈具了,但是故障率低不代表沒有故障,所以有時候led吸頂燈也會出現閃爍的問題,有時候還會一直閃不停,那這種問題應該怎麼解決呢,今天我們就來討論一下led吸頂燈閃爍故障解決方法
  • LED燈為什麼會閃爍?led燈閃爍是什麼原因
    LED燈的驅動器裡面都有一個電容,可以把電容理解成一個容量很小的充電電池:當電容內通過電流時,電容會持續充電——充滿電以後,電容會一次性將儲存的電能全部釋放。LED燈閃爍,就屬於後一種情況:電容充電的過程中,燈是熄滅的——由於電容內部電流較小,導致充電速度很慢,所以用肉眼是可以看到電燈熄滅的。當電容充滿電後,一次性釋放電能,會點亮電燈。
  • 用一個ne555晶片使5個藍色led燈一起閃爍
    原理很簡單,555晶片與左側的電阻、電容構成一個低頻振蕩電路,3腳按一定的頻率交替輸出高低電平,右側的5個藍色led燈就會按一定的節奏閃爍。用熱熔膠將公頭尾部粘接固定在洞洞板左側邊緣中間,尾部最上面的插腳是電源正極,最下面的插腳是電源負極。把晶片4腳和8腳連接在一起,再連接電源正極。把1腳連接電源負極。
  • 我家玄關和樓梯裝了同款led燈,可為什麼只有樓梯處關了後還閃爍
    我家玄關和樓梯裝的是同一品牌同一款led燈,可為什麼只有樓梯處的led燈關了之後,還持續閃著微光?這個問題說大也不大,除了發亮之外,也沒有帶來其他不好的影響,可就是看著煩人,尤其晚上的時候。到底是哪裡出了問題?
  • 第13節:按住一個獨立按鍵不鬆手的加速勻速觸發
    開場白:上一節講了按住一個獨立按鍵不鬆手的連續步進觸發功能,這節要教會大家如何在上一節的基礎上,略作修改,就可以實現按鍵的加速勻速觸發。當被設置參數uiSetNumber小於500的時候,LED燈滅;當大於或者等於500的時候,LED燈亮。需要注意的是:第一步:每次按下去觸發一次單擊按鍵,如果按下去到鬆手的時間不超過1秒,則不會進入連續加速觸發模式。第二步:如果按下去不鬆手的時間超過1秒,則進入連續加速觸發模式。按鍵觸發節奏不斷加快,蜂鳴器鳴叫的節奏也不斷加快。
  • PIC單片機讓一個燈閃爍程序
    具體介紹:讓一個燈閃爍,亮500ms後關閉500ms流程圖:原始碼://-----------------------------------------------------------------// 名稱: 閃爍的LED
  • led燈過亮怎麼降低亮度 led燈是什麼燈具
    燈具方面的一些情況多少人掌握的比較少,因為在於很多物品上,人們只要一開始在使用,之後都只會去使用,並不會做一些詳細的理解調查,但有時若遇到了問題,確實還得要在重新的理解,所以就不如一開始就弄明白一些狀況,這樣對自己也會有好處,那麼led燈過亮怎麼降低亮度?led燈是什麼燈具?