https://www.toutiao.com/a6633193994098573828/
單片機的内部結構是由CPU、ROM、RAM等組成,現在介紹外部引腳。如圖1-3所示為單片機的引腳圖,這就是實驗中要用的89C51單片機的外部引腳圖。如表1-3所示為89C51單片機引腳分配表。
圖1-3 89C51單片機的引腳圖
表1-3 89C51單片機引腳分配表
從1.3.1節的硬件結構中可以看出,89C51單片機總共有4組端口,P0、P1、P2和P3,了解這4組端口的結構原理對于日後的編程會有很大的幫助,由于這4組端口結構不盡相同,下面分别介紹單片機總的4組端口。由于每組端口都是由8位組成,故在下面的講解中,隻以每組端口的其中一位來解釋。
1. P0口的結構及工作原理
P0口字節地址為80H,位地址80H~87H。P0端口8位中的一位結構圖如圖1-4所示。
圖1-4 P0端口位結構圖
由圖1-4可見,P0端口由鎖存器、輸入緩沖器、多路開關、一個非門、一個與門及場效應管驅動電路構成。圖1-4中标号為P0.X引腳的圖标,表示引腳可以是P0.0~P0.7的任何一位,即在P0口有8個與圖1-4所示相同的電路組成。下面先介紹組成P0口的每個單元部分。
(1)輸入緩沖器
在P0口中,有兩個三态的緩沖器,學過數字電路的讀者都知道三态門有3個狀态,即在其輸出端可以是高電平、低電平,同時還有一種高阻狀态(或稱為禁止狀态),圖1-4中,上面一個是讀鎖存器的緩沖器,也就是說,要讀取D鎖存器輸出端Q的數據,需要使讀鎖存器中這個緩沖器的三态控制端(圖1-4中标号為“讀鎖存器”端)有效,下面一個是讀引腳的緩沖器,要讀取P0.X引腳上的數據,也要使标号為“讀引腳”的三态緩沖器的控制端有效,引腳上的數據才會傳輸到單片機的内部數據總線上。
(2)D鎖存器
構成一個鎖存器,通常要用一個時序電路(時序的單元電路内容請參考數字電路相關知識),一個觸發器可以保存一位二進制數(即具有保持功能),在51單片機的32根I/O口線中,都是用一個D觸發器來構成鎖存器的。圖1-4中的D鎖存器,D端是數據輸入端,CP是控制端(即時序控制信号輸入端),Q是輸出端,
是反向輸出端。
對于D鎖存器來講,當D輸入端有一個輸入信号,如果這時控制端CP沒有信号(即時序脈沖沒有到來),這時輸入端D的數據是無法傳輸到輸出端Q及反向輸出端
的。如果時序控制端CP的時序脈沖到達,這時D端輸入的數據就會傳輸到Q及
端。數據傳送過來後,當CP時序控制端的時序信号消失時,輸出端還會保持着上次輸入端D的數據(即把上次的數據鎖存起來)。如果下一個時序控制脈沖信号到來,這時D端的數據才再次傳送到Q端,從而改變Q端的狀态。
(3)多路開關
在51單片機中,當内部的存儲器夠用時(即不需要外擴展存儲器時,這裡講的存儲器包括數據存儲器及程序存儲器),P0口可以作為通用的輸入/輸出端口(即I/O)使用,對于8031(内部沒有ROM)的單片機,或者編寫的程序超過了單片機内部的存儲器容量需要外擴存儲器時,P0口就作為地址/數據總線使用。那麼這個多路選擇開關就是用于選擇是作為普通I/O口使用還是作為地址/數據總線使用的選擇開關了。從圖1-4可知,當多路開關與下端接通時,P0口作為普通的I/O口使用;當多路開關是與上端接通時,P0口作為地址/數據總線使用。
(4)輸出驅動
從圖1-4中可看出,P0口的輸出是由兩個MOS管組成的推拉式結構,也就是說,這兩個MOS管一次隻能導通一個,當Vl導通時,V2截止,當V2導通時,Vl截止。
上面已對P0口的各單元部件進行了詳細的講解,下面研究一下P0口作為I/O口及地址/數據總線使用時的具體工作過程。
(1)作為I/O端口使用時的工作原理
P0口作為I/O端口使用時,多路開關的控制信号為0(低電平),如圖1-4所示,多路開關的控制信号同時和與門的一個輸入端相接,與門的邏輯特點是“全l出1,有0出0”,那麼控制信号如果是0,這時與門輸出的也是一個0(低電平),此時Vl管就截止,在多路控制開關的控制信号是0(低電平)時,多路開關是與鎖存器的端相接的(即P0口作為I/O口線使用)。
P0口用作I/O口線,其由數據總線向引腳輸出(即輸出狀态Output)的工作過程:寫鎖存器信号CP有效,數據總線的信号的輸出流程為鎖存器的輸入端D→鎖存器的反向輸出
端→多路開關→V2管的栅極→V2管的漏極→輸出端P0.X。前面已經介紹過,當多路開關的控制信号為低電平0時,與門輸出為低電平,Vl管是截止的,所以作為輸出口時,P0是漏極開路輸出狀态,類似于OC門,當驅動上接電流負載時,需要外接上拉電阻。如圖1-5所示就是由内部數據總線向P0口輸出數據的流程圖。
圖1-5 P0口内部數據總線向引腳輸出時的流程圖
P0口用作I/O口線,其由一引腳向内部數據總線輸入(即輸入狀态Input)的工作過程,數據輸入時(讀P0口)有以下兩種情況:
第一種情況是讀引腳,即讀芯片引腳上的數據。讀引腳數時,讀引腳緩沖器打開(即三态緩沖器的控制端要有效),通過内部數據總線輸入。如圖1-6所示為P0口讀引腳時的流程圖。
圖1-6 P0口讀引腳時的流程圖
第二種情況是讀鎖存器,通過打開讀鎖存器三态緩沖器讀取鎖存器輸出端Q的狀态。如圖1-7所示為P0口讀鎖存器時的流程圖。
圖1-7 P0口讀鎖存器時的流程圖
在輸入狀态下,從鎖存器和從引腳上讀取的信号一般是一緻的,但也有例外。例如,當從内部總線輸出低電平後,鎖存器Q=0,
=l,場效應管V2開通,端口線呈低電平狀态,此時無論端口線上外接的信号是低電平還是高電平,從引腳讀入單片機的信号都是低電平,因而不能正确地讀入端口引腳上的信号。又如,當從内部總線輸出高電平後,鎖存器Q=1,
=0,場效應管V2截止,如果外接引腳信号為低電平,從引腳上讀入的信号就與從鎖存器讀入的信号不同。為此,8031單片機在對端口P0~P3的輸入操作有如下約定:凡屬于讀—改—寫方式的指令,從鎖存器讀入信号,其他指令則從端口引腳線上讀入信号。讀—改—寫指令的特點是,從端口輸入(讀)信号,在單片機内加以運算(修改)後,再輸出(寫)到該端口上。下面是幾條讀—改—寫指令的示例。
ORL P0, A P0→AP0
INC P1 P1+1→P1
DEC P3 P3-1→P3
CPL P2 P2→P2
這樣安排的原因在于讀—改—寫指令需要得到端口原輸出的狀态,修改後再輸出,讀鎖存器而不是讀引腳,可以避免因外部電路的原因使原端口的狀态被讀錯。
注意: P0端口是8031單片機的總線口,分時出現數據D7~D0、低8位地址A7~A0以及三态,用來連接存儲器、外部電路與外部設備。P0端口是使用最廣泛的I/O端口。
(2)作為地址/數據複用口使用時的工作原理
在訪問外部存儲器時,P0口作為地址/數據複用口使用,這時多路開關控制信号為l,與門解鎖,與門輸出信号電平由地址/數據線信号決定;多路開關與反相器的輸出端相連,地址信号經地址/數據線→反相器→V2場效應管栅極→V2漏極輸出。例如,控制信号為l,地址信号為0時,與門輸出低電平,Vl管截止;反相器輸出高電平,V2管導通,輸出引腳的地址信号為低電平。如圖1-8所示為P0口作為地址線,控制信号為1,地址信号為0時的工作流程圖。
圖1-8 P0口作為地址線,控制信号為1,地址信号為0時的工作流程圖
反之,控制信号為l、地址信号為l,與門輸出為高電平,Vl管導通;反相器輸出低電平,V2管截止,輸出引腳的地址信号為高電平。如圖1-9所示為P0口作為地址線,控制信号為1,地址信号為1時的工作流程圖。
圖1-9 P0口作為地址線,控制信号為1,地址信号為1時的工作流程圖
可見,在輸出地址/數據信息時,Vl、V2管是交替導通的,負載能力很強,可以直接與外設存儲器相連,無須增加總線驅動器。P0口又作為數據總線使用,在訪問外部程序存儲器時,P0口輸出低8位地址信息後,将變為數據總線,以便讀指令碼(輸入)。在存取指令期間,控制信号為0,Vl管截止,多路開關也跟着轉向鎖存器反相輸出端
;CPU自動将0FFH(11111111,即向D鎖存器寫入一個高電平1)寫入P0口鎖存器,使V2管截止,在讀引腳信号控制下,通過讀引腳三态門電路将指令碼讀到内部總線。如圖1-10所示為P0口作為數據總線,取指期間工作流程圖。
圖1-10 P0口作為數據總線時取指期間工作流程圖
如果該指令是輸出數據,如“MOVX@DPTR,A”,該指令将累加器的内容通過P0口數據總線傳送到外部RAM中,則多路開關控制信号為1,與門解鎖,與輸出地址信号的工作流程類似,數據由地址/數據線→反相器→V2場效應管栅極→V2漏極輸出。
如果該指令是輸入數據(讀外部數據存儲器或程序存儲器),如“MOVX A,@DPTR”,該指令将外部RAM某一存儲單元内容通過P0口數據總線輸入到累加器A中,則輸入的數據仍通過讀引腳三态緩沖器到内部總線,其過程類似于讀取指令碼流程圖。
通過以上分析可以看出,當P0作為地址/數據總線使用時,在讀指令碼或輸入數據前,CPU自動向P0口鎖存器寫入0FFH,破壞了P0口原來的狀态。因此,不能再作為通用的I/O端口。
注意: 系統設計中務必注意,程序中不能再含有以P0口作為操作數(包含源操作數和目的操作數)的指令。
當由P0口輸入數據時,由于外部輸入信号既加在緩沖輸入端上,又加在驅動電路的漏極上。如果這時T2是導通的,則引腳上的電位始終被鉗位在0電平上,輸入數據不可能被正确地讀入。因此,在輸入數據時,應先把P0口置1,使兩個輸出FET均關斷,使引腳“浮置”,成為高阻狀态,這樣才能正确地插入數據,這就是準雙向口。
I/O口作為輸入口時有兩種工作方式,即讀端口與讀引腳,讀端口時實際上并不從外部讀入數據,而是把端口鎖存器的内容讀入到内部總線,經過某種運算或變換後再寫回到端口鎖存器,隻有讀端口時才真正地把外部的數據讀入到内部總線,圖1-10中的兩個三角形表示的就是輸入緩沖器,CPU将根據不同的指令分别發出讀端口或讀引腳信号以完成不同的操作,這是由硬件自動完成的。讀引腳時,就是把端口作為外部輸入線時,首先要通過外部指令把端口鎖存器置1,然後再進行讀引腳操作,否則就可能讀入出錯,為什麼?看圖1-10中,如果不對端口置1,端口鎖存器原來的狀态有可能為0,Q端為0,
端為1,加到場效應管栅極的信号為1,該場效應管就導通,對地呈現低阻抗,此時即使引腳上輸入的信号為1,也會因端口的低阻抗而使信号變低,使得外加的1信号讀入後不一定是1,若先執行置1操作,則可以使場效應管截止,引腳信号直接加到三态緩沖器中,實現正确的讀入,由于在輸入操作時還必須附加一個準備動作,所以這類I/O口被稱為準雙向口,89C51的P0、P1、P2、P3口作為輸入時都是準雙向口。接下來再看另一個問題,從圖1-10中可以看出,這4個端口還有一個差别,除了P1口外,P0、P2、P3口都還有其他功能,這些功能又作什麼用的呢?下面就來詳細講解這個問題。
每個I/O端口都有一個8位數據鎖存器和兩個8位數據緩沖器。P0~P3(8位鎖存器)是SFR,有各自的端口地址,可直接用指令尋址,用于存放需要輸出的數據。數據輸入時隻有緩沖沒有鎖存,各引腳上輸入的數據必須一直保持到CPU将其讀走為止,如圖1-11所示為P0位結構圖。
圖1-11 P0位結構圖
從圖1-11中可以看出,P0口的内部有一個二選一的選擇器,受内部信号的控制,如果在圖1-11中的位置,則處在I/O口工作方式,此時相當于一個準雙向口輸入,須先将P0口置1,每根口線可以獨立定義為輸入或輸出,但是必須在口線上加上拉電阻,如果将開關撥向另一個方向,則作為地址/數據複用總線用,此時不能逐位定義為輸入/輸出,有兩種用法,當作數據總線用時輸入8位數據,當作地址總線用時則輸出低8位地址,注意,當P0口作為地址/數據複用總線用之後就不能再作I/O口使用了。那麼什麼叫做地址/數據複用?這其實是當單片機的并行口不夠用時需要擴展輸入/輸出口時的一種用法,具體使用方法會在後續的章節中逐步講解。
利用P0口進行擴展外部存儲器和I/O時,P0口将作為地址和數據分時複用,CPU發控制信号,打開與門,使MUX打向上邊,形成推拉式結構,數據信号可直接讀入或輸出到内部總線。利用P0作為通用I/O時,此時P0口是一個準雙向口,CPU發控制信号,封鎖與門,使上拉管截止,MUX打向下邊,與D觸發器Q連接。
輸入程序舉例:
MOV P0, #FFH
輸出程序舉例:
MOV A, P0
2. P1口的結構及工作原理
P1口字節地址為90H,位地址為90H~97H,如圖1-12所示為P1位結構圖。
圖1-12 P1位結構圖
與P0不同,P1口隻能作為I/O口使用,無MUX,但其内部有一個上拉電阻,所以連接外圍負載時不需要外接上拉電阻,這一點P1、P2、P3都一樣。
輸入程序舉例:
MOV P1, #FFH
MOV A, P1
輸出程序舉例:
MOV A, P1
3. P2口的結構及工作原理
P2口字節地址為A0H,位地址為A0H~A7H,如圖1-13所示為P2位結構圖。
圖1-13 P2位結構圖
P2口作為I/O口線時用法與P0口一樣,當内部開關撥向另一個方向,即作地址輸出時,可以輸出程序存儲器或外部數據存儲器的高8位地址,并與P0口輸出的低地址一起構成16位的地址線。
注意: 和數據總線的區别,數據總線是8位的,很多書上都會提到51單片機是8位數據總線,16位地址總線,但都不會解釋有什麼不同,看到這裡讀者應該明白二者的區别。
16位的地址總線可以尋址64KB的程序存儲器或外部數據存儲器,後續章節會講解,此處要注意的是當P2口作為地址總線時,高8位地址線是8位一起輸出的,不能像I/O口線那樣逐位定義,這與P0口是一樣的。
當P2口用來擴展外存儲器和I/O時,作為高8位地址輸出,當進行外部存儲器或I/O設備讀寫操作時,CPU自動發出控制信号,打開與門,使MUX撥向上邊。當P2口當作通用I/O時,CPU自動發出控制信号,MUX撥向下邊,與D觸發器Q連接。
輸入程序舉例:
MOV P2, #FFH
MOV A, P2
輸出程序舉例:
MOV A, P2
4. P3口的結構及工作原理
P3口字節地址為B0H,位地址為B0H~B7H。如圖1-14所示為P3位結構圖。
圖1-14 P3位結構圖
P3口作為I/O口線用時同其他的端口相同,也是準雙向口,不同的是,P3口的每一位都有另一種功能,也叫第二功能,具體作用在用到時将詳細解釋。當P3口作為通用I/O口時,準雙向口第二功能端保持高電平。
輸入程序舉例:
MOV P3, #FFH
MOV A, P3
輸出程序舉例:
MOV A, P3
當P3口作為第二功能時,鎖存器輸出Q=1,如表1-4所示為P3口第二功能列表。
表1-4 P3口第二功能列表
既然單片機的引腳有第二功能,那麼CPU是如何識别的呢?這是一個令許多初學者困惑的問題,其實單片機的第二功能是不需要人工幹預的,也就是說隻要CPU執行到相應的指令,就自動轉成了第二功能。
思考: 輸入和輸出口簡稱I/O口,是單片機與外部電路接口的唯一途徑,4個并行口的結構是有一定區别的,如何根據系統的設計要求和産品用途來正确靈活地使用是初學者必須掌握的基本功,還需要清楚其功能和用途。
5. 應用注意事項
(1)在無片外擴展存儲器的系統中,這4個端口的每一位都可以作為準雙向通用I/O端口使用。在具有片外擴展存儲器的系統中,P2口作為高8位地址線,P0口作為雙向總線,分時作為低8位地址和數據的輸入/輸出線。
(2)P0口作為通用雙向I/O口使用時,必須外接上拉電阻。
(3)P3口除了作通用I/O口使用外,各位還具有第二功能。當P3口某一位用于第二功能作輸出時,則不能再作通用I/O口使用。
(4)當P0~P4端口用作輸入時,為了避免誤讀,都必須先向對應的輸出鎖存器寫入1,使FET截止,然後再讀端口引腳,例如以下程序:
MOV P1, #0FFH
MOV A, P1
https://www.toutiao.com/a6633193994098573828/
有話要說...