在單片機中,I/O口是一個集數據輸入緩沖、數據輸出驅動及鎖存等多項功能于一體的I/O電路。MCS-51單片機共有4個8位的I/O口(分別記作P0口、P1口、P2口、P3口),這些I/O口主要用以實現數據的輸入和輸出,可以靈活方便地進行各種測試和控制。
P0、P1、P2、P3的共同特點是當不需要進行系統擴展時,都能作為通用的I/O口來使用,對這些口既可以按口尋址,進行字節數據操作;也可以按口線尋址,進行位操作。
MCS-51單片機中沒有專門的I/O指令,數據的I/O操作都是使用MOV傳送指令來完成的。我們通過P1.n口線的電路邏輯圖(圖1),從數據輸出、數據輸入、“讀—改—寫”操作三個方面來分析I/O口指令。
P1.n口線的電路邏輯圖由三個部分組成:①一個數據輸出鎖存器,用于輸出數據的鎖存;②兩個三態輸入緩沖器,BUF1用于讀鎖存器,BUF2用于讀引腳;③一個數據輸出驅動電路,由場效應管VT和片內上拉電阻R組成。
一、數據輸出
輸出數據時, 來自CPU的寫脈沖加在D觸發器的CP端,用MOV指令把輸出的數據從內部總線寫入口線電路鎖存器的Q端,并向端口引腳輸出??梢暂敵鰯祿闹噶钣校何惠敵鲋噶睿∕OVPm.n,C ),字節輸出指令(MOVPm,#data 、MOVPm,A 、MOVPm,Rn、MOVPm,@Ri 、MOVPm,direct)(指令中m可以為0~3,分別代表P0~P3口,n可以為0~7,分別代表某個口的第0~第7位。)
二、數據輸入
鎖存器原狀態Q端為高電平“1”,Q-端則為低電平“0”,場效應管VT截止,執行輸入指令時,產生“讀引腳”信號打開BUF2緩沖器,引腳P1.0口線上的數據“0”/“1”就經BUF2緩沖器讀入內部總線來。
鎖存器原狀態Q端為低電平“0”,Q-端則為高電平“1”,導通的場效應管VT會將外界輸入的任何信號都拉低為低電平,這時從引腳 P1.0口線上讀入的數據都為低電平“0”。這樣就不能反映出P1.0引腳輸入的是“1”還是“0”,這實際上就是封鎖了口線,使外界的信號不能輸入。更為嚴重的是,當外界輸入信號為高電平信號時,在拉低過程中產生的大電流還有可能把晶體管燒壞。這就是MCS—51的4個I/O口從引腳輸入數據時存在的一個特殊問題。
為此,在從引腳數據輸入之前(即在使用MOV輸入指令前)必須先向電路中的輸出鎖存器Q寫入“1”(即用指令把口線引腳設置為高電平),使鎖存器的Q=1,Q-=0,場效應管VT截止,以避免鎖存器Q端為“0”狀態時對引腳數據輸入的干擾。
數據輸入的指令有:從口位輸入數據的指令(MOV C,Pm.n)、從口字節輸入數據的指令(MOV A,Pm、MOV Rn,Pm、MOV@Ri,Pm、MOV direct,Pm)。
三、“讀(輸入)—改(運算或修改)—寫(輸出)”指令
對于口的操作還有這樣一些指令,它們的操作過程是:先將鎖存器Q端的狀態讀入內部總線(讀端口又稱讀鎖存器),然后對讀出數據進行運算或修改操作,最后再把結果回送輸出給口。我們把它稱之為“讀—改—寫”指令。
以口做目的操作數的邏輯運算指令:ANL Pm,A;ANL Pm,#data;ORL P.m,A;ORL P.m,#data;XRL P.m,A;XRL P.m,#data
對口加1、減1指令:INC Pm;DEC Pm
對口的位操作指令:CLR Pm.n;SETB Pm.n;CPL Pm.n;
口的位邏輯運算指令:ANL C,Pm.n ;ORL C,P.m.n;
口的位狀態判斷指令:JB P.mn,rel; JNB P.mn,rel;JBC Pm.n,rel;
對于這類“讀—改—寫”指令,不直接讀引腳而讀鎖存器(又稱讀端口)是為了避免直接讀引腳可能出現的錯誤。使用時,CPU能根據不同的指令,分別發出“讀引腳”和“讀鎖存器”信號,以完成讀引腳還是讀鎖存器的操作。
(作者單位:江蘇省常州技師學院)