51手記之標(biāo)準(zhǔn)51(二)
有4組8位I/O口:P0、P1、P2、P3
P0為雙向三態(tài)輸入輸出口,P1、P2、P3為準(zhǔn)雙向口,P0的驅(qū)動(dòng)能力是單個(gè)其余口的兩倍!
外擴(kuò)數(shù)據(jù)RAM時(shí),P0口可作數(shù)據(jù)/地址總線,P2口作地址總線的高8位
51的基礎(chǔ)是8031,8031的I/O口只有P1口!
雙向三態(tài)I/O口:口線內(nèi)無固定上拉電阻,由兩個(gè)MOS管串接,既可開漏輸出,又可處于高阻的“浮空”狀態(tài),故稱為雙向三態(tài)I/O口。
P0口是雙向指的是它被用作地址/數(shù)據(jù)端口時(shí),只有在這個(gè)時(shí)候,P0口才處于兩個(gè)開關(guān)管推挽狀態(tài),當(dāng)兩個(gè)開關(guān)管都關(guān)閉時(shí),才會(huì)出現(xiàn)高阻狀態(tài).當(dāng)P0口用于一般I/O口時(shí),內(nèi)部接Vcc的那個(gè)開關(guān)管是與引腳(端口)脫離聯(lián)系的,這個(gè)時(shí)候,只有拉地的那個(gè)開關(guān)管其作用,P0口作為輸出,是必須外接上拉電阻的,不然就無法輸出高電平;
如果P0口作為輸入,則必須先對端口寫1,使拉地的開關(guān)管斷開,這個(gè)時(shí)候,如果不接上拉電阻,則是高阻狀態(tài),就是一個(gè)雙向口,如果接上拉電阻,則本身輸出高電平,對輸入信號的邏輯無影響(注意是對邏輯無影響,對實(shí)際參數(shù)有無影響我不確定,但是我認(rèn)為是有的).
準(zhǔn)雙向I/O口:各口線在片內(nèi)均有固定的上拉電阻,當(dāng)這三個(gè)準(zhǔn)雙向I/O口作輸入口使用時(shí),要向該口先寫1,另外準(zhǔn)雙向I/O口無高阻的“浮空”狀態(tài)。
雙向與準(zhǔn)雙向,根本原則是雙向包含了高阻這個(gè)狀態(tài),而不在于是否需要先寫1或者不寫,P1~P3口因?yàn)橛袃?nèi)部上拉電阻,因此無論如何不是雙向;P0口內(nèi)部無上拉電阻,在處于數(shù)據(jù)/地址功能時(shí),自動(dòng)完成3態(tài)的轉(zhuǎn)換,是雙向,處于一般I/O口時(shí),如果不接外部上拉,而且先向端口寫了1,那么就處于高阻狀態(tài),此時(shí),它也是一個(gè)人為的雙向口,這與它處于地址/數(shù)據(jù)功能時(shí)的自動(dòng)雙向有區(qū)別,以及與P1~P3處于輸入時(shí)輸出鎖存器為1是有區(qū)別的跟I2C總線上那種漏極開路或者集電極開路結(jié)構(gòu)差不多. 通過上拉電阻(或者下拉電阻)來提供一種電平的驅(qū)動(dòng).
當(dāng)作為輸入使用時(shí),就將開關(guān)斷開,這樣就只剩下上拉(或者下拉)電阻,因而阻抗比較高,
可以由其它設(shè)備驅(qū)動(dòng)該IO口。準(zhǔn)雙向口在做為輸入使用時(shí),實(shí)際上還是一種輸出狀態(tài).
只是該輸出狀態(tài)的內(nèi)阻比較大而已. 而真正的雙向IO口,有方向控制寄存器,作為輸入
使用時(shí)輸出部分被斷開.
雙向口與準(zhǔn)雙向口的區(qū)別為雙向口有高阻態(tài),輸入為真正的外部信號,準(zhǔn)雙向口內(nèi)部有上拉,故高電平為內(nèi)部給出不是真正的外部信號!軟件做處理時(shí)都要先向口寫“1”!
評論