<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>

新聞中心

EEPW首頁(yè) > 嵌入式系統 > 設計應用 > 8051單片機I/0口的讀寫(xiě)

8051單片機I/0口的讀寫(xiě)

作者: 時(shí)間:2016-11-26 來(lái)源:網(wǎng)絡(luò ) 收藏
前兩天看資料,見(jiàn)到關(guān)于I/O口作為輸入時(shí),要先輸出1的說(shuō)明,有點(diǎn)迷惑。今天特意查了一些資料,費了半天勁,雖然還沒(méi)有完全弄明白,但也算有所收獲,下面就列出來(lái),以便將來(lái)查詢(xún)并進(jìn)一步補充。

本文引用地址:http://dyxdggzs.com/article/201611/321754.htm

1、作為I/O口使用時(shí),輸入和輸出原理

作I/O口使用時(shí),在控制信號的作用下,與門(mén)關(guān)閉,V1截止,同時(shí)多路開(kāi)關(guān)打向下邊,與鎖存器的反向輸出端Q^相連。

輸出數據時(shí),“寫(xiě)鎖存器”端發(fā)出脈沖,將“內部總線(xiàn)”上的數據寫(xiě)入輸出鎖存器,由Q^端控制V2,從而在引腳上反應出相應的狀態(tài)。此種應用時(shí)P0端口各引腳應外接上拉電阻。

輸入數據時(shí),分為讀引腳和讀端口兩種方式。讀端口的位置就是上圖中的“讀鎖存器”,而讀引腳則是上圖中的“讀引腳”。至于何時(shí)讀端口,何時(shí)讀引腳則是根據不同的指令由硬件自動(dòng)完成的,這不需要我們操心。

附:

讀端口的指令

讀端口的指令為端口內容取反這樣的“讀-修改-寫(xiě)”指令。資料稱(chēng):下面這些的指令才有Read-Modify-Write功效

ANL (logical AND, e.G., ANL P1,A)

ORL (logical OR, e.g., ORL P2,A)

XRL (logical EX-OR, e.g., XRL P3,A)

JBC (jump if bit = 1 and clear bit, e.g., JBC P1.1, LABEL)

CPL (complement bit, e.g., CPL P3.0)

INC (increment, e.g., INC P2)

DEC (decrement, e.g., DEC P2)

DJNZ (decrement and jump if not zero, e.g., DJNZ P3, LABEL)

MOV PX.Y,C(move carry bit to bit Y ofPORTX)

CLR PX.Y(clear bit Y ofPORTX)

SETB PX.Y(set bit Y ofPORTX)

讀引腳的指令

如下所示,讀之前應先將端口置1,即先輸出1,修改鎖存器的內容為1。

MOV A, P1

MOV 20H, P1

MOV R0, P1

MOV @R0, P1

2、為什么讀之前要先寫(xiě)1?

從上圖可知,如果不對端口置1,端口鎖存器原來(lái)的狀態(tài)有可能為0,Q端為0,Q^為1,加到場(chǎng)效應管極的信號為1,該場(chǎng)效應管就導通對地呈現低阻抗,此時(shí)即使引腳上輸入的信號為1也會(huì )因端口的低阻抗而使信號拉低,使得外加的1信號讀入后不一定是1,若先執行置1操作則可以使場(chǎng)效應管截止,引腳信號直接加到三態(tài)緩沖器中,實(shí)現正確的讀入。

3、實(shí)際應用

P0、P1、P2、P3作I/0口使用時(shí),如果要從外部讀取數據,讀取之前應先將端口置1。因初始化時(shí),四個(gè)I/O均被初始化為0xFF,所以若端口在整個(gè)程序過(guò)程中無(wú)輸出時(shí),即輸出鎖存器的狀態(tài)始終為1,則讀數據時(shí)可不用手動(dòng)置1。(附:參考引腳內部結構圖可知,縱使鎖存器D口數據在變(內部數據線(xiàn)),只要時(shí)鐘觸發(fā)端clk沒(méi)有觸發(fā)信號,鎖存器中的內容永遠都不會(huì )改變,也就是說(shuō),不管外部引腳信號如何變,也不管執行過(guò)多少次讀引腳操作,端口鎖存器中的內容是不會(huì )發(fā)生變化的。那么,端口內容何時(shí)變化?答曰:只要執行過(guò)一次輸出,端口內容必為輸出值,因為端口就是輸出的數據鎖存器。)

而當端口實(shí)際應用時(shí)要不停地同外部數據交換時(shí),即又有輸出又有讀入時(shí),如單片機與存儲器24C16通過(guò)IIC總線(xiàn)相連,SCL總是由單片機輸出可不用考慮,而SDA則可通過(guò)單片機向外發(fā)數據,又可以從外部讀數據,假若之前發(fā)送的最后一位數據為0時(shí),此時(shí)若再讀數據,因為鎖存器的狀態(tài)仍為0,則之后立即讀數據時(shí)就有可能出錯。所以實(shí)際操作時(shí),在發(fā)送數據代碼之后,總會(huì )有一個(gè)單片機主動(dòng)將SDA拉高的指令,之后再讀數據時(shí)才不會(huì )出問(wèn)題。(本人淺見(jiàn),不一定正確)

而當P0與P2口作總線(xiàn)使用與外部并口連接時(shí),應該就不會(huì )有上面的問(wèn)題,因為從上圖可知,當作總線(xiàn)使用時(shí),在控制信號的作用下,與門(mén)導通,同時(shí)多路開(kāi)關(guān)通過(guò)反向器與“地址/數據總線(xiàn)”連接,此時(shí)V1與V2的驅動(dòng)電路形成反相,形成推拉式電路。在這種情況下輸出時(shí),可直接驅動(dòng)電路,不需要接上拉電阻(因為V1導通)。而輸入時(shí),直接讀引腳即可,不需置1。(因為輸入時(shí),地址/數據線(xiàn)上沒(méi)有數據,V2應該截止(我認為的,此處存疑)。

P1_0=!P1_0在KEIL中編譯后的反匯編指令為CPL 1.0;從上面所述可知為讀端口指令(讀-修改-寫(xiě)),所以可以在C中直接使用,如用作看門(mén)狗的清除脈沖和LED燈的閃爍等。

讀端口指令似乎是要對內部的端口寄存器(P0~P4)進(jìn)行改寫(xiě)時(shí)才進(jìn)行的,所以說(shuō)要先讀端口鎖存器狀態(tài),改寫(xiě)完后同時(shí)有鎖存器輸出。而讀引腳指令沒(méi)有改寫(xiě)寄存器。



關(guān)鍵詞: 8051單片機I0

評論


技術(shù)專(zhuān)區

關(guān)閉
国产精品自在自线亚洲|国产精品无圣光一区二区|国产日产欧洲无码视频|久久久一本精品99久久K精品66|欧美人与动牲交片免费播放
<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>