遇到了幾個問題,都是說 P0 口可以輸出 1 的,
P0 口內(nèi)部的電路圖,并不是人人都可以看懂的,很多人都要看文字說明。
但是,有些說明寫的,很是差強人意,接口電路的基本功能特點,往往都解釋錯了。
在單片機的外部擴充存儲空間時,有一種三總線方式,此時,P0 口,將負(fù)責(zé)對外部芯片傳送數(shù)據(jù)和低八位地址。
這時,P0 口就是以三態(tài)門的特點來工作,即可以輸出高、低電平,還可以切斷與外界的聯(lián)系,在引腳上呈現(xiàn)“高阻態(tài)”。
就目前來看,絕大部分單片機系統(tǒng)都不使用三總線形式來擴充外部空間了,三態(tài)門的現(xiàn)象,基本上,已經(jīng)看不到了。
現(xiàn)在一般都是把 P0 口當(dāng)一般的 IO 接口來使用。此時,P0 口就只有兩種狀態(tài):輸出低電平和高阻態(tài)。
想要讓 P0 口輸出 1,單片機就沒有這種能力了。
----------------------
在英文版的 AT89C51 的數(shù)據(jù)文件中,節(jié)選一段關(guān)于 P0 的文字如下:
Port 0
Port 0 is an 8-bit open drain bidirectional I/O port.?
As an output port, each pin can sink eight TTL inputs.?
When 1s are written to port 0 pins, the pins can be used as high-impedance inputs.
Port 0 can also be configured to be the multiplexed low-order address/data bus during accesses to external program and data memory.
In this mode, P0 has internal pull-ups.
利用網(wǎng)上的翻譯軟件,把它們譯成中文,再簡單整理如下:
P0
P0 是一個 8 位漏極開路雙向 I/O 端口。
作為一個輸出端口,每個引腳可以吸收 8 個 TTL 輸入。
當(dāng)把 1 寫入 P0 引腳,這些引腳可以用作高阻抗輸入。
在訪問期間外部程序和數(shù)據(jù)存儲器期間,P0 也可以被配置為復(fù)用的低位地址/數(shù)據(jù)總線。
在這種模式下,P0 具有內(nèi)部上拉。
----------------------
在上述的數(shù)據(jù)文件中,已經(jīng)明確說明,P0 口的引腳,是“開漏”的。
P0 可以輸出低電平,驅(qū)動 8 個 TTL 器件的輸入引腳。令 P0 輸出 1,它只能當(dāng)做高阻的輸入端,而輸出不了 1。
只有在訪問期間外部程序和數(shù)據(jù)存儲器時,引腳內(nèi)部才有上拉的功能,這時才是“三態(tài)門”。
----------------------
“P0端口由于輸出有三態(tài)功能,輸入前,端口線已處于高阻態(tài),無需先寫入l后再作讀操作。”
不太明白。從圖中看出P0要是不置位的話,T2就會導(dǎo)通了。輸入信號不都變成0了嗎?
做而論道回答如下:
首先,《P0端口由于輸出有三態(tài)功能,》這句話,就是錯誤的。
作為 IO 口使用時,P0,只有輸出0 和高阻態(tài),兩種,并不能輸出1,談不上三態(tài)。
《P0端口由于輸出有三態(tài)功能,》這句話,用在總線方式,還可以;
但是,總線方式,就和《先寫入1再讀》毫無關(guān)系了。
--------------
第二,《輸入前,端口線已處于高阻態(tài)》這句話,只是作者自己的臆想而已。
輸入前,如果輸出了0,顯然就不是高阻態(tài)。
--追問:
--讀鎖存器,是不是先會將引腳信號通過D鎖存后,再關(guān)閉引腳,然后再讀鎖存器啊。
--如果不是的話,那圖中進(jìn)入總線的輸入信號從 何而來呢?
?
做而論道回答:
讀鎖存器,就是讀先前曾經(jīng)輸出的內(nèi)容,和引腳無關(guān)。
讀鎖存器,用的是一些特殊的指令,即稱為《讀_改_寫》的指令。
比如:ANL ? P0, #0FH。
這條指令,自動打開圖中上邊的三態(tài)門,信號由 D 經(jīng)過三態(tài)門,流動到內(nèi)部總線(如粗紅線所示);
再和 0FH 相與之后,再寫入鎖存器;
最后輸出到 P0 引腳。
--追問:
--謝謝詳細(xì)解答~~。另外,有些不解的是:
--讀鎖存器,是 屬于'輸入'的情況嗎?
--如果是,那輸入的信號只能從下面的”緩沖器“部分進(jìn)來啊。要不然,讀的是以前的信息,跟外部信息 沒有關(guān)系啊。
做而論道回答:
前面已經(jīng)說過了:讀鎖存器,就是讀先前曾經(jīng)輸出的內(nèi)容,和引腳無關(guān)。
《讀_改_寫》指令,如:ANL ? P0, #0FH
這里的 P0,并非是馬上,去讀一下引腳的信號,而是讀鎖存器,也就是讀出以前曾經(jīng)輸出的。