硬件結構單片機的內部結構是由CPU、ROM、RAM等組成,現(xiàn)在介紹外部引腳。如圖1-3所示為單片機的引腳圖,這就是實驗中要用的89C51單片機的外部引腳圖。如表1-3所示為89C51單片機引腳分配表。 圖1-3 89C51單片機的引腳圖 表1-3 89C51單片機引腳分配表 端口結構分析從1.3.1節(jié)的硬件結構中可以看出,89C51單片機總共有4組端口,P0、P1、P2和P3,了解這4組端口的結構原理對于日后的編程會有很大的幫助,由于這4組端口結構不盡相同,下面分別介紹單片機總的4組端口。由于每組端口都是由8位組成,故在下面的講解中,只以每組端口的其中一位來解釋。 1. P0口的結構及工作原理 P0口字節(jié)地址為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口中,有兩個三態(tài)的緩沖器,學過數(shù)字電路的讀者都知道三態(tài)門有3個狀態(tài),即在其輸出端可以是高電平、低電平,同時還有一種高阻狀態(tài)(或稱為禁止狀態(tài)),圖1-4中,上面一個是讀鎖存器的緩沖器,也就是說,要讀取D鎖存器輸出端Q的數(shù)據(jù),需要使讀鎖存器中這個緩沖器的三態(tài)控制端(圖1-4中標號為“讀鎖存器”端)有效,下面一個是讀引腳的緩沖器,要讀取P0.X引腳上的數(shù)據(jù),也要使標號為“讀引腳”的三態(tài)緩沖器的控制端有效,引腳上的數(shù)據(jù)才會傳輸?shù)絾纹瑱C的內部數(shù)據(jù)總線上。 (2)D鎖存器 構成一個鎖存器,通常要用一個時序電路(時序的單元電路內容請參考數(shù)字電路相關知識),一個觸發(fā)器可以保存一位二進制數(shù)(即具有保持功能),在51單片機的32根I/O口線中,都是用一個D觸發(fā)器來構成鎖存器的。圖1-4中的D鎖存器,D端是數(shù)據(jù)輸入端,CP是控制端(即時序控制信號輸入端),Q是輸出端, 是反向輸出端。 對于D鎖存器來講,當D輸入端有一個輸入信號,如果這時控制端CP沒有信號(即時序脈沖沒有到來),這時輸入端D的數(shù)據(jù)是無法傳輸?shù)捷敵龆薗及反向輸出端 的。如果時序控制端CP的時序脈沖到達,這時D端輸入的數(shù)據(jù)就會傳輸?shù)絈及 端。數(shù)據(jù)傳送過來后,當CP時序控制端的時序信號消失時,輸出端還會保持著上次輸入端D的數(shù)據(jù)(即把上次的數(shù)據(jù)鎖存起來)。如果下一個時序控制脈沖信號到來,這時D端的數(shù)據(jù)才再次傳送到Q端,從而改變Q端的狀態(tài)。 (3)多路開關 在51單片機中,當內部的存儲器夠用時(即不需要外擴展存儲器時,這里講的存儲器包括數(shù)據(jù)存儲器及程序存儲器),P0口可以作為通用的輸入/輸出端口(即I/O)使用,對于8031(內部沒有ROM)的單片機,或者編寫的程序超過了單片機內部的存儲器容量需要外擴存儲器時,P0口就作為地址/數(shù)據(jù)總線使用。那么這個多路選擇開關就是用于選擇是作為普通I/O口使用還是作為地址/數(shù)據(jù)總線使用的選擇開關了。從圖1-4可知,當多路開關與下端接通時,P0口作為普通的I/O口使用;當多路開關是與上端接通時,P0口作為地址/數(shù)據(jù)總線使用。 (4)輸出驅動 從圖1-4中可看出,P0口的輸出是由兩個MOS管組成的推拉式結構,也就是說,這兩個MOS管一次只能導通一個,當Vl導通時,V2截止,當V2導通時,Vl截止。 上面已對P0口的各單元部件進行了詳細的講解,下面研究一下P0口作為I/O口及地址/數(shù)據(jù)總線使用時的具體工作過程。 (1)作為I/O端口使用時的工作原理 P0口作為I/O端口使用時,多路開關的控制信號為0(低電平),如圖1-4所示,多路開關的控制信號同時和與門的一個輸入端相接,與門的邏輯特點是“全l出1,有0出0”,那么控制信號如果是0,這時與門輸出的也是一個0(低電平),此時Vl管就截止,在多路控制開關的控制信號是0(低電平)時,多路開關是與鎖存器的端相接的(即P0口作為I/O口線使用)。 P0口用作I/O口線,其由數(shù)據(jù)總線向引腳輸出(即輸出狀態(tài)Output)的工作過程:寫鎖存器信號CP有效,數(shù)據(jù)總線的信號的輸出流程為鎖存器的輸入端D→鎖存器的反向輸出 端→多路開關→V2管的柵極→V2管的漏極→輸出端P0.X。前面已經(jīng)介紹過,當多路開關的控制信號為低電平0時,與門輸出為低電平,Vl管是截止的,所以作為輸出口時,P0是漏極開路輸出狀態(tài),類似于OC門,當驅動上接電流負載時,需要外接上拉電阻。如圖1-5所示就是由內部數(shù)據(jù)總線向P0口輸出數(shù)據(jù)的流程圖。 圖1-5 P0口內部數(shù)據(jù)總線向引腳輸出時的流程圖 P0口用作I/O口線,其由一引腳向內部數(shù)據(jù)總線輸入(即輸入狀態(tài)Input)的工作過程,數(shù)據(jù)輸入時(讀P0口)有以下兩種情況: 第一種情況是讀引腳,即讀芯片引腳上的數(shù)據(jù)。讀引腳數(shù)時,讀引腳緩沖器打開(即三態(tài)緩沖器的控制端要有效),通過內部數(shù)據(jù)總線輸入。如圖1-6所示為P0口讀引腳時的流程圖。 圖1-6 P0口讀引腳時的流程圖 第二種情況是讀鎖存器,通過打開讀鎖存器三態(tài)緩沖器讀取鎖存器輸出端Q的狀態(tài)。如圖1-7所示為P0口讀鎖存器時的流程圖。 圖1-7 P0口讀鎖存器時的流程圖 在輸入狀態(tài)下,從鎖存器和從引腳上讀取的信號一般是一致的,但也有例外。例如,當從內部總線輸出低電平后,鎖存器Q=0, =l,場效應管V2開通,端口線呈低電平狀態(tài),此時無論端口線上外接的信號是低電平還是高電平,從引腳讀入單片機的信號都是低電平,因而不能正確地讀入端口引腳上的信號。又如,當從內部總線輸出高電平后,鎖存器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 這樣安排的原因在于讀—改—寫指令需要得到端口原輸出的狀態(tài),修改后再輸出,讀鎖存器而不是讀引腳,可以避免因外部電路的原因使原端口的狀態(tài)被讀錯。 注意: P0端口是8031單片機的總線口,分時出現(xiàn)數(shù)據(jù)D7~D0、低8位地址A7~A0以及三態(tài),用來連接存儲器、外部電路與外部設備。P0端口是使用最廣泛的I/O端口。 (2)作為地址/數(shù)據(jù)復用口使用時的工作原理 在訪問外部存儲器時,P0口作為地址/數(shù)據(jù)復用口使用,這時多路開關控制信號為l,與門解鎖,與門輸出信號電平由地址/數(shù)據(jù)線信號決定;多路開關與反相器的輸出端相連,地址信號經(jīng)地址/數(shù)據(jù)線→反相器→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時的工作流程圖 可見,在輸出地址/數(shù)據(jù)信息時,Vl、V2管是交替導通的,負載能力很強,可以直接與外設存儲器相連,無須增加總線驅動器。P0口又作為數(shù)據(jù)總線使用,在訪問外部程序存儲器時,P0口輸出低8位地址信息后,將變?yōu)閿?shù)據(jù)總線,以便讀指令碼(輸入)。在存取指令期間,控制信號為0,Vl管截止,多路開關也跟著轉向鎖存器反相輸出端 ![]() ;CPU自動將0FFH(11111111,即向D鎖存器寫入一個高電平1)寫入P0口鎖存器,使V2管截止,在讀引腳信號控制下,通過讀引腳三態(tài)門電路將指令碼讀到內部總線。如圖1-10所示為P0口作為數(shù)據(jù)總線,取指期間工作流程圖。 ![]() 圖1-10 P0口作為數(shù)據(jù)總線時取指期間工作流程圖 如果該指令是輸出數(shù)據(jù),如“MOVX@DPTR,A”,該指令將累加器的內容通過P0口數(shù)據(jù)總線傳送到外部RAM中,則多路開關控制信號為1,與門解鎖,與輸出地址信號的工作流程類似,數(shù)據(jù)由地址/數(shù)據(jù)線→反相器→V2場效應管柵極→V2漏極輸出。 如果該指令是輸入數(shù)據(jù)(讀外部數(shù)據(jù)存儲器或程序存儲器),如“MOVX A,@DPTR”,該指令將外部RAM某一存儲單元內容通過P0口數(shù)據(jù)總線輸入到累加器A中,則輸入的數(shù)據(jù)仍通過讀引腳三態(tài)緩沖器到內部總線,其過程類似于讀取指令碼流程圖。 通過以上分析可以看出,當P0作為地址/數(shù)據(jù)總線使用時,在讀指令碼或輸入數(shù)據(jù)前,CPU自動向P0口鎖存器寫入0FFH,破壞了P0口原來的狀態(tài)。因此,不能再作為通用的I/O端口。 注意: 系統(tǒng)設計中務必注意,程序中不能再含有以P0口作為操作數(shù)(包含源操作數(shù)和目的操作數(shù))的指令。 當由P0口輸入數(shù)據(jù)時,由于外部輸入信號既加在緩沖輸入端上,又加在驅動電路的漏極上。如果這時T2是導通的,則引腳上的電位始終被鉗位在0電平上,輸入數(shù)據(jù)不可能被正確地讀入。因此,在輸入數(shù)據(jù)時,應先把P0口置1,使兩個輸出FET均關斷,使引腳“浮置”,成為高阻狀態(tài),這樣才能正確地插入數(shù)據(jù),這就是準雙向口。 I/O口作為輸入口時有兩種工作方式,即讀端口與讀引腳,讀端口時實際上并不從外部讀入數(shù)據(jù),而是把端口鎖存器的內容讀入到內部總線,經(jīng)過某種運算或變換后再寫回到端口鎖存器,只有讀端口時才真正地把外部的數(shù)據(jù)讀入到內部總線,圖1-10中的兩個三角形表示的就是輸入緩沖器,CPU將根據(jù)不同的指令分別發(fā)出讀端口或讀引腳信號以完成不同的操作,這是由硬件自動完成的。讀引腳時,就是把端口作為外部輸入線時,首先要通過外部指令把端口鎖存器置1,然后再進行讀引腳操作,否則就可能讀入出錯,為什么?看圖1-10中,如果不對端口置1,端口鎖存器原來的狀態(tài)有可能為0,Q端為0, ![]() 端為1,加到場效應管柵極的信號為1,該場效應管就導通,對地呈現(xiàn)低阻抗,此時即使引腳上輸入的信號為1,也會因端口的低阻抗而使信號變低,使得外加的1信號讀入后不一定是1,若先執(zhí)行置1操作,則可以使場效應管截止,引腳信號直接加到三態(tài)緩沖器中,實現(xiàn)正確的讀入,由于在輸入操作時還必須附加一個準備動作,所以這類I/O口被稱為準雙向口,89C51的P0、P1、P2、P3口作為輸入時都是準雙向口。接下來再看另一個問題,從圖1-10中可以看出,這4個端口還有一個差別,除了P1口外,P0、P2、P3口都還有其他功能,這些功能又作什么用的呢?下面就來詳細講解這個問題。 每個I/O端口都有一個8位數(shù)據(jù)鎖存器和兩個8位數(shù)據(jù)緩沖器。P0~P3(8位鎖存器)是SFR,有各自的端口地址,可直接用指令尋址,用于存放需要輸出的數(shù)據(jù)。數(shù)據(jù)輸入時只有緩沖沒有鎖存,各引腳上輸入的數(shù)據(jù)必須一直保持到CPU將其讀走為止,如圖1-11所示為P0位結構圖。 ![]() 圖1-11 P0位結構圖 從圖1-11中可以看出,P0口的內部有一個二選一的選擇器,受內部信號的控制,如果在圖1-11中的位置,則處在I/O口工作方式,此時相當于一個準雙向口輸入,須先將P0口置1,每根口線可以獨立定義為輸入或輸出,但是必須在口線上加上拉電阻,如果將開關撥向另一個方向,則作為地址/數(shù)據(jù)復用總線用,此時不能逐位定義為輸入/輸出,有兩種用法,當作數(shù)據(jù)總線用時輸入8位數(shù)據(jù),當作地址總線用時則輸出低8位地址,注意,當P0口作為地址/數(shù)據(jù)復用總線用之后就不能再作I/O口使用了。那么什么叫做地址/數(shù)據(jù)復用?這其實是當單片機的并行口不夠用時需要擴展輸入/輸出口時的一種用法,具體使用方法會在后續(xù)的章節(jié)中逐步講解。 利用P0口進行擴展外部存儲器和I/O時,P0口將作為地址和數(shù)據(jù)分時復用,CPU發(fā)控制信號,打開與門,使MUX打向上邊,形成推拉式結構,數(shù)據(jù)信號可直接讀入或輸出到內部總線。利用P0作為通用I/O時,此時P0口是一個準雙向口,CPU發(fā)控制信號,封鎖與門,使上拉管截止,MUX打向下邊,與D觸發(fā)器Q連接。 輸入程序舉例: MOV P0, #FFH 輸出程序舉例: MOV A, P0 2. P1口的結構及工作原理 P1口字節(jié)地址為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口字節(jié)地址為A0H,位地址為A0H~A7H,如圖1-13所示為P2位結構圖。 ![]() 圖1-13 P2位結構圖 P2口作為I/O口線時用法與P0口一樣,當內部開關撥向另一個方向,即作地址輸出時,可以輸出程序存儲器或外部數(shù)據(jù)存儲器的高8位地址,并與P0口輸出的低地址一起構成16位的地址線。 注意: 和數(shù)據(jù)總線的區(qū)別,數(shù)據(jù)總線是8位的,很多書上都會提到51單片機是8位數(shù)據(jù)總線,16位地址總線,但都不會解釋有什么不同,看到這里讀者應該明白二者的區(qū)別。 16位的地址總線可以尋址64KB的程序存儲器或外部數(shù)據(jù)存儲器,后續(xù)章節(jié)會講解,此處要注意的是當P2口作為地址總線時,高8位地址線是8位一起輸出的,不能像I/O口線那樣逐位定義,這與P0口是一樣的。 當P2口用來擴展外存儲器和I/O時,作為高8位地址輸出,當進行外部存儲器或I/O設備讀寫操作時,CPU自動發(fā)出控制信號,打開與門,使MUX撥向上邊。當P2口當作通用I/O時,CPU自動發(fā)出控制信號,MUX撥向下邊,與D觸發(fā)器Q連接。 輸入程序舉例: MOV P2, #FFH MOV A, P2 輸出程序舉例: MOV A, P2 4. P3口的結構及工作原理 P3口字節(jié)地址為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執(zhí)行到相應的指令,就自動轉成了第二功能。 思考: 輸入和輸出口簡稱I/O口,是單片機與外部電路接口的唯一途徑,4個并行口的結構是有一定區(qū)別的,如何根據(jù)系統(tǒng)的設計要求和產(chǎn)品用途來正確靈活地使用是初學者必須掌握的基本功,還需要清楚其功能和用途。 5. 應用注意事項 (1)在無片外擴展存儲器的系統(tǒng)中,這4個端口的每一位都可以作為準雙向通用I/O端口使用。在具有片外擴展存儲器的系統(tǒng)中,P2口作為高8位地址線,P0口作為雙向總線,分時作為低8位地址和數(shù)據(jù)的輸入/輸出線。 (2)P0口作為通用雙向I/O口使用時,必須外接上拉電阻。 (3)P3口除了作通用I/O口使用外,各位還具有第二功能。當P3口某一位用于第二功能作輸出時,則不能再作通用I/O口使用。 (4)當P0~P4端口用作輸入時,為了避免誤讀,都必須先向對應的輸出鎖存器寫入1,使FET截止,然后再讀端口引腳,例如以下程序: MOV P1, #0FFH MOV A, P1 |
|
來自: thchen0103 > 《軟件●硬件》