- 51系列單片機開發寶典
- 趙建領等編著
- 3089字
- 2019-01-01 04:33:47
2.5 并行I/O口
8051具有4個8位的并行I/O端口,分別為P0、P1、P2和P3,共32條I/O線。這些I/O端口是雙向I/O端口,每個端口均可以用做輸入和輸出。其實,這些I/O端口分別對應4個特殊功能寄存器P0、P1、P2和P3。
2.5.1 并行I/O口的結構
8051有4組8位I/O口:P0、P1、P2和P3口。P1、P2和P3為準雙向口,P0口則為雙向三態輸入/輸出口,下面分別介紹這幾個端口的結構。
1.P0端口結構
P0端口是由8個相同結構的引腳組成的,對于某一個引腳結構,如圖2.6所示。P0端口內部包含一個輸出鎖存器、一個輸出驅動電路、一個輸出控制電路、轉換開關MUX和兩個三態緩沖器。其中,輸出驅動電路由一對場效應管(FET)組成,整個端口的工作狀態受控于輸出控制電路。
P0端口既是一個真正的雙向數據總線口,也可以分時復用輸出低8位地址總線。
當作為普通的I/O使用時,對應的控制信號為0。電子模擬開關MUX將鎖存器的Q端和輸出端連接在一起。同時與門輸出為0使上拉FET截止,這時的輸出是漏極開路電路,故需要外接上拉電阻(5~10KΩ左右)才能正常工作。其工作情冴如下:
◆ 當程序中使該輸出為0時,鎖存器的輸出端為高電平,致使下拉FET導通,從而輸出端輸出0;
◆ 當程序中設置輸出1時,鎖存器的為低電平,致使下拉FET截止,由外接的上拉電阻將輸出端變為高電平,從而輸出1。
對于輸入的情冴,一般應首先置各個鎖存器為1(即輸出FFH),才能保證獲得正確的輸入結果。即作為普通I/O端口時,其不是一個真正的雙向I/O端口,而是一個準雙向端口。
當P0口用做低8位地址/數據分時復用時,控制信號為高電平1,控制電子模擬開關MUX與地址/數據線經反相器輸出相連,并與下拉FET導通,同時與門開鎖,輸出地址/數據信號,既通過與門驅動上拉FET,又通過反相器驅動下拉FET。其工作情冴如下:
◆ 當輸出信號1時,上拉FET導通,而1經過反相器后變為0,使下拉FET截止,從而在輸出引腳上輸出高電平1;
◆ 當輸出信號0時,上拉FET截止,而0經過反相器后變為1,使下拉FET導通,從而使輸出引腳上輸出低電平0。
由于P0口做地址/數據分時復用方式時,經復位后自動置P0口為0FFH,使下拉FET截止,控制為0時上拉FET也截止,從而保證在高阻抗狀態下輸入正確的信息。因此,P0口作為地址/數據總線時是一個真正的雙向口,能夠驅動8個LSTTL負載。

圖2.6 P0口內部結構
2.P2口結構
P2口的結構示意圖,如圖2.7所示。P2口可以當做普通I/O口也可以在系統外部擴展存儲器的時候,輸出高8位的地址。其工作情冴如下:
◆ 當P2口用做高8位地址時,控制信號用電子模擬開關MUX接通地址端,高8位地址信號便加到輸出端口,從而實現8位地址的輸出;
◆ 當P2口用做普通I/O口時,控制信號用電子模擬開關MUX接通鎖存器的Q端,則進行通用I/O操作。此時,P2口屬于準雙向I/O口。因此,在復位情冴下,可以直接從引腳輸入外部數據信息;而在運行中,由輸出轉為輸入方式的時候,則應該加一條輸出0FFH指令,再從端口讀入才正確。其余操作和P0口類似,P2口可以驅動4個LSTTL負載。
3.P1口結構
P1口的結構示意圖,如圖2.8所示。P1口一般用做通用I/O端口,可以用于位處理,各位都可以單獨輸出或輸入信息。

圖2.7 P2口內部結構

圖2.8 P1口內部結構
P1口同樣是準雙向的I/O端口,當需要某位先輸出然后輸入的時候,應該在輸入操作前,加一條輸出1的指令,然后再輸入才正確。對于復位后,由于各位鎖存器均置為1,端輸出為0,下拉FET截止,因此,各位用做輸出或輸入都是正確的。
對于AT89S52,P1端口的某些引腳還可以有第二功用。P1.0引腳用于定時/計數器2的外部事件計數輸入端口,P1.1引腳用于定時/計數器2的外部控制端口。P1.5~P1.7還用于片內Flash的編程。
4.P3口內部結構
P3口的內部結構,如圖2.9所示。P3端口是一個具有第二變異功能、且可位操作的端口,可以有兩種用途:

圖2.9 P3口內部結構
當作為普通I/O端口時,P3口可以進行位操作,是準雙向端口,可以驅動4個LSTTL負載;當系統需要擴展外部器件時,P3口可以作為第二變異功能使用,各位的功能,如表2.7所示。
表2.7 P3端口的第二變異功能
2.5.2 并行I/O口的應用
單片機4個8位I/O端口的結構特點,決定了各自的應用范圍。例如,在實際應用系統中,單用一個單片機很難達到系統的要求,經常需要外部功能擴展。因此,單片機的P0口和P2口常用于組成16位地址總線。P0口用做8位數據總線,P3口由于其特有的第二變異功能,因此常用于傳輸和控制等,只有P1口可以真正用于I/O操作。
另外,在單片機應用時,P0口需要外加上拉電阻,而P1口、P2口和P3口內部設有上拉電阻,不用外加。這4個I/O端口均為準雙向I/O端口,其驅動能力不同,P0口的驅動能力最強,可以驅動8個LSTTL負載,其余3個端口只能驅動4個LSTTL負載。
還有一個需要強調的是,這些端口都有兩種讀方式:讀鎖存器和讀引腳。這是因為在I/O端口中,鎖存器內容和引腳上的內容有可能不一致。
例如,當單片機的某個I/O引腳用于驅動三極管的基極時,向該引腳寫入1,使三極管導通,此時基極的電壓便發生由1到0的跳變,從而使該引腳也變為低電平,而此時鎖存器中的內容仍然為1。這樣便出現鎖存器和引腳內容不一致的情冴。
在單片機的指令系統中,有些指令用來讀鎖存器中的內容,有些指令則用來讀引腳內容。當指令的目的操作數為I/O口時,該指令所讀的便是鎖存器中的內容,而不是引腳上的內容。
讀鎖存器的指令,示例如下:
ANL P2,A INC P1 CPL P1.3 XRL P1,A ORL P1,A
2.5.3 并行I/O口的擴展
單片機通過I/O口和外部設備進行通信,雖然51系列單片機提供了4個8位的并行I/O口,但是這些I/O口一般不能完全用于輸入/輸出操作。
例如,很多時候都需要擴展外部程序存儲器或數據存儲器,此時P0口和P2口便用做數據和地址總線,提供給用戶的I/O口只有P1口和P3口。如果再使用串行通信或者中斷等,則可使用的I/O口便更少。因此,在單片機的系統設計中,經常需要擴展I/O口。
1.并行I/O口的原理
51系列單片機的I/O口的擴展,一般采用將擴展的I/O口與外部RAM統一編址的方式。用戶可以將外部64KB的RAM空間的一部分作為擴展I/O口的地址空間,CPU使用“MOVX”指令對此擴展I/O口進行輸入/輸出操作,即可以像訪問外部RAM存儲單元一樣來訪問擴展的I/O口。
并行I/O口的擴展有兩種方式,可以采用普通的鎖存器、三態門等芯片來進行簡單的I/O口擴展,也可以采用可編程的I/O芯片,如8255、8155等進行擴展。
可編程的I/O芯片比較貴,而且使用比較復雜。在實際的單片機應用系統中,一般采用第一種方法,這種I/O口通過P0口擴展,其成本低、電路簡單、使用也很方便。
2.并行I/O口擴展實例
這里給出使用普通的鎖存器、三態門等芯片進行并行I/O口擴展的一個例子。電路的示意圖如圖2.10所示。
在該電路中,采用74LS273作為端口的擴展輸出、74LS244作為端口的擴展輸入。如果系統中還有其他擴展I/O端口,可以使用線選法或譯碼法將其所使用的地址空間分開。下面分析電路的原理。
在圖2.10中,輸出控制信號由引腳P2.0和取或運算而得,當兩者都為低電平的時候,或門輸出為0,將P0端口的數據鎖存到74LS273中。74LS273的輸出控制發光二極管,當某引腳輸出低電平的時候,對應的發光二極管發亮。
輸入信號由引腳P2.0和取或運算而得。當兩者都為低電平的時候,或門輸出為0,此時選通74LS244,將外部的數據信息輸入到總線。圖2.10中,與74LS244相連的按鍵開關按下的時候,將輸入1,否則將輸入0。
可見,通過8051的雙向數據線P0端口,既可以從74LS244輸入數據,又可以將數據傳送到74LS273中輸出。
輸入和輸出都是在P2.0引腳為0的時候有效的,分別用和
來區別控制,因此不會產生輸入/輸出沖突。

圖2.10 并行I/O擴展
在程序中訪問擴展I/O口是通過“MOVX”指令來實現的。例如,需要讀入擴展I/O口的數據,并保存到累加器A中,則程序的示例代碼如下:
MOV DPTR,#0FEFFH ;P2.0=0,即數據指針指向擴展I/O地址
MOVX A,@DPTR ;從74LS244讀入數據
如果需要將累加器A中的數據輸出,則程序的示例代碼如下:
MOV DPTR,#0FEFFH ;P2.0=0,即數據指針指向擴展I/O地址
MOVX @DPTR,A ;從74LS133讀出數據
- 嵌入式實時操作系統原理與最佳實踐
- ABAQUS 2016有限元分析從入門到精通
- TinyML:基于TensorFlow Lite在Arduino和超低功耗微控制器上部署機器學習
- 嵌入式Linux接口開發技術
- 51單片機逆向學習實戰教程(電子設計與嵌入式開發實踐叢書)
- 現代嵌入式系統開發專案實務
- STM32單片機全案例開發實戰
- AVR單片機實用程序設計
- 嵌入式系統設計與實踐:Linux篇
- 嵌入式系統Linux內核開發實戰指南(ARM平臺)
- 51單片機工程師是怎樣煉成的:基于C語言+Proteus仿真
- 零基礎學51單片機(C語言版)
- C51單片機項目設計實踐教程(第2版)
- 單片機原理與工程應用
- AVR單片機很簡單:C語言快速入門及開發實例