關(guān)于51 單片機(jī)的 P0 口問(wèn)題
遇到了幾個(gè)問(wèn)題,都是說(shuō) P0 口可以輸出 1 的,
P0 口內(nèi)部的電路圖,并不是人人都可以看懂的,很多人都要看文字說(shuō)明。
但是,有些說(shuō)明寫的,很是差強(qiáng)人意,接口電路的基本功能特點(diǎn),往往都解釋錯(cuò)了。
在單片機(jī)的外部擴(kuò)充存儲(chǔ)空間時(shí),有一種三總線方式,此時(shí),P0 口,將負(fù)責(zé)對(duì)外部芯片傳送數(shù)據(jù)和低八位地址。
這時(shí),P0 口就是以三態(tài)門的特點(diǎn)來(lái)工作,即可以輸出高、低電平,還可以切斷與外界的聯(lián)系,在引腳上呈現(xiàn)“高阻態(tài)”。
就目前來(lái)看,絕大部分單片機(jī)系統(tǒng)都不使用三總線形式來(lái)擴(kuò)充外部空間了,三態(tài)門的現(xiàn)象,基本上,已經(jīng)看不到了。
現(xiàn)在一般都是把 P0 口當(dāng)一般的 IO 接口來(lái)使用。此時(shí),P0 口就只有兩種狀態(tài):輸出低電平和高阻態(tài)。
想要讓 P0 口輸出 1,單片機(jī)就沒(méi)有這種能力了。
----------------------
在英文版的 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)上的翻譯軟件,把它們譯成中文,再簡(jiǎn)單整理如下:
P0
P0 是一個(gè) 8 位漏極開(kāi)路雙向 I/O 端口。
作為一個(gè)輸出端口,每個(gè)引腳可以吸收 8 個(gè) TTL 輸入。
當(dāng)把 1 寫入 P0 引腳,這些引腳可以用作高阻抗輸入。
在訪問(wèn)期間外部程序和數(shù)據(jù)存儲(chǔ)器期間,P0 也可以被配置為復(fù)用的低位地址/數(shù)據(jù)總線。
在這種模式下,P0 具有內(nèi)部上拉。
----------------------
在上述的數(shù)據(jù)文件中,已經(jīng)明確說(shuō)明,P0 口的引腳,是“開(kāi)漏”的。
P0 可以輸出低電平,驅(qū)動(dòng) 8 個(gè) TTL 器件的輸入引腳。令 P0 輸出 1,它只能當(dāng)做高阻的輸入端,而輸出不了 1。
只有在訪問(wèn)期間外部程序和數(shù)據(jù)存儲(chǔ)器時(shí),引腳內(nèi)部才有上拉的功能,這時(shí)才是“三態(tài)門”。
----------------------
“P0端口由于輸出有三態(tài)功能,輸入前,端口線已處于高阻態(tài),無(wú)需先寫入l后再作讀操作。”
不太明白。從圖中看出P0要是不置位的話,T2就會(huì)導(dǎo)通了。輸入信號(hào)不都變成0了嗎?
做而論道回答如下:
首先,《P0端口由于輸出有三態(tài)功能,》這句話,就是錯(cuò)誤的。
作為 IO 口使用時(shí),P0,只有輸出0 和高阻態(tài),兩種,并不能輸出1,談不上三態(tài)。
《P0端口由于輸出有三態(tài)功能,》這句話,用在總線方式,還可以;
但是,總線方式,就和《先寫入1再讀》毫無(wú)關(guān)系了。
--------------
第二,《輸入前,端口線已處于高阻態(tài)》這句話,只是作者自己的臆想而已。
輸入前,如果輸出了0,顯然就不是高阻態(tài)。
--追問(wèn):
--讀鎖存器,是不是先會(huì)將引腳信號(hào)通過(guò)D鎖存后,再關(guān)閉引腳,然后再讀鎖存器啊。
--如果不是的話,那圖中進(jìn)入總線的輸入信號(hào)從 何而來(lái)呢?
?
做而論道回答:
讀鎖存器,就是讀先前曾經(jīng)輸出的內(nèi)容,和引腳無(wú)關(guān)。
讀鎖存器,用的是一些特殊的指令,即稱為《讀_改_寫》的指令。
比如:ANL ? P0, #0FH。
這條指令,自動(dòng)打開(kāi)圖中上邊的三態(tài)門,信號(hào)由 D 經(jīng)過(guò)三態(tài)門,流動(dòng)到內(nèi)部總線(如粗紅線所示);
再和 0FH 相與之后,再寫入鎖存器;
最后輸出到 P0 引腳。
--追問(wèn):
--謝謝詳細(xì)解答~~。另外,有些不解的是:
--讀鎖存器,是 屬于'輸入'的情況嗎?
--如果是,那輸入的信號(hào)只能從下面的”緩沖器“部分進(jìn)來(lái)啊。要不然,讀的是以前的信息,跟外部信息 沒(méi)有關(guān)系啊。
做而論道回答:
前面已經(jīng)說(shuō)過(guò)了:讀鎖存器,就是讀先前曾經(jīng)輸出的內(nèi)容,和引腳無(wú)關(guān)。
《讀_改_寫》指令,如:ANL ? P0, #0FH
這里的 P0,并非是馬上,去讀一下引腳的信號(hào),而是讀鎖存器,也就是讀出以前曾經(jīng)輸出的。