延時是單片機入門必學(xué)的應(yīng)用!
1.序
上一講我們已經(jīng)實現(xiàn)點亮一盞燈,但是很多時候程序的執(zhí)行都是要死循環(huán)的,不能讓程序像是停在那里不執(zhí)行了。所以這一講在前面的原理圖基礎(chǔ)上實現(xiàn)讓LED2從點亮一段時間到熄滅一段時間再點亮一段時間如此循環(huán)下去,實現(xiàn)閃爍LED2的功能。
2.代碼普及
我們知道CPU執(zhí)行一條語句是很快的,如果我們這樣寫程序來實現(xiàn)燈的閃爍:
#include <reg52.h> sbit LED2 = P0^0; sbit ADDR2 = P1^2; sbit ADDR1 = P1^1; sbit ADDR0 = P1^0; sbit ENLED = P1^4; sbit ADDR3 = P1^3; void main() { ADDR3 = 1;//使能三八譯碼器 ENLED = 0;// ADDR2 = 1;//************************** ADDR1 = 1;//讓三八譯碼器的IO6輸出低電平 ADDR0 = 0;//************************** while (1) { LED2=0;//點亮最右端的燈 LED2=1;//熄滅最右端的燈 } }
那我們看到的現(xiàn)象就是燈一直亮著,不會閃爍。原因就是執(zhí)行“LED2=0;”把燈點亮之后執(zhí)行“LED2=1;”去熄滅,但是這個熄滅語句只持續(xù)一瞬間就循環(huán)又開始執(zhí)行“LED2=0;”了,熄滅狀態(tài)的持續(xù)時間太短我們?nèi)搜垡簿陀^察不到閃爍的現(xiàn)象。
3.延時語句
要想實現(xiàn)LED2閃爍,必須讓LED2被點亮持續(xù)一段時間,被熄滅持續(xù)一段時間,也就是IO端口保持低電平一段時間,接著跳變保持高電平一段時間,此時我們需要用上延時。
#include <reg52.h> sbit LED2 = P0^0; sbit ADDR2 = P1^2; sbit ADDR1 = P1^1; sbit ADDR0 = P1^0; sbit ENLED = P1^4; sbit ADDR3 = P1^3; void main() { unsigned int i;//定義一個16位無符號整形變量 ADDR3 = 1;//使能三八譯碼器 ENLED = 0;// ADDR2 = 1;//************************** ADDR1 = 1;//讓三八譯碼器的IO6輸出低電平 ADDR0 = 0;//************************** while (1) { LED2=0;//點亮最右端的燈 for(i=0;i<30000;i++);//延時一段時間 LED2=1;//熄滅最右端的燈 for(i=0;i<30000;i++);//延時一段時間 } }
“for(i=0;i<30000;i++);”其實就是CPU空運行讓i不斷相加到30000之后不滿足“i<30000”的判斷條件就結(jié)束這條運行代碼,接著去執(zhí)行下一條語句了,通過占用CPU的執(zhí)行時間來達(dá)到短暫的電平保持狀態(tài),也就能讓LED2亮一小段時間,接著又滅一小段時間,這樣LED2在while(1)的死循環(huán)下就實現(xiàn)不停循環(huán)的亮滅閃爍了。
4.補充
對剛?cè)腴T單片機編程的初學(xué)者來說,以前我們C語言基礎(chǔ)上機操作的時候都是只見過別人int,char的去定義變量,而在單片機入門編程中看到的都是unsigned int,unsigned char這樣定義,原因是單片機在入門的時候用的變量的取值都是0和正整數(shù)(正整數(shù)不包括0),所以才會用unsigned去定義無符號整形變量。
C語言網(wǎng)提供由在職研發(fā)工程師或ACM藍(lán)橋杯競賽優(yōu)秀選手錄制的視頻教程,并配有習(xí)題和答疑,點擊了解:
一點編程也不會寫的:零基礎(chǔ)C語言學(xué)練課程
解決困擾你多年的C語言疑難雜癥特性的C語言進(jìn)階課程
從零到寫出一個爬蟲的Python編程課程
只會語法寫不出代碼?手把手帶你寫100個編程真題的編程百練課程
信息學(xué)奧賽或C++選手的 必學(xué)C++課程
藍(lán)橋杯ACM、信息學(xué)奧賽的必學(xué)課程:算法競賽課入門課程
手把手講解近五年真題的藍(lán)橋杯輔導(dǎo)課程