51單片機——獨立鍵盤輸入

一.認識按鍵

在這裏插入圖片描述
如上圖所示爲直插式按鍵,按下按鍵後鬆手按鍵立即彈起。有4個引腳,可以看出4各引腳每兩個向內彎曲,彎曲的對立面兩個引腳導通,其餘不導通。即1和4之間是導通的,2和3之間是導通的,而1和2,3和4之間是不導通的,只有按下按鍵才能使其導通。

二.P3口的第二功能

在不使用第二功能時它就是普通的I/O口。
P3口第二功能表

引腳 第二功能
P3.0 RxD:串行口接收數據輸入端
P3.1 TxD:串行口發送數據輸出端
P3.2 TNT0:外部中斷申請輸入端0
P3.3 TNT1:外部中斷申請輸入端1
P3.4 T0:外部計數脈衝輸入端0
P3.5 T1:外部計數脈衝輸入端1
P3.6 WR:寫外設控制信號輸出端
P3.7 RD:讀外設控制信號輸出端

三.按鍵消抖

鍵盤軟件消抖

按鍵一般是利用機械觸點的閉合、斷開作用,由於機械觸點的彈性作用,在其閉合、斷開瞬間均有抖動過程,抖動時間一般在5一10mS,穩定閉合時間由操作人員的按鍵動作決定,一般爲零點幾秒到幾秒。爲了保證單片機對一次閉合,僅作一次鍵輸入操作,必須在編程時候編寫必要的程序代碼來去除抖動影響,稱鍵盤軟件消抖。

判斷鍵一次按下的具體方法

先判斷鍵是否按下,若按下了延時10 ms,跳過按下抖動期,然後再判斷按鍵是否按下,若是說明按鍵真的按下了,否則說明是干擾信號,如果鍵真的按下了,則等待鍵釋放,如果鍵釋放了,延時10 ms,再判斷鍵是否釋放,若釋放了,說明按鍵真的釋放了,否則說明是干擾信號,如果按鍵真的釋放了,說明一次完整的按鍵過程完成了。在一次完整的按鍵後,可以連接該鍵對應的功能程序段,以實現特定的功能。
在這裏插入圖片描述

硬件消抖

利用電容的放電延時,採用並聯電容法,電路圖如下所示:
在這裏插入圖片描述
除了利用電容進行消抖,也可利用RS觸發器:
在這裏插入圖片描述

四.程序流程圖(程序思路)

Created with Raphaël 2.2.0檢測按鍵是否按下延時消抖檢測按鍵是否按下執行按鍵按下之後要執行的程序檢測按鍵是否鬆手
Created with Raphaël 2.2.0開始鍵是否按下?延時10ms 鍵是否按下? 鍵是否釋放?延時10ms 鍵是否釋放?執行改鍵對應的功能程序段 結束yesnoyesnoyesnoyesno

五.實現代碼與電路

1.一個按鍵控制兩個LED燈

按鍵按下後,兩個燈亮起,按鍵鬆開,燈滅
代碼

 //獨立鍵盤輸入
 #include<reg51.h>
 sbit led1=P1^0;  //red
 sbit led2=P1^1;  //red
 sbit k1=P3^4;
 void main()
 {
 P1=0xff;   //熄滅所有LED燈
 while(1)
 {
    if(k1==0)  
    {
    led1=0;
    led2=0;
    }
    else
    {
    led1=1;
    led2=1;
    }
 }
 }

電路原理圖
在這裏插入圖片描述

2.四個按鍵控制八個LED燈

按鍵按下後,兩個燈亮起,按鍵鬆開,燈滅,以此對應4個按鍵
代碼

 //獨立鍵盤輸入
 #include<reg51.h>
 sbit led1=P1^0;  //red
 sbit led2=P1^1;  //red
 sbit led3=P1^2;  //blue
 sbit led4=P1^3;  //blue
 sbit led5=P1^4;  //yellow
 sbit led6=P1^5;  //yellow
 sbit led7=P1^6;  //green
 sbit led8=P1^7;  //green
 sbit k1=P3^4;
 sbit k2=P3^5;
 sbit k3=P3^6;
 sbit k4=P3^7;
 void main()
 {
  P1=0xff; 
 while(1)
 {
  /*  if(k1==0)  
    {
    led1=0;
    led2=0;
    }
    else
    {
    led1=1;
    led2=1;
    }
    if(k2==0)   
    {
    led3=0;
    led4=0;
    }
    else
    {
    led3=1;
    led4=1;
    }if(k3==0)
    {
    led5=0;
    led6=0;
    }
    else
    {
    led5=1;
    led6=1;
    }if(k4==0)  
    {
    led7=0;
    led8=0;
    }
    else
    {
    led7=1;
    led8=1;
    }   */
    //優化之後
   led1=k1;
   led2=k1;
   led3=k2;
   led4=k2;
   led5=k3;
   led6=k3;
   led7=k4;
   led8=k4;
 }
 }

電路原理圖
在這裏插入圖片描述

3.利用按鍵改變LED燈的狀態

按下第一個按鍵,鬆開按鍵後,第一個LED燈改變狀態
因爲此時要不管檢測是否有按下,因此要加防消抖編程代碼
代碼

#include<reg51.h>
#include"delay.h"
sbit led1=P1^0;
sbit k1=P3^4;
void main()
{
  P1=0xff;
  while(1)
  {
  if(k1==0)    //判斷是否有按下按鍵的信號
  {
  delay(10);  //延時10ms,消抖
    if(k1==0) //再次判斷按鍵是否被按下
    {
    while(k1==0);  //直到按鍵判斷鬆開,此處若k1==0,按鍵一直按下,則在此處程序死循環
    led1=~led1;  //取反即改變狀態
    }
  }
  }
}

電路原理圖
在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章