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