單片機(jī)學(xué)習(xí)之五:基本I/O口試驗(yàn)-點(diǎn)亮二極管
實(shí)驗(yàn)一、基本I/O口試驗(yàn):點(diǎn)亮二極管
本文引用地址:http://www.ex-cimer.com/article/201609/297024.htm1、 試驗(yàn)現(xiàn)象:
8個(gè)二極管間隔發(fā)光。
2、 試驗(yàn)?zāi)康模?/p>
了解最簡(jiǎn)單的單片機(jī)程序的編寫(xiě)方法;
了解單片機(jī)I/O口驅(qū)動(dòng)二極管的方法
3、 試驗(yàn)任務(wù)分析:
要想讓二極管按照我們的要求發(fā)光,首先要搞清楚電路的連接形式,我們先只看和這部分內(nèi)容有關(guān)的電路。當(dāng)JMP0跳線接在12位置時(shí)(選通二極管顯示),電路如下圖所示:
下面,我分別把單片機(jī)各管腳功能作一簡(jiǎn)單解釋?zhuān)?/p>
XTAL1和XTAL2端:
由于單片機(jī)是一種時(shí)序電路,工作的時(shí)候必須外加時(shí)鐘周期,沒(méi)有時(shí)鐘周期,就不能執(zhí)行程序代碼,單片機(jī)就不能工作。
XTAL1和XTAL2即為外接時(shí)鐘引腳。時(shí)鐘的產(chǎn)生有兩種方式,內(nèi)部方式產(chǎn)生和外部方式產(chǎn)生。該電路是內(nèi)部方式產(chǎn)生時(shí)鐘的典型電路,內(nèi)部時(shí)鐘的晶振頻率一般是4M~12M之間,學(xué)習(xí)板上用的是12M的晶振,外接兩個(gè)諧振電容。該電容的典型值是30pf。
RST端:
RST是復(fù)位端,簡(jiǎn)單的說(shuō),單片機(jī)的復(fù)位和計(jì)算機(jī)的重啟動(dòng)是一樣的概念。如何進(jìn)行復(fù)位呢?只要在RST端加上高電平就可以了。
圖示電路也是一個(gè)典型的復(fù)位電路,加電瞬間,電容兩端相當(dāng)于短路,RST端產(chǎn)生一個(gè)高電平,使得單片機(jī)復(fù)位。然后隨著電容充電,RST電壓慢慢下降,當(dāng)降低到低電平時(shí),單片機(jī)開(kāi)始正常工作。同樣,在按下按鍵時(shí),RST也產(chǎn)生一個(gè)高電平,單片機(jī)也被復(fù)位。下載程序的時(shí)候,應(yīng)該拔下RST跳線,即可斷開(kāi)復(fù)位電路,避免串入干擾信號(hào)。
EA/VPP:
EA端是內(nèi)部程序存儲(chǔ)器和外部程序存儲(chǔ)器的選擇端,當(dāng)EA=1時(shí),訪問(wèn)片內(nèi)程序存儲(chǔ)器,當(dāng)EA=0時(shí),訪問(wèn)片外程序存儲(chǔ)器。對(duì)于我們的學(xué)習(xí)板來(lái)說(shuō),由于AT89S52自帶8k的程序存儲(chǔ)器,沒(méi)有擴(kuò)展外部程序存儲(chǔ)器,所以應(yīng)該接高電平。
VPP是引腳的第二功能,暫且不介紹了。
ALE
地址鎖存允許信號(hào)。在擴(kuò)展了外部程序存儲(chǔ)器的情況下,當(dāng)單片機(jī)訪問(wèn)外部程序存儲(chǔ)器時(shí),ALE輸出低8位地址的鎖存信號(hào)。在本學(xué)習(xí)板上沒(méi)有用到這個(gè)端子.
PROG為引腳的第二功能,暫且不介紹了,有興趣的同學(xué)可以查詢相關(guān)教材。
PSEN
外部程序存儲(chǔ)器讀選通信號(hào),由于在學(xué)習(xí)板上沒(méi)有擴(kuò)展外部程序存儲(chǔ)器,所以這個(gè)腳也不用。
P1口:
P1口可作為通用的I/O口使用。在本電路中,P1.5口外接蜂鳴器(其余幾個(gè)和本試驗(yàn)無(wú)關(guān),暫不介紹)。上圖可知,當(dāng)P1.5輸出高電平時(shí),對(duì)應(yīng)的三極管導(dǎo)通,蜂鳴器發(fā)聲。(同學(xué)可能會(huì)問(wèn),這個(gè)功能好像和我們的試驗(yàn)任務(wù)沒(méi)有什么關(guān)系啊,我一會(huì)在給大家解釋)。
P3口:
P3口是雙功能口,第一種功能和我們P1口類(lèi)似,也可以作通用的I/O口使用。第二種功能和單片機(jī)的串行通信,中斷等功能有關(guān),我們暫且不介紹。以后用到相應(yīng)功能在給大家介紹。
P2口:
P2也可以作為輸入口或者輸出口來(lái)用,在試驗(yàn)板上,P2口的作用在于選通數(shù)碼管顯示。在本例中我們不用。
P0口:
P0口在我們這個(gè)試驗(yàn)中扮演著重要的角色,從圖上可知,發(fā)光二極管是由P0口驅(qū)動(dòng)的。且慢,大家可能會(huì)發(fā)現(xiàn),P0口是通過(guò)74AS244驅(qū)動(dòng)發(fā)光二極管的,這是為什么呢?在這里,74AS244是個(gè)緩沖器,它的作用在于隔離單片機(jī)和外圍電路,這樣可以保護(hù)單片機(jī),并且能夠增強(qiáng)單片機(jī)的輸出驅(qū)動(dòng)能力。在該電路中,如果我們?nèi)サ?4AS244,而直接把二極管接在P0輸出口上,也是可以的,這是因?yàn)殡娫赐ㄟ^(guò)上拉電阻能夠提供較大的驅(qū)動(dòng)電流。
同時(shí)大家要注意,當(dāng)P0口作為輸出口使用的時(shí)候,它的輸出級(jí)是漏級(jí)開(kāi)路的形式,所以它應(yīng)該外接上拉電阻,這時(shí)才能有高電平輸出。(我們的板子上面用了一個(gè)排阻。漏級(jí)開(kāi)路的輸出級(jí)類(lèi)似于ttl電路中集電極開(kāi)路的輸出級(jí),大家可以參考隨便一本數(shù)電教材,關(guān)于oc門(mén)的原理介紹,上面說(shuō)得非常清楚。)
下面我們來(lái)看看怎樣才能使得P0口驅(qū)動(dòng)的8個(gè)二極管按照要求發(fā)光。我們發(fā)現(xiàn),只要P0口相應(yīng)的一個(gè)引腳輸出低電平的時(shí)候,則對(duì)應(yīng)的二極管發(fā)光。例如:欲LED1發(fā)光,只需要P0.0引腳輸出相應(yīng)的低電平就可以啦!
因此,如果我們需要8個(gè)二極管間隔發(fā)光,在板子上,從左至右依次為亮滅,則P0口的輸出值應(yīng)該是:01010101,即為55H。
好啦,分析清楚之后,我們可以開(kāi)始寫(xiě)程序啦!
4、試驗(yàn)程序如下:
org 0000h ;(1)
clr p1.5 ;(2)
loop: mov p0,#55h ;(3)
ajmp loop ;(4)
end ;(5)
注釋
(1)、org是個(gè)偽指令,也就是說(shuō)它在匯編時(shí)不產(chǎn)生目標(biāo)代碼。(大家可以在medwin環(huán)境里打開(kāi)反匯編窗口看看就明白啦。)它一般出現(xiàn)在每段源程序或者數(shù)據(jù)塊的開(kāi)始,指明此語(yǔ)句后面的程序或者數(shù)據(jù)塊的起始地址。我們編寫(xiě)好的程序是存放在單片機(jī)的程序存儲(chǔ)器中的,它的可尋址空間是64k,即0000h~0ffffh。這個(gè)語(yǔ)句表示我們的程序從程序存儲(chǔ)器地址為0000h單元開(kāi)始存放。
(2)、從電路圖上面可以看到P1.5連接蜂鳴器,所以這個(gè)語(yǔ)句的意思是,把P1.5置零,不讓蜂鳴器響。由于單片機(jī)復(fù)位以后,P1口的內(nèi)容為FFH,這樣蜂鳴器就會(huì)一直響。所以要把該端子置零。當(dāng)然,如果你不怕吵,這句話也可以不寫(xiě)。
(3)、給P0口賦值55H,使得8個(gè)二極管間隔發(fā)光。
(4)、跳轉(zhuǎn)回標(biāo)記為loop的指令。(注ljmp指令也具有同樣的功能,兩者區(qū)別是:ajmp只能在2k字節(jié)內(nèi)轉(zhuǎn)移,而ljmp可以在64k字節(jié)內(nèi)轉(zhuǎn)移。本程序用ajmp就足夠了。)
(5)、這同樣也是一條偽指令,告訴我們程序到這里就結(jié)束啦。
好啦,然后把這個(gè)程序進(jìn)行編譯,下載,你就會(huì)看到學(xué)習(xí)板上的發(fā)光二極管乖乖的按照你的指令工作了。
5、 課后練習(xí)
(1)、學(xué)習(xí)該程序中出現(xiàn)的知識(shí)點(diǎn)涉及到的理論知識(shí),包括I/O口,程序存儲(chǔ)器,數(shù)據(jù)存儲(chǔ)器,和使用到的指令。
(2)、編寫(xiě)程序,使得發(fā)光二極管從左到右四個(gè)亮,四個(gè)不亮
評(píng)論