前言
上一節,我們完成了51單片機控制LED燈,並實現流水燈效果,本節我們學習操作獨立按鍵,並通過兩個按鍵,分別打開和關閉所有LED燈,按鍵作為輸入設備,在系統開發過程中十分常見,一般來說,按鍵可以設置系統參數、控制系統運行狀態。
一、基礎知識
1.按鍵簡介
通常的按鍵所用開關為機械彈性開關,當機械觸點斷開、閉合時,電壓信號會發生變化,常見的按鍵開關如下圖所示,其中A端引腳在同側,默認斷開,B端引腳在不在同側,默認導通,當按鍵按下時,A端導通,B端斷開。
此類開關,按下時候通常不會立刻導通,開和關的瞬間伴有一連串抖動,一般為5ms到10ms,具體抖動時間由按鍵機械特性決定,抖動過程如下圖所示:
為了解決這個問題,通常可以採用硬件消抖和軟件消抖兩種方式,硬件消抖原理是利用電容平波,再經過施密特反相器整形之後就得到了沒有毛刺的脈衝波,大多數實際項目中為了節約成本,通常採用軟件濾波方式,軟件濾波一般採用延時方式處理,當首次檢測到按鍵按下時,軟件延時10ms左右時間,然後再次查看按鍵狀態,如果還是按下則認為有按鍵按下。
2.按鍵檢測原理
簡單的獨立按鍵連接電路原理圖如下所示
獨立按鍵電路中,按鍵一邊接GND,另一邊接到單片機IO口上,當按鍵按下時候,按鍵兩邊1和2導通,單片機P2.5引腳直接連接GND,電平為低電平,所以只需要讓單片機不斷的檢測P2.5引腳的I/O口是否為低電平,一旦程序檢測到I/O口引腳變為低電平說明按鍵按下了。
3.開發板按鍵硬件電路
實驗使用開發板獨立按鍵部分原理圖如下,K1、K2、K3、K4四個按鍵一端引腳均接地,另一端接到單片機不同I/O口,可以根據不同I/O口的電平檢測按鍵是否按下。
二、實例
1.創建工程
將上一節工程複製出來,並修改名字為02-key
2.程序修改
<code>w sbit key1 = P2^4
; sbit key2 = P2^5
;unsigned
char
val =0
;void
delay_ms
(
int
ms) {int
i =0
, j =0
;for
(i = ms; i >0
; i--) {for
(j =110
; j >0
; j--); } }int
main
(
void
) {while
(1
) {if
(0
== key1 ||0
== key2) { delay_ms(10
);if
(0
== key1) { P1 =0x00
; }if
(0
== key2) { P1 =0xFF
; } } delay_ms(5
); } }/<code>
程序中檢測KEY1和KEY2的狀態,當按下KEY1時候,點亮LED3-LED10 8個LED燈,KEY2按鍵按下時候,熄滅LED3-LED10。
三、運行
編譯代碼後,按照第一節內容,將生成的project.hex文件下載到板子中,按下KEY1時候,效果如下圖所示:
點擊KEY2時候,燈熄滅,由於比較簡單,就不放圖了。
一葉孤沙出品:一沙一世界,一葉一菩提
硬件獲取:某寶搜小驛物聯