單片機學習之五:基本I/O口試驗-點亮二極管
1、 試驗現象:
8個二極管間隔發光。
2、 試驗目的:
了解最簡單的單片機程序的編寫方法;
3、 試驗任務分析:
要想讓二極管按照我們的要求發光,首先要搞清楚電路的連接形式,我們先只看和這部分內容有關的電路。當JMP0跳線接在12位置時(選通二極管顯示),電路如下圖所示:

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