前面我們簡單的學習了C51的IO結構,現在我們來看看,準雙向IO口如何使用按鍵輸入
這是準雙向IO的基本結構,單片機就靠內部輸入線來讀取IO的電平狀態。
我們以這個電路分析準雙向IO上的按鍵使用
在準雙向口中,我們需要先給IO寫高電平才能去讀取IO的電平變化(高->低)
在寫高電平的情況下……
三極管截止
沒有按下按鍵,電流由正極經過上拉電阻流到內部輸入線路,這時候內部讀出高電平
這時候按下按鍵,按下按鍵,電流由VCC流經上拉電阻再流經按鍵最后流向GND。由于電流由正極流向負極。內部輸入線路線路的電流流向負極,這時候讀出的數值就是低電平的
如果我們寫IO是低電平的話,三極管始終導通,內部輸入的電流經過三極管接到負極,這時候無論有沒有按下按鍵,都只能讀出低電平
按鍵的電路
我們使用的開發板有四個獨立按鍵,這四個獨立按鍵接在P3.2 - P3.4
我們使用單片機準雙向IO提供的IO內部的上拉電阻,所以不需要外部上拉電阻
首先,需要使用sbit定義我們的按鍵所連接的IO
sbit KEY = P3^4;
接下來,給這個按鍵所屬的IO寫高電平
KEY = 1;
讀取按鍵按下的代碼
if(KEY == 0)
{
unsigned char a = 550;
while(a--);//延遲消抖
if(KEY == 0)
{
while(!KEY);//檢測按鍵是否松開,防止連按
//這里是你的要放下按鍵按下后執行的代碼
}
}
這里需要說明一下
if(KEY == 0)用于讀取按鍵是否按下按鍵,讀取方式直接用KEY == 0,KEY == 1直接讀取這一位IO寄存器值。
當我們第一次讀取之后,還需要延遲一會再次讀取按鍵,我們把這個過程稱為延遲消抖
這是因為我們使用的按鍵是物理按鍵,內部的簡化結構如圖
按鍵上面有一個彈片,按下按鍵彈片后觸點接觸,按鍵導通,松開按鍵,彈片回彈,按鍵斷開,電壓的變化總是高電平》低電平》高電平
上面描述的是理想狀態,但是實際上,物理按鍵并不像我們想象如此理想,當我們按下按鍵的時候,按鍵的彈片會發生震動,導致電壓會有一定的抖動幅度
這些幅度的抖動會影響單片機對按鍵的讀取和識別
我們可以用硬件電路消抖,下面展示一個簡單的硬件消抖電路
在這個電路里面,一顆0.1u的電容用于消除抖動,電容充放電實現消抖的效果
那么為什么不使用上面的電路實現消抖呢??
答案很簡單——成本高嘛
所以我們使用軟件消抖
if(KEY == 0)
{
unsigned char a = 550;
while(a--);//延遲消抖
if(KEY == 0)
{
while(!KEY);//檢測按鍵是否松開,防止連按
//這里是你的要放下按鍵按下后執行的代碼
}
}
單片機先讀取按鍵引腳的電平,軟件延遲后再次讀取后再次讀取按鍵的電平,如果還是按下的狀態,那么就開始等待按鍵松開,等待按鍵松開是必要的,如果不等待按鍵松開,可能我們按下按鍵久一點按鍵就變成多次連按了
那么下面就是一個簡單的項目,按鍵開關LED燈
/*
按鍵學習
按鍵按下,LED實現開關
青青子衿工作室
Zi Jin Code
*/
#include < reg52.h >
sbit LED = P1^0;
sbit KEY = P3^3;
void main()
{
KEY = 1;//使用按鍵之前,對應的引腳寫高電平
LED = 1;
while(1)
{
if(KEY == 0)
{
unsigned int a = 550;
while(a--);//延遲消抖
if(KEY == 0)//再次檢測...
{
while(!KEY){}//檢測按鍵是否松開
LED = !LED;//LED狀態取反
}
}
}
}
編譯并且上傳程序,測試
-
三極管
+關注
關注
145文章
3651瀏覽量
123925 -
單片機
+關注
關注
6061文章
44914瀏覽量
646636 -
led燈
+關注
關注
22文章
1594瀏覽量
109326 -
C51單片機
+關注
關注
12文章
164瀏覽量
35273 -
獨立按鍵
+關注
關注
1文章
45瀏覽量
11779
發布評論請先 登錄
C51單片機實現獨立按鍵點亮LED燈
單片機C51編程規范
C51單片機學習筆記(三)——按鍵對燈、蜂鳴器等器件的控制

評論