OK,不扯了,再扯成水貼了。
這些東西都是很久以前寫的,再次從硬盤里翻了出來,希望對(duì)想更進(jìn)一步學(xué)習(xí)的童鞋有些幫助。
從這一章開始,我們開始邁入單片機(jī)的世界。在我們開始這一章具體的學(xué)習(xí)之前,有必要給大家先說明一下。在以后的系列文章中,我們將以51內(nèi)核的單片機(jī)為載體,C語言為編程語言,開發(fā)環(huán)境為KEIL uv3。至于為什么選用C語言開發(fā),好處不言而喻,開發(fā)速度快,效率高,代碼可復(fù)用率高,結(jié)構(gòu)清晰,尤其是在大型的程序中,而且隨著編譯器的不斷升級(jí),其編譯后的代碼大小與匯編語言的差距越來越小。而關(guān)于C語言和匯編之爭(zhēng),就像那個(gè)啥,每隔一段時(shí)間總會(huì)有人挑起這個(gè)話題,如果你感興趣,可以到網(wǎng)上搜索相關(guān)的帖子自行閱讀。不是說匯編不重要,在很多對(duì)時(shí)序要求非常高的場(chǎng)合,需要利用匯編語言和C語言混合編程才能夠滿足系統(tǒng)的需求。在我們學(xué)習(xí)掌握C語言的同時(shí),也還需要利用閑余的時(shí)間去學(xué)習(xí)了解匯編語言。
1.從點(diǎn)亮LED(發(fā)光二極管)開始
在市面上眾多的單片機(jī)學(xué)習(xí)資料中,最基礎(chǔ)的實(shí)驗(yàn)無疑于點(diǎn)亮LED了,即控制單片機(jī)的I/O的電平的變化。
如同如下實(shí)例代碼一般
void main(void)
{
LedInit() ;
While(1)
{
LED = ON ;
DelayMs(500) ;
LED = OFF ;
DelayMs(500) ;
}
}
程序很簡(jiǎn)單,從它的結(jié)構(gòu)可以看出,LED先點(diǎn)亮500MS,然后熄滅500MS,如此循環(huán)下去,形成的效果就是LED以1HZ的頻率進(jìn)行閃爍。下面讓我們分析上面的程序有沒有什么問題。
看來看出,好像很正常的啊,能有什么問題呢?這個(gè)時(shí)候我們應(yīng)該換一個(gè)思路去想了。試想,整個(gè)程序除了控制LED = ON ; LED = OFF; 這兩條語句外,其余的時(shí)間,全消耗在了DelayMs(500)這兩個(gè)函數(shù)上。而在實(shí)際應(yīng)用系統(tǒng)中是沒有哪個(gè)系統(tǒng)只閃爍一只LED就其它什么事情都不做了的。因此,在這里我們要想辦法,把CPU解放出來,讓它不要白白浪費(fèi)500MS的延時(shí)等待時(shí)間。寧可讓它一遍又一遍的掃描看有哪些任務(wù)需要執(zhí)行,也不要讓它停留在某個(gè)地方空轉(zhuǎn)消耗CPU時(shí)間。
從上面我們可以總結(jié)出
(1)
無論什么時(shí)候我們都要以實(shí)際應(yīng)用的角度去考慮程序的編寫。
(2)
無論什么時(shí)候都不要讓CPU白白浪費(fèi)等待,尤其是延時(shí)(超過1MS)這樣的地方。
下面讓我們從另外一個(gè)角度來考慮如何點(diǎn)亮一顆LED。
先看看我們的硬件結(jié)構(gòu)是什么樣子的。
以我手頭擁有的板子為例。就以它的實(shí)際硬件連接圖來分析吧。如下圖所示
一般的LED的正常發(fā)光電流為10~20MA而低電流LED的工作電流在2mA以下(亮度與普通發(fā)光管相同)。在上圖中我們可知,當(dāng)Q1~Q8引腳上面的電平為低電平時(shí),LED發(fā)光。通過LED的電流約為(VCC - Vd)/ RA2 。其中Vd為L(zhǎng)ED導(dǎo)通后的壓降,約為1.7V左右。這個(gè)導(dǎo)通壓降根據(jù)LED顏色的不同,以及工作電流的大小的不同,會(huì)有一定的差別。下面一些參數(shù)是網(wǎng)上有人測(cè)出來的,供大家參考。
紅色的壓降為1.82-1.88V,電流5-8mA,
綠色的壓降為1.75-1.82V,電流3-5mA,
橙色的壓降為1.7-1.8V,電流3-5mA
蘭色的壓降為3.1-3.3V,電流8-10mA,
白色的壓降為3-3.2V,電流10-15mA,
(供電電壓5V,LED直徑為5mm)74HC573真值表如下:
2010-11-30 19:49 上傳
下載附件 (16.72 KB)
通過這個(gè)真值表我們可以看出。當(dāng)OutputEnable引腳接低電平的時(shí)候,并且LatchEnable引腳為高電平的時(shí)候,Q端電平與D端電平相同。結(jié)合我們的LED硬件連接圖可以知道LED_CS端為高電平時(shí)候,P0口電平的變化即Q端的電平的變化,進(jìn)而引起LED的亮滅變化。由于單片機(jī)的驅(qū)動(dòng)能力有限,在此,74HC573的主要作用就是起一個(gè)輸出驅(qū)動(dòng)的作用。需要注意的是,通過74HC573的最大電流是有限制的,否則可能會(huì)燒壞74HC573這個(gè)芯片。
上面這個(gè)圖是從74HC573的DATASHEET中截取出來的,從上可以看出,每個(gè)引腳允許通過的最大電流為35mA 整個(gè)芯片允許通過的最大電流為75mA。在我們?cè)O(shè)計(jì)相應(yīng)的驅(qū)動(dòng)電路時(shí)候,這些參數(shù)是相當(dāng)重要的,而且是最容易被初學(xué)者所忽略的地方。同時(shí)在設(shè)計(jì)的時(shí)候,要留出一定量的余量出來,不能說單個(gè)引腳允許通過的電流為35mA,你就設(shè)計(jì)為35mA,這個(gè)時(shí)候你應(yīng)該把設(shè)計(jì)的上限值定在20mA左右才能保證能夠穩(wěn)定的工作。
(設(shè)計(jì)相應(yīng)驅(qū)動(dòng)電路時(shí)候,應(yīng)該仔細(xì)閱讀芯片的數(shù)據(jù)手冊(cè),了解每個(gè)引腳的驅(qū)動(dòng)能力,以及整個(gè)芯片的驅(qū)動(dòng)能力)
了解了相應(yīng)的硬件后,我們?cè)賮砭帉戲?qū)動(dòng)程序。
首先定義LED的接口
#define LED
P0
然后為亮滅常數(shù)定義一個(gè)宏,由硬件連接圖可以,當(dāng)P0輸出為低電平時(shí)候LED亮,P0輸出為高電平時(shí),LED熄滅。
#define LED_ON()
LED = 0x00 ;
//所有LED亮
#define LED_OFF()
LED = 0xff ;
//所有LED熄滅