前面我們簡(jiǎn)單的學(xué)習(xí)了C51的IO結(jié)構(gòu),現(xiàn)在我們來看看,準(zhǔn)雙向IO口如何使用按鍵輸入
這是準(zhǔn)雙向IO的基本結(jié)構(gòu),單片機(jī)就靠?jī)?nèi)部輸入線來讀取IO的電平狀態(tài)。
我們以這個(gè)電路分析準(zhǔn)雙向IO上的按鍵使用
在準(zhǔn)雙向口中,我們需要先給IO寫高電平才能去讀取IO的電平變化(高->低)
在寫高電平的情況下……
三極管截止
沒有按下按鍵,電流由正極經(jīng)過上拉電阻流到內(nèi)部輸入線路,這時(shí)候內(nèi)部讀出高電平
這時(shí)候按下按鍵,按下按鍵,電流由VCC流經(jīng)上拉電阻再流經(jīng)按鍵最后流向GND。由于電流由正極流向負(fù)極。內(nèi)部輸入線路線路的電流流向負(fù)極,這時(shí)候讀出的數(shù)值就是低電平的
如果我們寫IO是低電平的話,三極管始終導(dǎo)通,內(nèi)部輸入的電流經(jīng)過三極管接到負(fù)極,這時(shí)候無論有沒有按下按鍵,都只能讀出低電平
按鍵的電路
我們使用的開發(fā)板有四個(gè)獨(dú)立按鍵,這四個(gè)獨(dú)立按鍵接在P3.2 - P3.4
我們使用單片機(jī)準(zhǔn)雙向IO提供的IO內(nèi)部的上拉電阻,所以不需要外部上拉電阻
首先,需要使用sbit定義我們的按鍵所連接的IO
sbit KEY = P3^4;
接下來,給這個(gè)按鍵所屬的IO寫高電平
KEY = 1;
讀取按鍵按下的代碼
if(KEY == 0)
{
unsigned char a = 550;
while(a--);//延遲消抖
if(KEY == 0)
{
while(!KEY);//檢測(cè)按鍵是否松開,防止連按
//這里是你的要放下按鍵按下后執(zhí)行的代碼
}
}
這里需要說明一下
if(KEY == 0)用于讀取按鍵是否按下按鍵,讀取方式直接用KEY == 0,KEY == 1直接讀取這一位IO寄存器值。
當(dāng)我們第一次讀取之后,還需要延遲一會(huì)再次讀取按鍵,我們把這個(gè)過程稱為延遲消抖
這是因?yàn)槲覀兪褂玫陌存I是物理按鍵,內(nèi)部的簡(jiǎn)化結(jié)構(gòu)如圖
按鍵上面有一個(gè)彈片,按下按鍵彈片后觸點(diǎn)接觸,按鍵導(dǎo)通,松開按鍵,彈片回彈,按鍵斷開,電壓的變化總是高電平》低電平》高電平
上面描述的是理想狀態(tài),但是實(shí)際上,物理按鍵并不像我們想象如此理想,當(dāng)我們按下按鍵的時(shí)候,按鍵的彈片會(huì)發(fā)生震動(dòng),導(dǎo)致電壓會(huì)有一定的抖動(dòng)幅度
這些幅度的抖動(dòng)會(huì)影響單片機(jī)對(duì)按鍵的讀取和識(shí)別
我們可以用硬件電路消抖,下面展示一個(gè)簡(jiǎn)單的硬件消抖電路
在這個(gè)電路里面,一顆0.1u的電容用于消除抖動(dòng),電容充放電實(shí)現(xiàn)消抖的效果
那么為什么不使用上面的電路實(shí)現(xiàn)消抖呢??
答案很簡(jiǎn)單——成本高嘛
所以我們使用軟件消抖
if(KEY == 0)
{
unsigned char a = 550;
while(a--);//延遲消抖
if(KEY == 0)
{
while(!KEY);//檢測(cè)按鍵是否松開,防止連按
//這里是你的要放下按鍵按下后執(zhí)行的代碼
}
}
單片機(jī)先讀取按鍵引腳的電平,軟件延遲后再次讀取后再次讀取按鍵的電平,如果還是按下的狀態(tài),那么就開始等待按鍵松開,等待按鍵松開是必要的,如果不等待按鍵松開,可能我們按下按鍵久一點(diǎn)按鍵就變成多次連按了
那么下面就是一個(gè)簡(jiǎn)單的項(xiàng)目,按鍵開關(guān)LED燈
/*
按鍵學(xué)習(xí)
按鍵按下,LED實(shí)現(xiàn)開關(guān)
青青子衿工作室
Zi Jin Code
*/
#include < reg52.h >
sbit LED = P1^0;
sbit KEY = P3^3;
void main()
{
KEY = 1;//使用按鍵之前,對(duì)應(yīng)的引腳寫高電平
LED = 1;
while(1)
{
if(KEY == 0)
{
unsigned int a = 550;
while(a--);//延遲消抖
if(KEY == 0)//再次檢測(cè)...
{
while(!KEY){}//檢測(cè)按鍵是否松開
LED = !LED;//LED狀態(tài)取反
}
}
}
}
編譯并且上傳程序,測(cè)試
-
三極管
+關(guān)注
關(guān)注
142文章
3607瀏覽量
121823 -
單片機(jī)
+關(guān)注
關(guān)注
6034文章
44541瀏覽量
634133 -
led燈
+關(guān)注
關(guān)注
22文章
1592瀏覽量
107918 -
C51單片機(jī)
+關(guān)注
關(guān)注
12文章
164瀏覽量
34750 -
獨(dú)立按鍵
+關(guān)注
關(guān)注
1文章
45瀏覽量
11551
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論