單片機IO口的使用對所有單片機玩家來說都是“家常便飯”,但是你真的了解IO口嗎?你真的能按你的需要配置IO口嗎?
一、準雙向口輸出
準雙向口輸出類型可用作輸出和輸入功能而不需重新配置口線輸出狀態。這是因為當口線輸出為1時驅動能力很弱,允許外部裝置將其拉低。當引腳輸出為低時,它的驅動能力很強,可吸收相當大的電流。(準雙向口有3個上拉晶體管適應不同的需要)
準雙向口讀外部狀態前,要先鎖存為 ‘1’,才可讀到外部正確的狀態.
二、強推挽輸出
推挽輸出配置的下拉結構與開漏輸出以及準雙向口的下拉結構相同,但當鎖存器為1時提供持續的強上拉。推挽模式一般用于需要更大驅動電流的情況。
三、僅為輸入(高阻)
輸入口帶有一個施密特觸發輸入以及一個干擾抑制電路。
四、開漏輸出配置(若外加上拉電阻,也可讀)
當口線鎖存器為0時,開漏輸出關閉所有上拉晶體管。當作為一個邏輯輸出時,這種配置方式必須有外部上拉,一般通過電阻外接到Vcc。如果外部有上拉電阻,開漏的I/O口還可讀外部狀態,即此時被配置為開漏模式的I/O口還可作為輸入I/O口。這種方式的下拉與準雙向口相同。
開漏端口帶有一個施密特觸發輸入以及一個干擾抑制電路。
關于I/O口應用注意事項:
1.有些是I/O口由低變高讀外部狀態時,讀不對,實際沒有損壞,軟件處理一下即可。 因為1T的8051單片機速度太快了,軟件執行由低變高指令后立即讀外部狀態,此時由于實際輸出還沒有變高,就有可能讀不對,正確的方法是在軟件設置由低變高后加1到2個空操作指令延時,再讀就對了.
有些實際沒有損壞,加上拉電阻就OK了有些是外圍接的是NPN三極管,沒有加上拉電阻,其實基極串多大電阻,I/O口就應該上拉多大的電阻,或者將該I/O口設置為強推挽輸出.
2.驅動LED發光二極管沒有加限流電阻,建議加1K以上的限流電阻,至少也要加470歐姆以上
做行列矩陣按鍵掃描電路時,實際工作時沒有加限流電阻,實際工作時可能出現2個I/O口均輸出為低,并且在按鍵按下時,短接在一起,我們知道一個CMOS電路的2個輸出腳不應該直接短接在一起,按鍵掃描電路中,此時一個口為了讀另外一個口的狀態,必須先置高才能讀另外一個口的狀態,而8051單?片機的弱上拉口在由0變為1時,會有2時鐘的強推挽高輸出電流輸出到另外一個輸出為低的I/O口,就有可能造成I/O口損壞.建議在其中的一側加1K限流電阻,或者在軟件處理上,不要出現按鍵兩端的I/O口同時為低.
一種典型三極管控制電路:
如果用弱上拉控制,建議加上拉電阻R1(3.3K~10K),如果不加上拉電阻R1(3.3K~10K),建議R2的值在15K以上,或用強推挽輸出。
典型發光二極管控制電路:
推挽/強上拉口,用拉電流驅動發光二極管
弱上拉/準雙向口,用灌電流驅動發光二極管限流電阻盡量大于1K,最小不要小于470Ω
混合電壓供電系統3V/5V器件I/O口互連
5V單片機連接3.3V器件時,為防止3.3V器件承受不了5V,可將相應的5V單片機I/O口先串一個330Ω的限流電阻到3.3V器件I/O口,程序初始化時將5V器件的I/O口設置成開漏配置,斷開內部上拉電阻,相應的3.3V器件I/O口外部加10K上拉電阻到3.3V器件的Vcc,這樣高電平是3.3V,低電平是0V,輸入輸出一切正常。
3V單片機連接5V器件時,為防3V器件承受不了5V,如果相應的I/O口是輸入,可在該I/O口上串接一個隔離二極管,隔離高壓部分。外部信號電壓高于單片機工作電壓時截止,I/O口因內部上拉到高電平,所以讀I/O口狀態是高電平;外部信號電壓為低時導通,I/O口被鉗位在0.7V,小于0.8V時單片機讀I/O口狀態是低電平。
3V單片機連接5V器件時,為防止3V器件承受不了5V,如果相應的I/O口是輸出,可用一個NPN三極管隔離
如何讓I/O口上電復位時為低電平
普通8051單片機上電復位時普通I/O口為弱上拉高電平輸出,而很多實際應用要求上電時某些I/O口為低電平輸出,否則所控制的系統(如馬達)就會誤動作,現STC12系列單片機由于既有弱上拉輸出又有強推挽輸出,就可以很輕松的解決此問題。
現可在STC12系列單片機I/O口上加一個下拉電阻(1K/2K/3K),這樣上電復位時,雖然單片機內部I/O口是弱上拉/高電平輸出,但由于內部上拉能力有限,而外部下拉電阻又較小,無法將其拉高,所以該I/O口上電復位時外部為低電平。如果要將此I/O口驅動為高電平,可將此I/O口設置為強推挽輸出,而強推挽輸出時,I/O口驅動電流可達20mA,故肯定可以將該口驅動為高電平輸出。
PWM輸出時I/O口的狀態(針對STC系列)