單片機小白學(xué)步系列二十 IO口原理
IO口等效模型是本人獨創(chuàng )的方法,通過(guò)此模型,能有效的降低對IO口內部結構理解的難度。并且經(jīng)查閱資料確認,這種模型和實(shí)際工作原理基本一致。
本文引用地址:http://dyxdggzs.com/article/201611/317593.htm==========================================
前面說(shuō)了很多東西,不少人或許已經(jīng)迫不及待的想要實(shí)際操作單片機了。IO口作為單片機與外界通信最主要的手段,是單片機學(xué)習最基本也最重要的一個(gè)知識。前面我們編程實(shí)現了IO口點(diǎn)亮LED的實(shí)驗,本篇繼續對IO口相關(guān)知識進(jìn)行介紹。
為了更好的學(xué)習IO口操作,有必要了解一下IO口的內部結構和相關(guān)概念。這些知識對于后續的學(xué)習很有幫助,重點(diǎn)是理解,完全不需要刻意去記。不記得就回來(lái)再看看就行了,用得多了自然就記住了。
官方資料(最權威準確)
我們說(shuō)過(guò),要了解一個(gè)芯片,最準確有效的方法,是查看官方給出的芯片手冊等資料。但是初學(xué)單片機,直接看芯片手冊資料恐怕很難弄明白,尤其是看到一堆英文、陌生的電路、名詞術(shù)語(yǔ),如果是我,一定也會(huì )抓狂的。但是這里我還是給出一張從Atmel官方的《Atmel 8051 Microcontrollers Hardware Manual》中截取的圖片。

給出這張圖片并不是為了打擊大家學(xué)習熱情,而是希望大家能明白,我們所見(jiàn)過(guò)的各種單片機資料到底是怎么來(lái)的,到底是否準確,這一切都可以通過(guò)官方資料弄清楚,對于大家以后深入學(xué)習一些東西有一定的幫助。
第二功能簡(jiǎn)介
上圖正是官方給出的權威的51單片機IO口結構圖??梢钥闯?,單片機的四組IO口內部結構各不相同,原因是有些IO口有第二功能,入門(mén)篇里面提到過(guò)。
還記得這張管腳圖嗎?括號中標注的就是IO口的第二功能名稱(chēng)。除了P1以外,每個(gè)接口都有第二功能。介紹單片機系統模塊時(shí),我提到51單片機有預留擴展存儲器的接口,正是圖中的P0和P1的第二功能(同時(shí)還要用到29、30等管腳)。因為用的不多,涉及知識也比較深入,就不做具體研究了。順便一提,其實(shí)這里我們看到的AD0~AD7,就是用于并行口的。而P3口的第二功能,就包括串口等,后面學(xué)到了還會(huì )具體介紹。

IO口等效電路
由于深入理解IO口的原理涉及到很多電路甚至微機原理相關(guān)知識,這里只做簡(jiǎn)化介紹,能滿(mǎn)足絕大多數情況下的需要。作為普通IO口使用時(shí),四個(gè)IO口的工作原理基本一致。
下面的圖是從前面圖中的P1電路中裁剪出來(lái)的,也是我們需要理解的關(guān)鍵。

右邊的P1.X表示P1的一個(gè)IO口,如P1.0;電阻右邊寫(xiě)的英文是內部上拉電阻的意思,之所以叫上拉電阻,是因為電阻的一端接在VCC上。下面的三角形表示接地,相當于GND。除此之外,最關(guān)鍵的一個(gè)器件是下面這個(gè)。

這個(gè)器件的本質(zhì)是晶體管,起到電子開(kāi)關(guān)的作用(如果想深入了解,可以學(xué)習模擬電路相關(guān)的知識,或者等到原理篇中介紹)。上面的電路可以大致等效成下圖。注意,這樣的結構只是一個(gè)IO口,整個(gè)單片機中有32個(gè)這種結構。

圖中的R為阻值10k的上拉電阻,S是由前面的晶體管等效的電子開(kāi)關(guān)。藍色框中的部分在單片機內部。
S的開(kāi)關(guān)狀態(tài)由CPU控制。當用程序設置P1.0管腳為低電平時(shí),電子開(kāi)關(guān)S閉合。實(shí)際上電子開(kāi)關(guān)S閉合時(shí),兩端還有很小的電阻。根據分壓原理,P1.0上會(huì )有一個(gè)很低的電壓,近似0V,已經(jīng)可以視為低電平了。當設置管腳為高電平時(shí)S斷開(kāi),P1.0通過(guò)10k上拉電阻接到VCC上。如果用電壓表測量,因為電壓表內阻很大,所以可以得出其電壓值為高電平。
IO口的輸出:點(diǎn)亮LED
前面介紹了點(diǎn)亮第一個(gè)LED的程序和電路。程序如下:
#include
sbit LED = P1^0;
void main()
{
LED = 0;
while(1);
}
電路關(guān)鍵部分如下,VCC通過(guò)1k電阻連接到LED正極,LED負極接到P1.0口:
在單片機執行LED=0的時(shí)候,電子開(kāi)關(guān)S就由CPU控制而閉合,P1.0上輸出低電平。電流通過(guò)1k電阻和LED流入P1.0,再經(jīng)過(guò)S流入GND,LED兩端有合適的電壓于是點(diǎn)亮。結合單片機內部IO口等效電路,整個(gè)電路如下圖
灌電流與拉電流
在上面的例子中,P1.0輸出低電平點(diǎn)亮LED。能不能反過(guò)來(lái),P1.0輸出高電平點(diǎn)亮LED呢?我們可以考慮電路連接成下面這樣,并在程序中編寫(xiě)LED=1。
當執行LED=1時(shí),S斷開(kāi)。電流通過(guò)10k上拉電阻R從P1.0流出,并進(jìn)入LED。由于上拉電阻的阻值太大,電流太小,導致LED不亮,或者亮度很微弱。所以通常不采用這種方法。
這兩種方法,前者電流從外部流入單片機內部,我們稱(chēng)之為灌電流接法;后者電流方向相反,稱(chēng)為拉電流接法。對比可以看出,對于51單片機,灌電流接法電流較大,拉電流接法由于受到上拉電阻限制,電流較小。
在實(shí)際當中灌電流的最大電流也是有限的,因為電子開(kāi)關(guān)S中能通過(guò)的電流有限。根據STC官方的芯片手冊,對于STC單片機,建議單個(gè)IO口灌電流建議不超過(guò)20mA,所有IO口灌電流之和不超過(guò)55mA,否則容易燒壞IO口。而拉電流大小只有230uA左右。
上拉電阻/下拉電阻/高阻態(tài)
拉電流是從上拉電阻流出來(lái)的,能否提高拉電流大小呢?答案是可以。我們只需要在單片機外部再添加一個(gè)上拉電阻,就可以增大拉電流,并且能成功點(diǎn)亮LED,如下圖所示。
圖中的電路,相當于R和R0并聯(lián)了,整個(gè)上拉電阻的阻值減小了。但是這樣做有個(gè)缺陷。在這個(gè)電路中,當單片機輸出低電平時(shí),S閉合,此時(shí)電流從VCC通過(guò)上拉電阻和S流入GND。此時(shí)雖然LED熄滅了,但是卻有較大電流通過(guò)上拉電阻而浪費掉。所以上拉電阻過(guò)大,會(huì )導致驅動(dòng)力不足,而上拉電阻過(guò)小,又會(huì )在輸出低電平時(shí)浪費電能。
上拉電阻的作用是什么呢?對電路了解多一點(diǎn)的人很快能發(fā)現,如果沒(méi)有上拉電阻,IO口就無(wú)法輸出高電平,也就是下圖這樣的。開(kāi)關(guān)閉合時(shí)能輸出低電平,但是開(kāi)關(guān)斷開(kāi)時(shí),P1.0就懸空了,什么也沒(méi)連接。這時(shí)IO口的電壓就是不確定的了,這種狀態(tài)無(wú)法判斷它是低電平還是高電平,叫做高阻態(tài)。很巧的是,單片機的P0口確實(shí)就沒(méi)有上拉電阻,而其他三組IO口都有上拉電阻。所以當P0輸出高電平,并且沒(méi)有外接上拉電阻時(shí),就是高阻態(tài),不能正常輸出高電平。后面我會(huì )通過(guò)具體例子來(lái)讓大家感受一下高阻態(tài)。
注:雖然P1.0似乎是同時(shí)連接到CPU的IO輸入端了,即圖中寫(xiě)著(zhù)“輸入”的綠色箭頭,但是這部分電路只有在讀取管腳輸入的時(shí)候才會(huì )導通,并且是單向的。
上拉電阻的存在,將原本的高阻態(tài)轉變成了高電平,也因此得名。和上拉電阻相對應的,還有下拉電阻,區別在于下拉電阻另一端不是連接VCC而是接到GND。
IO口的輸入
IO口之所以叫IO口(IO=Input/Output),意味著(zhù)它既可以輸出又可以輸入。前面講的都是IO口的輸出,下面講IO口的輸入。IO口的輸出我們通過(guò)LED來(lái)介紹,而IO口的輸入我們則通過(guò)開(kāi)關(guān)來(lái)說(shuō)明。在很多單片機中,IO的輸入和輸出需要通過(guò)電路切換,而對于51單片機來(lái)說(shuō),輸入和輸出使用的是同一套電路,也就是上面我們分析的電路。
圖中的S0是一個(gè)單刀雙擲開(kāi)關(guān),往上切換可以將P1.0接到VCC,往下切換可以接到GND。讀取時(shí)CPU會(huì )通過(guò)特定電路獲取圖中橙色導線(xiàn)上的電平。我們想要實(shí)現的效果是,讓CPU讀取P1.0端口的電平,從而獲得開(kāi)關(guān)S0的狀態(tài)。
當S斷開(kāi)時(shí),CPU通過(guò)獲取P1.0上的電平可以知道外部開(kāi)關(guān)S0的狀態(tài),從而執行相應的操作。
而S閉合時(shí),S0往下切換,P1.0確實(shí)是低電平。而S保持閉合且S0往上切換時(shí),VCC通過(guò)S0和S直接接到GND就短路了。此時(shí)電子開(kāi)關(guān)S通過(guò)大量電流,可能會(huì )燒壞單片機。于是我們添加了電阻R0。S仍然保持閉合,S0往上切換。此時(shí)P1.0仍然是低電平,于是CPU無(wú)法判斷外部開(kāi)關(guān)S0的狀態(tài),如下圖。
總結起來(lái)就是在讀取IO口電平時(shí),應先設置輸出高電平(即斷開(kāi)S),再讀取數據。這個(gè)規則適用于所有IO口。
類(lèi)似的,還可以讀取單刀單擲開(kāi)關(guān)(或按鍵開(kāi)關(guān))的狀態(tài),讀取前先設置輸出高電平,電路圖如下。
上面這種電路需要依賴(lài)上拉電阻才能工作。P0口由于沒(méi)有上拉電阻,需要在外部添加一個(gè)上拉電阻(因為如果沒(méi)有上拉電阻,并且S和S0都斷開(kāi)時(shí),IO口變成高阻態(tài),讀取的電平結果不確定,于是無(wú)法正確判斷S0的開(kāi)關(guān)狀態(tài))。
雙向IO口/準雙向IO口
標準雙向IO口的特點(diǎn)有兩條:
1、在輸出模式下,可以輸出高低電平;
2、在輸入模式下,如果沒(méi)有接外部電路,應呈現高阻態(tài)。
對于51單片機的P1、P2、P3口,由于有內部上拉電阻,輸入模式下不可能出現高阻態(tài),所以稱(chēng)之為準雙向IO口。而P0口作為IO口工作時(shí),如果不加上拉電阻就無(wú)法輸出高電平;而加了上拉電阻,輸入時(shí)又不會(huì )出現高阻態(tài),所以也是準雙向IO口。
備注1:51單片機的P0口如果工作在第二功能狀態(tài)下,則是雙向IO口。初學(xué)時(shí)具體原理不需要研究的很透徹,下面一段對此進(jìn)行分析,僅供有興趣的讀者參考。
對照官方的完整IO口結構圖,P0口內部有上下兩個(gè)晶體管。當P0口工作在IO口模式下,上面那個(gè)晶體管斷開(kāi),可以直接忽略,前面的等效電路就沒(méi)有考慮上面那個(gè)晶體管。而當P0口工作在第二功能狀態(tài)下,兩個(gè)晶體管都可以工作。如果上面的晶體管斷開(kāi),下面的導通,就輸出低電平;反之上面的導通下面的斷開(kāi),就輸出高電平并且不需要上拉電阻;如果兩個(gè)晶體管都斷開(kāi),則可以作為輸入,并且在沒(méi)有外界電路時(shí)呈現高阻態(tài)。所以是雙向IO口。
備注2:關(guān)于雙向IO口和準雙向IO口的概念存在一定爭議,這里的介紹綜合了網(wǎng)上多方面的觀(guān)點(diǎn),被多數人所接受。
線(xiàn)與邏輯
如果把兩個(gè)單片機IO口連接在一起會(huì )發(fā)生什么現象呢?下面就是我們的電路圖。
當設置兩個(gè)IO口都輸出低電平,即S和S1都閉合時(shí),總體是低電平;而當設置其中一個(gè)IO口輸出低電平另一個(gè)輸出高電平時(shí),即S或S1閉合,此時(shí)兩個(gè)IO口上都會(huì )呈現低電平。只有當P1.0、P1.1都輸出高電平,即S和S1都斷開(kāi)時(shí),才會(huì )呈現高電平。
可以簡(jiǎn)單表述成:兩個(gè)IO口連接在一起,僅當P1.0與P1.1都設置輸出高電平時(shí),兩者接線(xiàn)上才會(huì )呈現高電平。這就是所謂的線(xiàn)與邏輯。不僅是兩個(gè),如果是很多的這樣的IO口連在一起,只有所有IO都設置輸出高電平,接線(xiàn)上才會(huì )呈現高電平。線(xiàn)與邏輯會(huì )在后面的矩陣鍵盤(pán)中使用到。
總結
最后總結起來(lái),主要就是下面幾點(diǎn)。內容有點(diǎn)多,但是實(shí)際上常用的只有其中的幾點(diǎn)。再次強調,不需要刻意去記,明白了原理,用多了自然就記住了。
1、灌電流比拉電流能通過(guò)更大的電流;點(diǎn)亮LED一般用灌電流方式
2、上拉電阻越小,拉電流輸出能力越大,但輸出低電平時(shí)越費電
3、讀取IO口前,要先設置輸出高電平
4、P0作為輸出,需外接上拉電阻
5、按鍵開(kāi)關(guān)作為輸入時(shí),接在IO口和GND之間,另外需要上拉電阻
6、51單片機的四個(gè)IO口在普通IO狀態(tài)下都是準雙向口
7、51單片機IO口遵從線(xiàn)與邏輯
=======================================================
《單片機小白學(xué)步》系列教程(原名《單片機入門(mén)指南》)介紹
本系列教程從最基本的入門(mén)知識開(kāi)始,逐步深入介紹單片機系統設計,內容包括:
1、入門(mén)篇:?jiǎn)纹瑱C等基本概念、各種電子設計基本知識
2、思想篇:?jiǎn)纹瑱C/計算機系統設計的工程思想
3、學(xué)習篇:?jiǎn)纹瑱C學(xué)習過(guò)程、方法和技巧,以51單片機為例介紹,并推廣到其他單片機
4、應用篇:遵循規范的工程方法,設計單片機系統實(shí)例(計劃設計的系統有:計算器、電子表、密碼鎖、簡(jiǎn)易手機,具體看有沒(méi)有時(shí)間再確定)
5、原理篇:從模擬電路、數字電路開(kāi)始,逐步深入介紹單片機/計算機系統原理,并自行設計簡(jiǎn)易的CPU(由于個(gè)人水平有限,這部分沒(méi)有把握寫(xiě)好,具體內容視情況而定)
教程特點(diǎn)
包含了各種基本知識,尤其是對單片機基本概念的介紹、為什么要用單片機等,在很多同類(lèi)書(shū)籍教程中都被忽略了。同時(shí)也包含了一些深入的知識,包括原理篇考慮對單片機的基本原理進(jìn)行介紹,有助于深入理解單片機。
本系列教程以51單片機為例進(jìn)行介紹。通過(guò)51介紹完單片機的基本知識,我會(huì )再把430進(jìn)行簡(jiǎn)要介紹,尤其是對比兩者之間的優(yōu)缺點(diǎn),讓大家很快感受到430的巨大優(yōu)勢,而學(xué)習51正好為快速了解430打下了堅實(shí)的基礎。
本系列教程中,介紹單片機各種模塊編程知識的主要是學(xué)習篇,而學(xué)習篇只是整個(gè)教程的一部分。在學(xué)習篇中我會(huì )貫穿各種方法技巧,如何理解一些模塊功能,怎么看時(shí)序圖,嚴格遵守工程思想進(jìn)行編程,程序發(fā)生了錯誤怎么調試等等。而在思想篇中會(huì )總體介紹很多重要的思想,為后面的學(xué)習做好準備工作。
單片機學(xué)習過(guò)程中,涉及大量的知識,而且很多知識之間相互依賴(lài),關(guān)聯(lián)很強。
本系列教程對知識的先后順序進(jìn)行比較明確的規劃,盡最大可能符合人的認知過(guò)程。但是實(shí)際規劃時(shí)發(fā)現,無(wú)論怎么調整知識的順序,總有一些知識之間相互依賴(lài),關(guān)系復雜。例如開(kāi)始講IO口的時(shí)候肯定會(huì )提到寄存器,而寄存器這個(gè)詞的理解,需要深厚的背景知識。但是這些背景知識在沒(méi)有進(jìn)行實(shí)踐的時(shí)候也很難理解。
初學(xué)者常常就會(huì )在這樣的地方感覺(jué)疑惑不解,不知所措。而每次遇到類(lèi)似這樣的知識,我會(huì )向初學(xué)者指出,應該如何對待。這個(gè)知識是應該自己去學(xué)習補充,還是等到學(xué)完原理篇再做理解,而現在又應該怎么去看待這個(gè)名詞。
另外,在整個(gè)教程的學(xué)習前,需要掌握一定的C語(yǔ)言等基礎知識,具體可參考教程第〇篇《序》中的相關(guān)說(shuō)明
http://www.hainter.com/mcu-primer-0
評論