18luck网站

18luck网站電子設計 | 18luck网站Rss 2.0 會員中心 會員注冊
搜索: 您現在的位置: 18luck网站 >> 18luck平台 >> 單片機 >> 正文

8051單片機並行I/0口讀寫

作者:佚名    文章來源:本站原創    點擊數:    更新時間:2011-8-10

前兩(liang) 天看資料,見到關(guan) 於(yu) I/O口作為(wei) 輸入時,要先輸出1的說明,有點迷惑。今天特意查了一些資料,費了半天勁,雖然還沒有完全弄明白,但也算也所收獲,下麵就列出來,以便將來查詢並進一步補充。

   

                            ‍單片機鎖存器電路原理圖


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

I/O口使用時,在控製信號的作用下,與(yu) 門關(guan) 閉,V1截止,同時多路開關(guan) 打向下邊,與(yu) 鎖存器的反向輸出端Q^相連。

輸出數據時,“寫(xie) 鎖存器”端發出脈衝(chong) ,將“內(nei) 部總線”上的數據寫(xie) 入輸出鎖存器,由Q^端控製V2,從(cong) 而在引腳上反應出相應的狀態。此種應用時P0端口各引腳應外接上拉電阻。

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

(附:讀端口的指令:讀端口的指令為(wei) 端口內(nei) 容取反這樣的-修改-寫(xie) 指令。

資料稱:這樣的指令才有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 of
X)
CLR PX.Y(clear bit Y of
X)
SETB PX.Y(set bit Y of
X)

引腳的指令:如下所示,讀之前應先將端口置1,即先輸出1,修改鎖存器的內(nei) 容為(wei) 1

MOV A, P1
MOV 20H, P1
MOV R0, P1
MOV @R0, P1

2、為(wei) 什麽(me) 讀之前要先寫(xie) 1

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

3、實際應用

P0P1P2P3I/0口使用時,如果要從(cong) 外部讀取數據,讀取之前應先將端口置1。因初始化時,四個(ge) I/O均被初始化為(wei) 0XFF,所以若端口在整個(ge) 程序過程中無輸出時,即輸出鎖存器的狀態始終為(wei) 1,則讀數據時可不用手動置1。(附:參考引腳內(nei) 部結構圖可知,縱使鎖存器D口數據在變(內(nei) 部數據線),隻要時鍾觸發端clk沒有觸發信號,鎖存器中的內(nei) 容永遠都不會(hui) 改變,也就是說,不管外部引腳信號如何變,也不管執行過多少次讀引腳操作,端口鎖存器中的內(nei) 容是不會(hui) 發生變化的。那麽(me) ,端口內(nei) 容何時變化?答曰:隻要執行過一次輸出,端口內(nei) 容必為(wei) 輸出值,因為(wei) 端口就是輸出的數據鎖存器。)

而當端口實際應用時要不停地同外部數據交換時,即又有輸出又有讀入時,如單片機與(yu) 存儲(chu) 器<?xml:namespace prefix = st1 />24C16通過I2C總線相連,SCL總是由單片機輸出可不用考慮,而SDA則可通過單片機向外發數據,又可以從(cong) 外部讀數據,假若之前發送的最後一位數據為(wei) 0時,此時若再讀數據,因為(wei) 鎖存器的狀態仍為(wei) 0,則之後立即讀數據時就有可能出錯。所以實際操作時,在發送數據代碼之後,總會(hui) 有一個(ge) 單片機主動將SDA拉高的指令,之後再讀數據時才不會(hui) 出問題。(本人淺見,不一定正確)

而當P0與(yu) P2口作總線使用與(yu) 外部並口連接時,應該就不會(hui) 有上麵的問題,因為(wei) 從(cong) 上圖可各,當作總線使用時,在控製信號的作用下,與(yu) 門導通,同時多路開關(guan) 通過反向器與(yu) “地址/數據總線”連接,此時V1與(yu) V2的驅動電路形成反相,形成推拉式電路。在這種情況下輸出時,可直接驅動電路,不需要接上拉電阻(因為(wei) V1導通)。而輸入時,直接讀引腳即可,不需置1。(因為(wei) 輸入時,地址/數據線上沒有數據,V2應該截止(我認為(wei) 的))

----------------------------------

P1_0=!P1_0在KEIL中編譯後的反匯編指令為(wei) CPL 1.0;從(cong) 上麵所述可知為(wei) 讀端口指令,所以可以在C中直接使用,如用作看門狗的清除脈衝(chong) 和LED燈的閃爍等。

讀端口指令似乎是要對內(nei) 部的端口寄存器(P0~P4)進行改寫(xie) 時才進行的,所有說要先讀端口鎖存器狀態,改寫(xie) 完後同時有鎖存器輸出

而讀引腳指令沒有改寫(xie) 寄存器

Tags:單片機並行I0口讀寫,單片機,端口  
責任編輯:admin
請文明參與討論,禁止漫罵攻擊,不要惡意評論、違禁詞語。 昵稱:
1分 2分 3分 4分 5分

還可以輸入 200 個字
[ 查看全部 ] 網友評論
關於我們 - 聯係我們 - 廣告服務 - 友情鏈接 - 網站地圖 - 版權聲明 - 在線幫助 - 文章列表
返回頂部
刷新頁麵
下到頁底
晶體管查詢