前言
不論學(xué)習(xí)什么單片機(jī),最簡(jiǎn)單的外設(shè)莫過于IO 口的高低電平控制,本教程將向大家介紹如何在創(chuàng)建好的工程模板上通過操作51 單片機(jī)的GPIO 口輸出高低電平。
一、GPIO 概念
GPIO(general purpose intput output)是通用輸入輸出端口的簡(jiǎn)稱,可以通過軟件來控制其輸入和輸出。51 單片機(jī)芯片的GPIO 引腳與外部設(shè)備連接起來,從而實(shí)現(xiàn)與外部通訊、控制以及數(shù)據(jù)采集的功能。不過GPIO 最簡(jiǎn)單的應(yīng)用還屬點(diǎn)亮LED 燈了,只需通過軟件控制GPIO 輸出高低電平即可。當(dāng)然GPIO還可以作為輸入控制,比如在引腳上接入一個(gè)按鍵,通過電平的高低判斷按鍵是否按下。
我們開發(fā)板上使用的51 單片機(jī)型號(hào)是STC89C52 或STC89C516,此芯片共有40 引腳,芯片引腳圖如下圖所示:
那么是不是所有引腳都是GPIO 呢?當(dāng)然不是,51 單片機(jī)引腳可以分為這么幾大類:
(1)電源引腳:引腳圖中的VCC、GND 都屬于電源引腳。
(2)晶振引腳:引腳圖中的XTAL1、XTAL2 都屬于晶振引腳。
(3)復(fù)位引腳:引腳圖中的RST/VPD 屬于復(fù)位引腳,不做其他功能使用。
(4)下載引腳:51 單片機(jī)的串口功能引腳(TXD、RXD)可以作為下載引腳使用。
(5) GPIO 引腳:引腳圖中帶有Px.x 等字樣的均屬于GPIO 引腳。從引腳圖可以看出,GPIO 占用了芯片大部分的引腳,共達(dá)32 個(gè),分為了4 組,P0、P1、P2、P3,每組為8 個(gè)IO,而且在P3 組中每個(gè)IO 都具備額外功能,只要通過相應(yīng)的寄存器設(shè)置即可配置對(duì)應(yīng)的附加功能,同一時(shí)刻,每個(gè)引腳只能使用該引腳的一個(gè)功能。
對(duì)于這么多GPIO 管腳,我們?cè)趺粗谰唧w某個(gè)引腳有什么功能呢?很簡(jiǎn)單,可以查閱STC89CXX 芯片數(shù)據(jù)手冊(cè)獲取信息,數(shù)據(jù)手冊(cè)在我們光盤“6--芯片資料開發(fā)板芯片數(shù)據(jù)手冊(cè)”內(nèi),里面有一個(gè)STC89CXX 數(shù)據(jù)手冊(cè).pdf。里面的第23 頁中就有介紹,我們截取了一部分內(nèi)容如下圖所示:
從上圖中我們可以獲取引腳的名字和引腳功能等信息。這個(gè)我們開發(fā)板芯片原理圖內(nèi)已經(jīng)將引腳所有功能都標(biāo)進(jìn)去了,所以后面也不需要查找具體引腳有什么功能,直接看原理圖即可。
二、GPIO 結(jié)構(gòu)框圖與工作原理
我們使用的51 單片機(jī)GPIO 分為P0、P1、P2 和P3 口,下面分別來介紹其內(nèi)部結(jié)構(gòu)框圖與工作原理。
1.P0 端口
P0 端口含有8 位引腳,下圖為其中一個(gè),其它幾個(gè)與之完全一致,因此只需了解當(dāng)中一個(gè)即可。如下圖所示:
由上圖可見,P0 端口由鎖存器、輸入緩沖器、切換開關(guān)、一個(gè)非門、一個(gè)與非門及場(chǎng)效應(yīng)管驅(qū)動(dòng)電路構(gòu)成。再看圖的最右邊,標(biāo)號(hào)為P0.x 引腳的圖標(biāo),也就是說P0.x 引腳可以是P0.0 到P0.7 的任何一位,即在P0 口有8 個(gè)與上圖相同的電路組成。
下面,我們先就組成P0 口的每個(gè)單元部份跟大家介紹一下:
①輸入緩沖器
在P0 口中,有兩個(gè)三態(tài)的緩沖器,在學(xué)數(shù)字電路時(shí),我們已知道,三態(tài)門有三個(gè)狀態(tài),即在輸出端可以是高電平、低電平,同時(shí)還有一種就是高阻狀態(tài)(或稱為禁止?fàn)顟B(tài)),大家看上圖,上面一個(gè)是讀鎖存器的緩沖器,也就是說,要讀取D 鎖存器輸出端Q 的數(shù)據(jù),那就得使讀鎖存器的這個(gè)緩沖器的三態(tài)控制端(上圖中標(biāo)號(hào)為‘讀鎖存器’端)有效。下面一個(gè)是讀引腳的緩沖器,要讀取P0.x引腳上的數(shù)據(jù),也要使標(biāo)號(hào)為‘讀引腳’的這個(gè)三態(tài)緩沖器的控制端有效,引腳上的數(shù)據(jù)才會(huì)傳輸?shù)轿覀儐纹瑱C(jī)的內(nèi)部數(shù)據(jù)總線上。
②D 鎖存器
構(gòu)成一個(gè)鎖存器,通常要用一個(gè)時(shí)序電路,時(shí)序的單元電路在學(xué)數(shù)字電路時(shí)我們已知道,一個(gè)觸發(fā)器可以保存一位的二進(jìn)制數(shù)(即具有保持功能),在51單片機(jī)的32 根I/O 口線中都是用一個(gè)D 觸發(fā)器來構(gòu)成鎖存器的。大家看上圖中的D 鎖存器,D 端是數(shù)據(jù)輸入端,CP(CLK)是控制端(也就是時(shí)序控制信號(hào)輸入端),Q 是輸出端,Q 非是反向輸出端。對(duì)于D 觸發(fā)器來講,當(dāng)D 輸入端有一個(gè)輸入信號(hào),如果這時(shí)控制端CP 沒有信號(hào)(也就是時(shí)序脈沖沒有到來),這時(shí)輸入端D 的數(shù)據(jù)是無法傳輸?shù)捷敵龆薗及反向輸出端Q 非的。如果時(shí)序控制端CP 的時(shí)序脈沖一旦到了,這時(shí)D 端輸入的數(shù)據(jù)就會(huì)傳輸?shù)絈 及Q 非端。數(shù)據(jù)傳送過來后,當(dāng)CP 時(shí)序控制端的時(shí)序信號(hào)消失了,這時(shí),輸出端還會(huì)保持著上次輸入端D 的數(shù)據(jù)(即把上次的數(shù)據(jù)鎖存起來了)。如果下一個(gè)時(shí)序控制脈沖信號(hào)來了,這時(shí)D 端的數(shù)據(jù)才再次傳送到Q端,從而改變Q 端的狀態(tài)。
③多路開關(guān)
在51 單片機(jī)中,當(dāng)內(nèi)部的存儲(chǔ)器夠用(也就是不需要外擴(kuò)展存儲(chǔ)器時(shí),這里講的存儲(chǔ)器包括數(shù)據(jù)存儲(chǔ)器及程序存儲(chǔ)器)時(shí),P0 口可以作為通用的輸入輸出端口(即I/O)使用,對(duì)于8031(內(nèi)部沒有ROM)的單片機(jī)或者編寫的程序超過了單片機(jī)內(nèi)部的存儲(chǔ)器容量,需要外擴(kuò)存儲(chǔ)器時(shí),P0 口就作為‘地址/數(shù)據(jù)’總線使用。那么這個(gè)多路選擇開關(guān)就是用于選擇是做為普通I/O 口使用還是作為‘?dāng)?shù)據(jù)/地址’總線使用的選擇開關(guān)了。大家看上圖,當(dāng)多路開關(guān)與下面接通時(shí),P0 口是作為普通的I/O 口使用的,當(dāng)多路開關(guān)是與上面接通時(shí),P0 口是作為‘地址/數(shù)據(jù)’總線使用的。
④場(chǎng)效應(yīng)管輸出驅(qū)動(dòng)
從上圖中可以看出,P0 口的輸出是由兩個(gè)MOS 管組成的推拉式結(jié)構(gòu),也就是說,這兩個(gè)MOS 管一次只能導(dǎo)通一個(gè),當(dāng)V1 導(dǎo)通時(shí),V2 就截止,當(dāng)V2 導(dǎo)通時(shí),V1 截止。
⑤與非門、非門
這個(gè)在學(xué)習(xí)數(shù)字電路時(shí)也很好理解,如果沒有數(shù)字電路基礎(chǔ)的用戶,可以百度查找與非門、非門以及前面的D 觸發(fā)器詳細(xì)了解,這里就不再過多敘述。當(dāng)然如果搞不明白這些也不會(huì)影響后續(xù)我們學(xué)習(xí)51 單片機(jī)編程,大家也可以忽略。前面我們已將P0 口的各單元部件進(jìn)行了一個(gè)詳細(xì)的講解,下面我們就來研究一下P0 口做為I/O 口及地址/數(shù)據(jù)總線使用時(shí)的具體工作過程。
(1)作為I/O 端口輸出使用時(shí)的工作原理
P0 口作為I/O 端口使用時(shí),多路開關(guān)的控制信號(hào)為0(低電平),看上圖中的紅線部分,多路開關(guān)的控制信號(hào)同時(shí)與與非門的一個(gè)輸入端是相接的,我們知道與門的邏輯特點(diǎn)是“全1 出1,有0 出0”那么控制信號(hào)是0 的話,這時(shí)與門輸出的也是一個(gè)0(低電平),與門的輸出是0,V1 管就截止,在多路控制開關(guān)的控制信號(hào)是0(低電平)時(shí),多路開關(guān)是與鎖存器的Q 非端相接的(即P0 口作為I/O 口線使用)。
P0 口用作I/O 口線,其由數(shù)據(jù)總線向引腳輸出(即輸出狀態(tài)Output)的工作過程:當(dāng)寫鎖存器信號(hào)CP 有效,數(shù)據(jù)總線的信號(hào)→鎖存器的輸入端→D 鎖存器的反向輸出Q 非端→多路開關(guān)→V2 管的柵極→V2 的漏極到輸出端P0.X。前面我們已講了,當(dāng)多路開關(guān)的控制信號(hào)為低電平0 時(shí),與門輸出為低電平,V1 管是截止的,所以作為輸出口時(shí),P0 是漏極開路輸出,類似于OC 門,當(dāng)驅(qū)動(dòng)上接電流負(fù)載時(shí),需要外接上拉電阻。
下圖就是由內(nèi)部數(shù)據(jù)總線向P0 口輸出數(shù)據(jù)的流程圖(紅色箭頭):
p0口只能輸出低電平,如果輸出高電平就要外接上拉電阻(4.7k-10k)
(2)作為I/O 端口輸入使用時(shí)的工作原理
數(shù)據(jù)輸入時(shí)(讀P0 口)有兩種情況:
1、讀引腳
讀芯片引腳上的數(shù)據(jù),讀引腳數(shù)時(shí),讀引腳緩沖器打開(即三態(tài)緩沖器的控制端要有效),通過內(nèi)部數(shù)據(jù)總線輸入,請(qǐng)看下圖(紅色箭頭)。
2、讀鎖存器
通過打開讀鎖存器三態(tài)緩沖器讀取鎖存器輸出端Q 的狀態(tài),請(qǐng)看下圖(紅色箭頭)
因?yàn)楝F(xiàn)在STC 51 單片機(jī)內(nèi)存已經(jīng)足夠使用,所以也用不到通過P0 口外擴(kuò)存儲(chǔ)器,對(duì)于P0 口作為外擴(kuò)存儲(chǔ)器時(shí)的工作原理這里就不敘述,如需了解的朋友可以上網(wǎng)百度。
2.P1 端口
P1 口的結(jié)構(gòu)最簡(jiǎn)單,用途也單一,僅作為數(shù)據(jù)輸入/輸出端口使用。輸出的信息有鎖存,輸入有讀引腳和讀鎖存器之分。P1 端口的一位結(jié)構(gòu)見下圖:
由圖可見,P1 端口與P0 端口的主要差別在于,P1 端口用內(nèi)部上拉電阻R 代替了P0 端口的場(chǎng)效應(yīng)管V1,并且輸出的信息僅來自內(nèi)部總線。由內(nèi)部總線輸出的數(shù)據(jù)經(jīng)鎖存器反相和場(chǎng)效應(yīng)管反相后,鎖存在端口線上,所以,P1 端口是具有輸出鎖存的靜態(tài)口。
由上圖可見,要正確地從引腳上讀入外部信息,必須先使場(chǎng)效應(yīng)管關(guān)斷,以便由外部輸入的信息確定引腳的狀態(tài)。為此,在作引腳讀入前,必須先對(duì)該端口寫入l。具有這種操作特點(diǎn)的輸入/輸出端口,稱為準(zhǔn)雙向I/O 口。8051 單片機(jī)的P1、P2、P3 都是準(zhǔn)雙向口。P0 端口由于輸出有三態(tài)功能,輸入前,端口線已處于高阻態(tài),無需先寫入l 后再作讀操作。
P1 口的結(jié)構(gòu)相對(duì)簡(jiǎn)單,前面我們已詳細(xì)的分析了P0 口,只要大家認(rèn)真的分析了P0 口的工作原理,P1 口我想大家都有能力去分析,這里我就不多論述了。單片機(jī)復(fù)位后,各個(gè)端口已自動(dòng)地被寫入了1,此時(shí),可直接作輸入操作。
如果在應(yīng)用端口的過程中,已向P1 一P3 端口線輸出過0,則再要輸入時(shí),必須先寫1 后再讀引腳,才能得到正確的信息。此外,隨輸入指令的不同,P1 端口
也有讀鎖存器與讀引腳之分。
3.P2 端口
P2 端口的一位結(jié)構(gòu)見下圖:
由圖可見,P2 端口在片內(nèi)既有上拉電阻,又有切換開關(guān)MUX,所以P2 端口在功能上兼有P0 端口和P1 端口的特點(diǎn)。這主要表現(xiàn)在輸出功能上,當(dāng)切換開關(guān)向下接通時(shí),從內(nèi)部總線輸出的一位數(shù)據(jù)經(jīng)反相器和場(chǎng)效應(yīng)管反相后,輸出在端口引腳線上;當(dāng)多路開關(guān)向上時(shí),輸出的一位地址信號(hào)也經(jīng)反相器和場(chǎng)效應(yīng)管反相后,輸出在端口引腳線上。
對(duì)于8031 單片機(jī)必須外接程序存儲(chǔ)器才能構(gòu)成應(yīng)用電路(或者我們的應(yīng)用電路擴(kuò)展了外部存儲(chǔ)器),而P2 端口就是用來周期性地輸出從外存中取指令的地址(高8 位地址),因此,P2 端口的多路開關(guān)總是在進(jìn)行切換,分時(shí)地輸出從內(nèi)部總線來的數(shù)據(jù)和從地址信號(hào)線上來的地址。因此P2 端口是動(dòng)態(tài)的I/O 端口。輸出數(shù)據(jù)雖被鎖存,但不是穩(wěn)定地出現(xiàn)在端口線上。其實(shí),這里輸出的數(shù)據(jù)往往也是一種地址,只不過是外部RAM 的高8 位地址。P2 口既可作為I/O 口使用,也可作為地址總線使用,通常主要用作I/O 口使用,地址總線使用不作分析。
P2 口的結(jié)構(gòu)相對(duì)簡(jiǎn)單,前面我們已詳細(xì)的分析了P0 和P1 口,只要大家認(rèn)真的分析了它們的工作原理,P2 口我想大家都有能力去分析,這里我就不多論述了。
3.P3 端口
P3 口是一個(gè)多功能口,它除了可以作為I/O 口外,還具有第二功能,P3 端口的一位結(jié)構(gòu)見下圖:
由上圖可見,P3 端口和Pl 端口的結(jié)構(gòu)相似,區(qū)別僅在于P3 端口的各端口線有兩種功能選擇。當(dāng)處于第一功能時(shí),第二輸出功能線為1,此時(shí),內(nèi)部總線信號(hào)經(jīng)鎖存器和場(chǎng)效應(yīng)管輸入/輸出,其作用與P1 端口作用相同,也是靜態(tài)準(zhǔn)雙向I/O 端口。當(dāng)處于第二功能時(shí),鎖存器輸出1,通過第二輸出功能線輸出特定的內(nèi)含信號(hào),在輸入方面,即可以通過緩沖器讀入引腳信號(hào),還可以通過替代輸入功能讀入片內(nèi)的特定第二功能信號(hào)。由于輸出信號(hào)鎖存并且有雙重功能,故P3 端口為靜態(tài)雙功能端口。有關(guān)P3 口第二功能,在前面章節(jié)芯片管腳功能定義已經(jīng)講解過,此處不再重復(fù)。
至此,我們就把51 單片機(jī)的P0、P1、P2 和P3 口內(nèi)部結(jié)構(gòu)及原理講解完,可能有的朋友會(huì)很懵、看不懂,沒關(guān)系,這些都不會(huì)影響你編寫單片機(jī)應(yīng)用程序,大家記住以下幾點(diǎn)即可:
①P0 口是漏極開路,要使其輸出高電平,必須外接上拉電阻,通常選擇4.7K~10K 阻值。
②P0、P1、P2 幾乎都用作普通I/O 口使用,既可作為輸入,又可作為輸出。
③P3 口既可用作普通I/O 口,又可作為第二功能使用,比如串口、外部中斷、計(jì)數(shù)器等。
評(píng)論