AT89S52單片機(jī)P3口解惑
AT89S52單片機(jī)P3端口有第二功能,如下所示:
P3.0 RXD (串行接口輸入)
P3.1 TXD (串行接口輸出)
P3.2 INT0 (外部中斷0輸入)
P3.3 INT1 (外部中斷1輸入)
P3.4 T0 (定時/計數(shù)器0的外部輸入)
P3.5 T1 (定時/計數(shù)器1的外部輸入)
P3.6 WR (片外數(shù)據(jù)存儲器 “寫”選通控制輸出)
P3.7 RD (片外數(shù)據(jù)存儲器 “讀” 選通控制輸出)
P3接口相應(yīng)接口線處于第二功能,應(yīng)滿足的條件:
(1) 串行I/0口處于運行狀態(tài)(RXD、TXD)
(2)外部中斷已經(jīng)打開(INT0、INT1)
(3)定時器/計數(shù)器處于外部計數(shù)狀態(tài)(T0、T1)
(4)執(zhí)行讀/寫外部RAM的指令(RD、WR)
但是,疑問是P3接口的一位接口線倘若處于設(shè)置成第二功能,是否就不能用作第一功能的通用I/O口呢?做以下實驗:
#include
#include
sbitRXD_IO=P3^0;
sbitTXD_IO=P3^1;
sbitINT0_IO=P3^2;
sbitINT1_IO=P3^3;
sbitT0_IO=P3^4;
sbitT1_IO=P3^5;
voidmain(void)
{
SCON=0x50;
ES=1;
TMOD=0x55;
ET0=1;
TR0=1;
ET1=1;
TR1=1;
IT0=1;
EX0=1;
EA=1;
#progarm //延時一段時間
RXD_IO=0;
TXD_IO=0;
INT0_IO=0;
INT1_IO=0;
T0_IO=0;
T1_IO=0;
while(1);
}
實驗結(jié)果是:所有的接口都能像通用I/O口那樣正常輸出。實際上做了另一個實驗,所有的接口也能正常讀入。
結(jié)論:即使將P3接口設(shè)置成第二功能,但是第一功能的通用I/O口功能仍然存在。
試想,一個端口怎么可能同時有兩種功能呢,但是實驗結(jié)果如此,該當(dāng)如何解釋?
一個合理的解釋:一個端口不可能同時有兩種功能,而上述實驗結(jié)論只是給人的印象是“同時”。當(dāng)單片機(jī)的
P3端口的第二功能打開后,例如外部中斷0,這個外設(shè)并不會一直檢測是否有外部觸發(fā)信號輸入,而是在機(jī)器
周期內(nèi)只在特定的時刻的時刻來檢測,或者說只在特定的時刻執(zhí)行這個第二功能,其他時間并沒有執(zhí)行這個第
而功能,這樣就可以當(dāng)做第一功能的普通I/O口來使用。
評價:51單片機(jī)這種多功能I/O口并不能很好的分離兩種功能,在使用第二功能時,有可能會因為使用第一功能
而與第二功能沖突,這是危險的。
單片機(jī)P0、P1、P2口在作為通用I/O口時被稱為“準(zhǔn)雙向口”,為什么?
準(zhǔn)雙向口,指的是I/O口在作為輸入時,由于上拉電阻的存在,它只能讀入兩種狀態(tài),“0”(低電平)和“非0”
(高電平),而不能像真正的雙向I/O口那樣能讀入三種狀態(tài)“0”(低電平)、“1”(高電平)和“Z”(高阻態(tài))。
具體說來就是,如果給單片機(jī)I/O口不輸入信號,這時它讀入的是“1”(高電平),這在大多數(shù)情況下不能算作錯誤。