單片機(jī)小白學(xué)步(23) IO口原理知識補(bǔ)充:雙向IO口 互補(bǔ)推挽
=================================================
本文引用地址:http://m.butianyuan.cn/article/201611/317591.htm雙向IO口的輸出:互補(bǔ)推挽
在51單片機(jī)的P0口工作在普通IO口模式下,為準(zhǔn)雙向IO口。而工作在第二功能狀態(tài)下時,則為標(biāo)準(zhǔn)的雙向IO口。由于雙向IO口的輸出,要求能輸出高低電平,通常會采用互補(bǔ)推挽電路。
在第二功能狀態(tài)下,51單片機(jī)P0口采用的是互補(bǔ)推挽的輸出方式。何為互補(bǔ)推挽呢?下面是它的等效電路圖。
當(dāng)P0第二功能作為輸出時,K1和K2兩個開關(guān)輪流打開。K2閉合K1打開,就會輸出高電平,并且其驅(qū)動能力很大,因?yàn)殡娮娱_關(guān)的阻值?。ú幌?strong>上拉電阻的值那么大)。反之K2打開,K1閉合,就會輸出低電平。
兩個開關(guān)交替導(dǎo)通,互為補(bǔ)充,“挽”是“拉”的意思,兩個電子開關(guān)分別負(fù)責(zé)在IO口輸出處“推”和“拉”電流,所以稱為互補(bǔ)推挽。
這種IO口結(jié)構(gòu)的優(yōu)點(diǎn)很明顯,驅(qū)動能力強(qiáng),穩(wěn)定可靠。缺點(diǎn)在于實(shí)現(xiàn)起來比較困難。在切換輸出電平的過程中,例如從低電平切換到高電平,當(dāng)K1斷開時,要求盡可能快的輸出高電平,也就是K2應(yīng)該立即閉合;同時,如果K1還沒斷開,K2就提前閉合了,相同于兩個開關(guān)同時導(dǎo)通,會直接短路,后果又會很嚴(yán)重。所以需要用電路控制好兩個開關(guān)的協(xié)調(diào)工作。
雙向IO口的輸入:高阻態(tài)、輸入電阻
雙向IO口的輸出,只要求能輸出高低電平,因此并不是必須采用互補(bǔ)推挽電路。而采用互補(bǔ)推挽電路的好處在于,這種電路同時又可以實(shí)現(xiàn)高阻態(tài)的輸入,從而實(shí)現(xiàn)標(biāo)準(zhǔn)雙向IO口。
當(dāng)圖中的K1和K2同時斷開時,IO口就可以工作在高阻態(tài)的輸入狀態(tài)下。高阻態(tài)到底是什么樣的一個概念呢?
當(dāng)IO口處于高阻態(tài)時,也將其稱為浮空輸入狀態(tài),其電平是懸浮不定的,既不是高電平也不是低電平。我們可以想象單片機(jī)在檢測IO口的電平高低時,相當(dāng)于在CPU里面有一個類似電壓表的東西,并且這個電壓表內(nèi)阻很大,例如圖中給出的100MΩ。在這里,我們可以把這個電壓表的內(nèi)阻稱為P0.0口此時的輸入電阻(也可以近似認(rèn)為是輸出阻抗,電阻是對直流電而言,而阻抗是對交流電來說的。這是模擬電路的知識,這里不做細(xì)說)。
現(xiàn)在試想,如果我不小心用手碰到了P0.0端口,而由于人體本身就是阻值很大的導(dǎo)體,周圍有很多電磁波干擾,手上可能存在一些很微弱的電流,這個時候,電壓表的讀數(shù)就會發(fā)生變化,單片機(jī)讀取的電平高低就會變。高阻態(tài)表現(xiàn)出來的結(jié)果就是外界很小的干擾,都可能導(dǎo)致讀取的電平變化,甚至即使沒有碰這個IO口,它每次讀取的結(jié)果也可能不一樣,因?yàn)橥饨绲碾姶挪ǖ瓤赡軙蓴_到IO口。稍后我們會利用51單片機(jī)做個實(shí)驗(yàn),來體驗(yàn)P0口的高阻態(tài)。
高阻態(tài)的意義、輸出電阻
為什么雙向IO口輸入的時候要求是高阻態(tài)呢?
我們假設(shè)有一種裝置,等效電路如下圖。開關(guān)上下切換,它就會輸出高低電平,通過電壓表可以檢測出來。但是其驅(qū)動能力很弱,連LED也驅(qū)動不了。裝置里的100kΩ,可以叫做裝置的輸出電阻(同樣也可以近似認(rèn)為是輸出阻抗)。
讓這個裝置輸出低電平,然后連接51單片機(jī)的P1.0口。這時,VCC經(jīng)過10kΩ上拉電阻到達(dá)IO口,再到裝置內(nèi)部的100kΩ電阻,通過開關(guān)K接到GND。根據(jù)分壓原理,P1.0上的電壓值大概是4.55V,于是單片機(jī)讀取的是高電平。而事實(shí)是,裝置想輸出低電平告知51單片機(jī)。這里單片機(jī)管腳作為輸入功能,卻干擾了外界裝置的輸出值,相當(dāng)于單片機(jī)的這個IO口也在輸出。
當(dāng)單片機(jī)的P0口工作在第二功能的輸入狀態(tài),或者工作在普通IO口的輸入狀態(tài),且沒有外界上下拉電阻,內(nèi)部的兩個電子開關(guān)都是斷開的,對外部呈現(xiàn)高阻態(tài)。從圖中可以看出,裝置輸出的電平能被準(zhǔn)確的讀取到單片機(jī)中。之所以能準(zhǔn)確讀取,就是因?yàn)檠b置輸出電阻比單片機(jī)IO口的輸入電阻要小。
有人可能會說,如果把裝置中的電阻換成1000MΩ,這個時候這個單片機(jī)又不能準(zhǔn)確讀取電平了。但是一般情況下,我們不需要考慮這么極端。如果是理想的高阻態(tài),其輸入阻抗應(yīng)該是無窮大,而這有點(diǎn)像超導(dǎo)體一樣比較特殊。一般情況下認(rèn)為導(dǎo)線電阻幾乎為0,同樣也認(rèn)為高阻態(tài)輸入電阻是無窮大。
總的來說,就是高阻態(tài)情況下,IO口輸入電阻很大,而不容易干擾那些輸出電阻較大、驅(qū)動能力弱的裝置輸出到IO口上的電平。
用51單片機(jī)體驗(yàn)高阻態(tài)
編寫程序如下:
#include reg52.h
sbit TOUCH = P0^0;
sbit LED = P1^0;
void main()
{
TOUCH = 1;
while(1) {
LED = TOUCH;
}
}
電路方面,LED接在P1.0端口,仍然是采用灌電流的方式,低電平有效。P0.0什么都不要接。特別注意,這個實(shí)驗(yàn)必須在P0.0什么都沒接的情況下才能進(jìn)行。很多成品開發(fā)板上,P0.0都連接了外部上拉電阻,沒法做這個實(shí)驗(yàn),建議自己搭建面包板。
程序燒寫好之后,理論上來說,TOUCH管腳作為高阻態(tài)輸入,電平是不確定的,因此LED的亮滅也是不定的。我在實(shí)際實(shí)驗(yàn)時,P0.0懸空的情況下,LED是一直點(diǎn)亮的,這可能是因?yàn)?1單片機(jī)的高阻態(tài)和理想的高阻態(tài)還有一點(diǎn)差距,讀取P0.0的電平為低。
當(dāng)把手指或很大的電阻放在P0.0和VCC之間,就會發(fā)現(xiàn)LED熄滅了,或者變暗了(變暗了說明LED在閃爍,只是閃爍的很快所以看不出來,就像交流電驅(qū)動的白熾燈一樣)。手指的電阻很大,如果是P1.0口,或者在P0.0上外接了上拉或下拉電阻,這時通過手指很難改變其電平狀態(tài)。而由于是高阻態(tài),所以P0.0原先的低電平,通過手指從VCC傳過來的很微弱的電流就變成了高電平。
備注1:考慮到不同人的皮膚電阻不一樣,不能保證用手指接觸都能實(shí)現(xiàn)LED亮滅變化。如果沒有效果,可以嘗試用較大電阻(例如100kΩ)代替手指進(jìn)行實(shí)驗(yàn)。
備注2:如果你通電的時候發(fā)現(xiàn)LED原先是熄滅的,說明P0.0讀取到的是高電平,則應(yīng)該用兩個手指分別放在P0.0和GND上,使得電平變化,LED點(diǎn)亮。當(dāng)然LED不亮還有一種可能是,你的程序沒有被執(zhí)行,可能是單片機(jī)最小系統(tǒng)電路出現(xiàn)了問題,或者程序?qū)戝e了。
=======================================================
《單片機(jī)小白學(xué)步》系列教程(原名《單片機(jī)入門指南》)介紹
本系列教程從最基本的入門知識開始,逐步深入介紹單片機(jī)系統(tǒng)設(shè)計(jì),內(nèi)容包括:
1、入門篇:單片機(jī)等基本概念、各種電子設(shè)計(jì)基本知識
2、思想篇:單片機(jī)/計(jì)算機(jī)系統(tǒng)設(shè)計(jì)的工程思想
3、學(xué)習(xí)篇:單片機(jī)學(xué)習(xí)過程、方法和技巧,以51單片機(jī)為例介紹,并推廣到其他單片機(jī)
4、應(yīng)用篇:遵循規(guī)范的工程方法,設(shè)計(jì)單片機(jī)系統(tǒng)實(shí)例(計(jì)劃設(shè)計(jì)的系統(tǒng)有:計(jì)算器、電子表、密碼鎖、簡易手機(jī),具體看有沒有時間再確定)
5、原理篇:從模擬電路、數(shù)字電路開始,逐步深入介紹單片機(jī)/計(jì)算機(jī)系統(tǒng)原理,并自行設(shè)計(jì)簡易的CPU(由于個人水平有限,這部分沒有把握寫好,具體內(nèi)容視情況而定)
教程特點(diǎn)
1、技術(shù)知識點(diǎn)全面,從入門到精通
包含了各種基本知識,尤其是對單片機(jī)基本概念的介紹、為什么要用單片機(jī)等,在很多同類書籍教程中都被忽略了。同時也包含了一些深入的知識,包括原理篇考慮對單片機(jī)的基本原理進(jìn)行介紹,有助于深入理解單片機(jī)。
本系列教程以51單片機(jī)為例進(jìn)行介紹。通過51介紹完單片機(jī)的基本知識,我會再把430進(jìn)行簡要介紹,尤其是對比兩者之間的優(yōu)缺點(diǎn),讓大家很快感受到430的巨大優(yōu)勢,而學(xué)習(xí)51正好為快速了解430打下了堅(jiān)實(shí)的基礎(chǔ)。
2、除了單片機(jī)知識,還有思想、方法、技巧的介紹
本系列教程中,介紹單片機(jī)各種模塊編程知識的主要是學(xué)習(xí)篇,而學(xué)習(xí)篇只是整個教程的一部分。在學(xué)習(xí)篇中我會貫穿各種方法技巧,如何理解一些模塊功能,怎么看時序圖,嚴(yán)格遵守工程思想進(jìn)行編程,程序發(fā)生了錯誤怎么調(diào)試等等。而在思想篇中會總體介紹很多重要的思想,為后面的學(xué)習(xí)做好準(zhǔn)備工作。
3、知識先后順序的設(shè)計(jì)
單片機(jī)學(xué)習(xí)過程中,涉及大量的知識,而且很多知識之間相互依賴,關(guān)聯(lián)很強(qiáng)。
本系列教程對知識的先后順序進(jìn)行比較明確的規(guī)劃,盡最大可能符合人的認(rèn)知過程。但是實(shí)際規(guī)劃時發(fā)現(xiàn),無論怎么調(diào)整知識的順序,總有一些知識之間相互依賴,關(guān)系復(fù)雜。例如開始講IO口的時候肯定會提到寄存器,而寄存器這個詞的理解,需要深厚的背景知識。但是這些背景知識在沒有進(jìn)行實(shí)踐的時候也很難理解。
初學(xué)者常常就會在這樣的地方感覺疑惑不解,不知所措。而每次遇到類似這樣的知識,我會向初學(xué)者指出,應(yīng)該如何對待。這個知識是應(yīng)該自己去學(xué)習(xí)補(bǔ)充,還是等到學(xué)完原理篇再做理解,而現(xiàn)在又應(yīng)該怎么去看待這個名詞。
另外,在整個教程的學(xué)習(xí)前,需要掌握一定的C語言等基礎(chǔ)知識,具體可參考教程第〇篇《序》中的相關(guān)說明
http://www.paincker.com/mcu-primer-0
4、語言通俗易懂
本系列教程力求語言通俗易懂,而不會用一堆新手不懂的詞語去解釋另一個不懂的詞語。但是受限于個人語言表達(dá)能力,可能有些地方表述的比較繁瑣,或者不清楚,希望大家能夠幫忙指出。
評論