標(biāo)準(zhǔn)51內(nèi)核單片機(jī)的IO口:
P0口則為雙向三態(tài)輸入輸出口
P1\P2\P3是準(zhǔn)雙向IO口,沒(méi)有方向控制,做輸入時(shí)需要先往端口數(shù)據(jù)寄存器寫1才行(也可看作此時(shí)為輸出,端口輸出高電平)。
初始狀態(tài)和復(fù)位狀態(tài)下準(zhǔn)雙向口為1,雙向口為高阻狀態(tài)
P0口:雙向8位三態(tài)I/O口
P1口:準(zhǔn)雙向8位I/O口
P2口:準(zhǔn)雙向8位I/O口
P3口:準(zhǔn)雙向8位I/O口
這里特別要主要準(zhǔn)雙向與雙向三態(tài)I/O的區(qū)別:
P1口,P2口,P3口是3個(gè)8位準(zhǔn)雙向的I/O口,各口線在片內(nèi)均有固定的上拉電阻,當(dāng)這三個(gè)準(zhǔn)雙向I/O口作輸入口使用時(shí),要想該口先寫1,另外準(zhǔn)雙向I/O口無(wú)高阻的“浮空”狀態(tài)。
而雙向口P0口線內(nèi)無(wú)固定上拉電阻,由兩個(gè)MOS管串接,既可開(kāi)漏輸出(開(kāi)漏輸出,本博客有解釋)有可處于高阻的“浮空”狀態(tài),故稱為雙向三態(tài)I/O口。
"準(zhǔn)"就是"基本上"的意思.
P0口是雙向指的是它被用作地址/數(shù)據(jù)端口時(shí),只有在這個(gè)時(shí)候,P0口才處于兩個(gè)開(kāi)關(guān)管推挽狀態(tài),當(dāng)兩個(gè)開(kāi)關(guān)管都關(guān)閉時(shí),才會(huì)出現(xiàn)高阻狀態(tài).
當(dāng)P0口用于一般I/O口時(shí),內(nèi)部接Vcc的那個(gè)開(kāi)關(guān)管是與引腳(端口)脫離聯(lián)系的,這個(gè)時(shí)候,只有拉地的那個(gè)開(kāi)關(guān)管其作用,P0口作為輸出,是必須外接上拉電阻的,不然就無(wú)法輸出高電平;如果P0口作為輸入,則必須先對(duì)端口寫1,使拉地的開(kāi)關(guān)管斷開(kāi),這個(gè)時(shí)候,如果不接上拉電阻,則是高阻狀態(tài),就是一個(gè)雙向口,如果接上拉電阻,則本身輸出高電平,對(duì)輸入信號(hào)的邏輯無(wú)影響(注意是對(duì)邏輯無(wú)影響,對(duì)實(shí)際參數(shù)有無(wú)影響我不確定,但是我認(rèn)為是有的).
雙向與準(zhǔn)雙向,根本原則是雙向包含了高阻這個(gè)狀態(tài),而不在于是否需要先寫1或者不寫,P1~P3口因?yàn)橛袃?nèi)部上拉電阻,因此無(wú)論如何不是雙向;P0口內(nèi)部無(wú)上拉電阻,在處于數(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ū)別的。
簡(jiǎn)單說(shuō):
(1) P0口無(wú)固定上拉電阻。P1,P2,P3有。
(2) 就是P0口作為輸入輸出口時(shí),為了能讓內(nèi)部1能正確輸出,要接上拉電阻(如果不接的話,內(nèi)部D=1的時(shí)候,Q非=0,V1被截止,V1,V2都處于截止?fàn)顟B(tài),不能正確反映1,所以需要上拉電阻。),在讀取輸入的時(shí)候,因?yàn)榇藭r(shí)P0口是作為一個(gè)準(zhǔn)雙向口,所以得先向外寫1,不然的話,如果鎖存器曾經(jīng)鎖存過(guò)0,則V1被導(dǎo)通,PO.x被鉗制在低電平,不能正確反映輸入。
(3)P0口作為地址/數(shù)據(jù)口的時(shí)候,由于訪問(wèn)外部存儲(chǔ)器期間,CPU會(huì)自動(dòng)向PO口的鎖存器寫入0FFH,對(duì)用戶而言,PO口此時(shí)才是真正的三態(tài)雙向口。
單片機(jī)I/O口的結(jié)構(gòu)的詳解

我們先來(lái)說(shuō)說(shuō)集電極開(kāi)路輸出的結(jié)構(gòu)。集電極開(kāi)路輸出的結(jié)構(gòu)如圖1所示,右邊的那個(gè)三極管集電極什么都不接,所以叫做集電極開(kāi)路(左邊的三極管為反相之用,使輸入為“0”時(shí),輸出也為“0”)。對(duì)于圖1,當(dāng)左端的輸入為“0”時(shí),前面的三極管截止(即集電極c跟發(fā)射極e之間相當(dāng)于斷開(kāi)),所以5v電源通過(guò)1k電阻加到右邊的三極管上,右邊的三極管導(dǎo)通(即相當(dāng)于一個(gè)開(kāi)關(guān)閉合);當(dāng)左端的輸入為“1”時(shí),前面的三極管導(dǎo)通,而后面的三極管截止(相當(dāng)于開(kāi)關(guān)斷開(kāi))。
我們將圖1簡(jiǎn)化成圖2的樣子。圖2中的開(kāi)關(guān)受軟件控制,“1”時(shí)斷開(kāi),“0”時(shí)閉合。很明顯可以看出,當(dāng)開(kāi)關(guān)閉合時(shí),輸出直接接地,所以輸出電平為0。而當(dāng)開(kāi)關(guān)斷開(kāi)時(shí),則輸出端懸空了,即高阻態(tài)。這時(shí)電平狀態(tài)未知,如果后面一個(gè)電阻負(fù)載(即使很輕的負(fù)載)到地,那么輸出端的電平就被這個(gè)負(fù)載拉到低電平了,所以這個(gè)電路是不能輸出高電平的。
再看圖三。圖三中那個(gè)1k的電阻即是上拉電阻。如果開(kāi)關(guān)閉合,則有電流從1k電阻及開(kāi)關(guān)上流過(guò),但由于開(kāi)關(guān)閉和時(shí)電阻為0(方便我們的討論,實(shí)際情況中開(kāi)關(guān)電阻不為0,另外對(duì)于三極管還存在飽和壓降),所以在開(kāi)關(guān)上的電壓為0,即輸出電平為0。如果開(kāi)關(guān)斷開(kāi),則由于開(kāi)關(guān)電阻為無(wú)窮大(同上,不考慮實(shí)際中的漏電流),所以流過(guò)的電流為0,因此在1k電阻上的壓降也為0,所以輸出端的電壓就是5v了,這樣就能輸出高電平了。但是這個(gè)輸出的內(nèi)阻是比較大的(即1kω),如果接一個(gè)電阻為r的負(fù)載,通過(guò)分壓計(jì)算,就可以算得最后的輸出電壓為5*r/(r+1000)伏,即5/(1+1000/r)伏。所以,如果要達(dá)到一定的電壓的話,r就不能太小。如果r真的太小,而導(dǎo)致輸出電壓不夠的話,那我們只有通過(guò)減小那個(gè)1k的上拉電阻來(lái)增加驅(qū)動(dòng)能力。但是,上拉電阻又不能取得太小,因?yàn)楫?dāng)開(kāi)關(guān)閉合時(shí),將產(chǎn)生電流,由于開(kāi)關(guān)能流過(guò)的電流是有限的,因此限制了上拉電阻的取值,另外還需要考慮到,當(dāng)輸出低電平時(shí),負(fù)載可能還會(huì)給提供一部分電流從開(kāi)關(guān)流過(guò),因此要綜合這些電流考慮來(lái)選擇合適的上拉電阻。
如果我們將一個(gè)讀數(shù)據(jù)用的輸入端接在輸出端,這樣就是一個(gè)io口了(51的io口就是這樣的結(jié)構(gòu),其中p0口內(nèi)部不帶上拉,而其它三個(gè)口帶內(nèi)部上拉),當(dāng)我們要使用輸入功能時(shí),只要將輸出口設(shè)置為1即可,這樣就相當(dāng)于那個(gè)開(kāi)關(guān)斷開(kāi),而對(duì)于p0口來(lái)說(shuō),就是高阻態(tài)了。
對(duì)于漏極開(kāi)路(od)輸出,跟集電極開(kāi)路輸出是十分類似的。將上面的三極管換成場(chǎng)效應(yīng)管即可。這樣集電極就變成了漏極,oc就變成了od,原理分析是一樣的。
另一種輸出結(jié)構(gòu)是推挽輸出。推挽輸出的結(jié)構(gòu)就是把上面的上拉電阻也換成一個(gè)開(kāi)關(guān),當(dāng)要輸出高電平時(shí),上面的開(kāi)關(guān)通,下面的開(kāi)關(guān)斷;而要輸出低電平時(shí),則剛好相反。比起oc或者od來(lái)說(shuō),這樣的推挽結(jié)構(gòu)高、低電平驅(qū)動(dòng)能力都很強(qiáng)。如果兩個(gè)輸出不同電平的輸出口接在一起的話,就會(huì)產(chǎn)生很大的電流,有可能將輸出口燒壞。而上面說(shuō)的oc或od輸出則不會(huì)有這樣的情況,因?yàn)樯侠娮杼峁┑碾娏鞅容^小。如果是推挽輸出的要設(shè)置為高阻態(tài)時(shí),則兩個(gè)開(kāi)關(guān)必須同時(shí)斷開(kāi)(或者在輸出口上使用一個(gè)傳輸門),這樣可作為輸入狀態(tài),avr單片機(jī)的一些io口就是這種結(jié)構(gòu)。
.AVR單片機(jī)IO口的結(jié)構(gòu)分析
AVR的IO是真正雙向IO結(jié)構(gòu),由于大部分網(wǎng)友都是從標(biāo)準(zhǔn)51轉(zhuǎn)過(guò)來(lái)的,受標(biāo)準(zhǔn)51的準(zhǔn)雙向IO和布爾操作概念影響,沒(méi)能掌握AVR的IO操作,所以有必要撰文說(shuō)明一下,其實(shí)采用真正雙向IO結(jié)構(gòu)的新型MCU很多,常用的有增強(qiáng)型51,PIC,AVR等。
先簡(jiǎn)單的回顧一下標(biāo)準(zhǔn)51的準(zhǔn)雙向IO結(jié)構(gòu)

這種準(zhǔn)雙向IO結(jié)構(gòu)的特點(diǎn)是
1 輸出結(jié)構(gòu)類似 OC門,輸出低電平時(shí),內(nèi)部NMOS導(dǎo)通,驅(qū)動(dòng)能力較強(qiáng)(800uA);輸出高電平靠?jī)?nèi)部上拉電阻,驅(qū)動(dòng)能力弱(60uA)。
2 永遠(yuǎn)有內(nèi)部電阻上拉(P0口除外),高電平輸出電流能力很弱,所以即使IO口長(zhǎng)時(shí)間短路到地也不會(huì)損壞IO口
(同理,IO口低電平輸出能力較強(qiáng),作低電平輸出時(shí)不能長(zhǎng)時(shí)間短路到VCC)
3 作輸入時(shí),因?yàn)镺C門有“線與”特性,必須把IO口設(shè)為高電平(所以按鍵多為共地接法)
4 作輸出時(shí),輸出低電平可以推動(dòng)LED(也是很弱的),輸出高電平通常需要外接緩沖電路(所以LED多為共陽(yáng)接法)
5 軟件模擬 OC結(jié)構(gòu)的總線反而比較方便-----例如 IIC總線
* P0口比較特殊,做外部總線時(shí),是推挽輸出,做普通IO時(shí)沒(méi)有內(nèi)部上拉電阻,所以P0口做按鍵輸入需要外接上拉電阻。
* OC門:三極管的叫集電極開(kāi)路,場(chǎng)效應(yīng)管的叫漏極開(kāi)路,簡(jiǎn)稱開(kāi)漏輸出。具備“線與”能力,有0得0。
* 為什么設(shè)計(jì)成輸出時(shí)高電平弱,低電平強(qiáng)----是考慮了當(dāng)年流行的TTL器件輸入特性

相信我們大多數(shù)人都接觸過(guò)51單片機(jī),51單片機(jī)的I/O口是準(zhǔn)雙向I/O口。其實(shí)這種說(shuō)法是不嚴(yán)謹(jǐn)?shù)模覀冎溃?1單片機(jī)有4個(gè)I/O口,分別是P0、P1、P2、P3,這4個(gè)I/O口的結(jié)構(gòu)并不完全一致,其中P0口是標(biāo)準(zhǔn)的雙向I/O口,而P1、P2、P3則是準(zhǔn)雙向I/O口。
關(guān)于準(zhǔn)雙向I/O口和雙向I/O口的區(qū)別請(qǐng)看另一篇文章“準(zhǔn)雙向I/O口和標(biāo)準(zhǔn)雙向I/O口的區(qū)別”
AVR單片機(jī)的I/O口是標(biāo)準(zhǔn)的雙向I/O口,它的IO結(jié)構(gòu)就就比51的I/O口復(fù)雜多了,單是控制端口的寄存器就有3個(gè) PORTx(數(shù)據(jù)寄存器)、DDRx(數(shù)據(jù)方向寄存器)、PINx(端口輸入引腳);另外還有一個(gè)SFIOR(特殊功能I/O寄存器),這個(gè)寄存器中的PUD位控制全部I/O口的上拉電阻是允許還是被禁止。
電子發(fā)燒友App
























評(píng)論