韓彩霞
(江漢大學(xué)文理學(xué)院,湖北 武漢 430056)
我們通過(guò)如下實(shí)例來(lái)說(shuō)明P0口使用中需要注意的問(wèn)題。
如:在51單片機(jī)的P 0.7上接開(kāi)關(guān),P2.3上接LED,開(kāi)關(guān)控制LED的點(diǎn)亮和熄滅(開(kāi)關(guān)閉合,LED點(diǎn)亮;開(kāi)關(guān)斷開(kāi),LED熄滅)。電路如圖1所示。主程序如下:
#include
sbit K1=P0^7;
sbit LED=P2^3;
voidmain(void)
{while(1)
{if(K1==0)
{LED=1; //燈亮
}
else{LED=0; //燈滅
}
}
}
圖1 開(kāi)關(guān)控制LED圖(不接上拉電阻)
把上述程序在KeilC軟件中進(jìn)行編譯沒(méi)有錯(cuò)誤后,生成HEX文件。然后進(jìn)行proteus軟件仿真。仿真結(jié)果如圖2所示。
圖2 開(kāi)關(guān)控制LED仿真圖(不接上拉電阻)
由圖2(a)可以看出,當(dāng)開(kāi)關(guān)斷開(kāi)時(shí)P0.7引腳電平為灰色顯示,表示是高阻抗?fàn)顟B(tài)(這里可以把它看作是低電平)。由圖2(b)可知:仿真開(kāi)始后(開(kāi)關(guān)從(a)圖變化到(b)圖的狀態(tài))無(wú)論開(kāi)關(guān)斷開(kāi)或閉合,LED的狀態(tài)都沒(méi)有變化,也就是說(shuō)開(kāi)關(guān)根本沒(méi)有控制LED的點(diǎn)亮或熄滅。
下面我們把圖1改成圖3的形式,即在P0.7引腳上外接一個(gè)上拉電阻R1,程序沒(méi)有變化,同樣進(jìn)行如上的proteus軟件仿真,仿真結(jié)果如圖3(a)、(b)所示。
圖3 開(kāi)關(guān)控制LED仿真圖(接上拉電阻)
由圖3(a)可以看出,當(dāng)開(kāi)關(guān)斷開(kāi)時(shí)P0.7引腳旁電平為紅色顯示,表示為高電平。由圖3(b)可知:仿真開(kāi)始后(開(kāi)關(guān)從(a)圖變化到(b)圖的狀態(tài))開(kāi)關(guān)斷開(kāi),LED熄滅;開(kāi)關(guān)閉合,LED點(diǎn)亮。實(shí)現(xiàn)了開(kāi)關(guān)閉合或斷開(kāi)控制LED點(diǎn)亮或熄滅。
出現(xiàn)上面的情況是由于51單片機(jī)P0口內(nèi)部結(jié)構(gòu)決定的。
因?yàn)?1單片機(jī)P0口內(nèi)部沒(méi)有上拉電阻,所以圖2(a)中P0.7為高阻抗?fàn)顟B(tài)(低電平),要使開(kāi)關(guān)斷開(kāi)P0.7呈現(xiàn)高電平,須外接上拉電阻,如圖3所示,這樣在P0口才能有真正的高電平輸出。
那么是不是使用P0口時(shí)都需要外接上拉電阻呢?通過(guò)以下分析來(lái)說(shuō)明這個(gè)問(wèn)題。
我們把圖3改成如圖4所示的形式。同樣進(jìn)行proteus軟件仿真,仿真結(jié)果如圖4所示。
圖4 開(kāi)關(guān)控制LED 仿真圖
由圖4(a)和(b)可以看出,無(wú)論開(kāi)關(guān)斷開(kāi)還是閉合,LED的狀態(tài)始終沒(méi)有。這是因?yàn)殚_(kāi)關(guān)斷開(kāi)或閉合引腳P0.7始終是高電平。我們把圖4中P0.7口上接的電阻去掉,得到圖5的形式。同樣進(jìn)行proteus軟件仿真,仿真結(jié)果如圖5所示。
圖5 開(kāi)關(guān)控制LED仿真圖
由圖5我們可以看出,開(kāi)關(guān)斷開(kāi)或閉合可以控制LED熄滅或點(diǎn)亮。
從以上分析可知:當(dāng)使用P0口時(shí),如需要在P0口上出現(xiàn)高電平時(shí)(如圖3所示),才需要在P0口上外接上拉電阻。
這一點(diǎn)在使用51單片機(jī)P0口時(shí)一定要注意的,否則就會(huì)出現(xiàn)問(wèn)題。
但是,對(duì)于51單片機(jī)的其它3個(gè)I/O口來(lái)說(shuō),因?yàn)樗鼈冏陨韮?nèi)部有上拉電阻,所以就不存在以上的情況。
我們通過(guò)以下實(shí)例來(lái)分析問(wèn)題。如圖6所示,在P2口的P2.0和2.1分別接有開(kāi)關(guān)K1和K2,在P3口的P3.0和P3.1分別接有LED1和LED2,實(shí)現(xiàn)把開(kāi)關(guān)K1、K2的四種狀態(tài)(K1、K2全閉合;K1閉合、K2斷開(kāi);K1斷開(kāi)、K2閉合;K1、K2全斷開(kāi))反應(yīng)到LED1和LED2上。(即開(kāi)關(guān)閉合對(duì)應(yīng)的LED點(diǎn)亮,開(kāi)關(guān)斷開(kāi)對(duì)應(yīng)的LED熄滅)程序如下所示。
#include
voidmain(void)
{char a;
a=P2; //把開(kāi)關(guān)狀態(tài)讀入,送給變量a(P2口作為輸入口使用)
a=a&03; //保留開(kāi)關(guān)狀態(tài)(P2.0和P2.1)
P3=~a;//開(kāi)關(guān)狀態(tài)取反后送給LED(P3口作為輸出口使用)}
圖6 兩個(gè)開(kāi)關(guān)控制兩個(gè)LED仿真圖
由圖6(在此只給出開(kāi)關(guān)K1、K2的兩種狀態(tài))可知:開(kāi)關(guān)K1、K2的閉合斷開(kāi)可以控制LED1、LED2的點(diǎn)亮和熄滅。
把圖6改成圖7的形式,在P2口的P2.0和2.1分別接有開(kāi)關(guān)K1和K2,在P2口的P2.2和P2.3分別接有LED1和LED2,同樣完成上述的功能,即把開(kāi)關(guān)K1、K2的四種狀態(tài)反應(yīng)到LED1和LED2上。同時(shí),程序改成如下的形式。
#include
voidmain(void)
{char a;
a=P2; //把開(kāi)關(guān)狀態(tài)讀入,送給變量a(P2口作為輸入口使用)
a=a&03; //保留開(kāi)關(guān)狀態(tài)(P2.0和P2.1)
P2=~a<<2;//開(kāi)關(guān)狀態(tài)取反,左移兩位送給LED(P2口作為輸出口使用)
}
圖7 兩個(gè)開(kāi)關(guān)控制兩個(gè)LED仿真圖
由圖7(在此只給出開(kāi)關(guān)K1、K2的兩種狀態(tài))可知:開(kāi)關(guān)K1、K2的閉合斷開(kāi)不能控制LED1、LED2的點(diǎn)亮和熄滅。
出現(xiàn)以上情況是由于在圖7中P2口既作為輸入口使用又作為輸出口使用時(shí),由于P2口內(nèi)部結(jié)構(gòu)決定,需要先給P2口輸入“1”,然后才能正確讀入開(kāi)關(guān)的狀態(tài)。我們把上述程序修改成如下形式:
#include
voidmain(void)
{char a;
P2=0xff;//P2口作為輸入口使用時(shí),先寫(xiě)1
a=P2; //把開(kāi)關(guān)狀態(tài)讀入,送給變量a(P2口作為輸入口使用)
a=a&03;//保留開(kāi)關(guān)狀態(tài)(P2.0和P2.1)
P2=~a<<2;//開(kāi)關(guān)狀態(tài)取反,左移兩位送給LED(P2口作
為輸出口使用)
}
即在程序開(kāi)始增加語(yǔ)句:P2=0xff;(P2口作為輸入口使用時(shí),先輸入1),同樣進(jìn)行仿真后就可以完成上述的要求。
由以上分析可知:當(dāng)并行I/O口P2口同時(shí)作為輸入/輸出口使用時(shí),需要先給其寫(xiě)“1”,但是如只作為輸入或輸出口使用時(shí),不需要這樣的處理。
這里只分析了51單片機(jī)P2口的情況,對(duì)于51單片機(jī)其它的I/O口是同樣的,當(dāng)同時(shí)作為輸入/輸出口時(shí),需要先給其寫(xiě)“1”。
[1]彭偉.單片機(jī)C語(yǔ)言程序設(shè)計(jì)實(shí)例100例[M].北京:電子工業(yè)出版社,2011.
[2]姜志海.單片機(jī)的C語(yǔ)言程序設(shè)計(jì)及應(yīng)用[M].北京:電子工業(yè)出版社,2011.
[3]梅麗鳳.單片機(jī)原理及接口技術(shù)(修訂本)[M].北京:清華大學(xué)出版社,2011.
[4]鄒益民.單片機(jī)C語(yǔ)言教程[M].北京:中國(guó)石化出版社,2011.
[5]張蕊.C語(yǔ)言程序設(shè)計(jì)教程.武漢:華中科技大學(xué)出版社,2009.