C51的說明書上說:”Because Ports 1, 2, and 3 have fixed internal pullups, they are sometimes called quasi-bidirectional ports. When configured as inputs, they pull high and source current (IIL) when externally pulled low. Port 0, on the other hand, is considered truly bidirectional, because it floats when configured as an input. "
翻譯是:因為P1、2、3有固定的內部上拉電阻,所以有時稱它們為準雙向口。當用做輸入時被拉高,當外部拉低時(低電平)會拉電流電流(source current, 這裡拉電流是電流從單片機往外走)。而P0則是真雙向口,因為作為輸入時它是懸浮的。
“準”就是“基本上的意思”,也就是“準雙向口”不是真正的雙向口。
其實重點在P0口.
P0口是雙向指的是它被用作地址/數據連線埠時,只有在這個時候,P0口才處於兩個開關管推挽狀態,當兩個開關管都關閉時,才會出現高阻狀態.當P0口用於一般I/O口時,內部接Vcc的那個開關管是與引腳(連線埠)脫離聯繫的,這個時候,只有拉地的那個開關管起作用,P0口作為輸出,是必須外接上拉電阻的,不然就無法輸出高電平;
如果P0口作為輸入,則必須先對連線埠寫1,使拉地的開關管斷開,這個時候,如果不接上拉電阻,則是高阻狀態,就是一個雙向口,如果接上拉電阻,則本身輸出高電平,對輸入信號的邏輯無影響(注意是對邏輯無影響,對實際參數有無影響我不確定,但是我認為是有的).
雙向與準雙向,根本原則是雙向包含了高阻這個狀態,而不在於是否需要先寫1或者不寫,P1~P3口因為有內部上拉電阻,因此無論如何不是雙向;P0口內部無上拉電阻,在處於數據/地址功能時,自動完成3態的轉換,是雙向,處於一般I/O口時,如果不接外部上拉,而且先向連線埠寫了1,那么就處於高阻狀態,此時,它也是一個人為的雙向口,這與它處於地址/數據功能時的自動雙向有區別,以及與P1~P3處於輸入時輸出鎖存器為1是有區別的跟I2C匯流排上那種漏極開路或者集電極開路結構差不多. 通過上拉電阻(或者下拉電阻)來提供一種電平的驅動.
當作為輸入使用時,就將開關斷開,這樣就只剩下上拉(或者下拉)電阻,因而阻抗比較高,
可以由其它設備驅動該IO口。準雙向口在做為輸入使用時,實際上還是一種輸出狀態.
只是該輸出狀態的內阻比較大而已. 而真正的雙向IO口,有方向控制暫存器,作為輸入
使用時輸出部分被斷開.
雙向口與準雙向口的區別為雙向口有高阻態,輸入為真正的外部信號,準雙向口內部有上拉,故高電平為內部給出不是真正的外部信號!軟體做處理時都要先向口寫“1”!
P0口為真正的雙向口,其餘為準雙向口!
說明一點:51的基礎是8031,8031的I/O口只有P1口!
而P0及P2口為外擴存儲器,P3為多功能口!
51後來增加了其餘口的I/O口功能!
P0內部無上拉(開漏輸出),外加NMOS電路需接上拉!
輸入為高阻懸浮態!
P0的驅動能力是單個其餘口的兩倍!
p0是一個雙功能的8位並行I/O口,位元組地址為80H,位地址為80H~87H。它既可以作為通用的輸入/輸出連線埠使用,在系統擴展時又可以作為地址/數據匯流排使用。
P1口是唯一的單功能並行I/O口,位元組地址為90H,位地址為90H~97H。它只能用作通用的數據輸入/輸出連線埠使用。
P2口是一個雙功能的8位I/O連線埠,位元組地址為A0H,位地址為A0H~A7H。它可以作為通用的輸入/輸出連線埠使用,在單片機擴展外部設備或晶片時,它又可以用作高8位地址匯流排與P0口的低8位地址線一起構成16位的片外地址匯流排。
P3口是一個雙用途連線埠,位元組地址為B0H,位地址為B0H~B7H。它的第一功能是通用輸入/輸出連線埠。它還具有第二功能。
P3口引腳 | 第二功能 |
P3.0 | RXD(串列口輸入端) |
P3.1 | TXD(串列口輸出端) |
P3.2 | INT0的非(外部中斷0請求輸入端) |
p3.3 | INT1的非(外部中斷1請求輸入端) |
P3.4 | T0(定時/計數器0外部信號輸入端) |
P3.5 | T1(定時/計數器1外部信號輸入端) |
P3.6 | WR的非(外部RAM寫控制信號輸出端) |
P3.7 | RD的非(外部RAM讀控制信號輸出端) |