51單片機按鍵控制LED燈亮滅的N個玩法
1.概述
這篇文章介紹按鍵的使用,以及通過控制LED燈的小實驗,發現按鍵中存在的問題,然后思考并解決這些問題。達到熟練使用按鍵控制元器件。
2.搭建硬件環境
1.硬件準備
名稱 | 型號 | 數量 |
---|---|---|
單片機 | STC12C2052 | 1 |
LED彩燈 | 無 | 2 |
晶振 | 12MHZ | 1 |
電容 | 30pf | 2 |
電阻 | 100歐姆 | 2 |
面包板 | 無 | 1 |
連接線 | 無 | 5 |
2.電路圖原理圖
- 1.LED燈正極串聯一個100歐姆電阻,接到單片機20號引腳VCC。
- 2.連接線一頭連接單片機12號引腳,另一頭接按鍵的一腳。
- 3.按鍵的另一腳通過連接線接到單片機10號引腳GND
- 4.晶振兩個腳分別連接單片機的4號和5號引腳,同時晶振每個引腳串聯一個30pf電容接到單片機10號引腳GND
3.實驗課題
3.1.按鍵按下燈亮,松開燈關閉
1.課題描述
課題的目的使用按鍵來控制LED燈的亮和滅,當按下按鍵讀取到低電平,讓燈打開。當送開按鍵讀取到高電平,讓燈關閉。
2.實現程序
/*************************************************************
* 程序名: 按鍵控制LED燈亮滅
* 編寫人: bruce
* 硬件支持:TC12C2052 外部12MHZ晶振
* 日 期: 2023-11-14
* 修改日志:
/*************************************************************/#include<STC12C2052AD.H>sbit LED = P1^7;
sbit KEY = P1^0;void main(void){KEY = 1;LED = 1;while(1){/*使用if判斷語句實現按下按鍵LED燈亮,松開按鍵LED燈滅*//*if(KEY == 0){LED = 0;}else if(KEY == 1){LED = 1;}*/// 討巧的方式實現按鍵控制燈亮滅LED = KEY;}}
3.2.按鍵輪訓控制燈開關
1.課題描述
當按鍵第一次按下松開后開燈,第二次按下按鍵松開后關燈。
2.實現程序
/*************************************************************
* 程序名: 第一次按下按鍵LED燈亮,第二次按下按鍵LED燈滅,如此循環
* 編寫人: bruce
* 硬件支持:TC12C2052 外部12MHZ晶振
* 日 期: 2023-11-14
* 修改日志:
/*************************************************************/#include<STC12C2052AD.H>sbit LED = P1^7;
sbit KEY = P1^0;/*********************************************************************************************
函數名:毫秒級CPU延時函數
調 用:DELAY_MS (?);
參 數:1~65535(參數不可為0)
返回值:無
結 果:占用CPU方式延時與參數數值相同的毫秒時間
備 注:應用于1T單片機時i<600,應用于12T單片機時i<125
/*********************************************************************************************/
void DELAY_MS (unsigned int a){unsigned int i;while( --a != 0){for(i = 0; i < 600; i++);}
}void main(void){KEY = 1;LED = 1;while(1){if(KEY == 0){/*DELAY_MS()延時函數的作用是去掉按下按鍵抖動造成信號不穩定,導致程序失靈。當按下按鍵后讓程序稍等一會跳過按鍵抖動時刻,再讀取按鍵狀態達到去抖動效果。*/DELAY_MS(120);if(KEY == 0){//當按鍵為0時,判斷當前燈的狀態,并取反。實現輪訓控制燈的開關。if(LED == 0){LED = 1;}else{LED = 0;}}} }}
上面的程序雖然實現了按鍵控制燈的亮滅功能,但是它有兩點不完美,需要優化。優化點如下
- 嵌入了三層if判斷語句,是程序變得復雜不易閱讀。
- 只通過延時決絕按鍵抖動,偶爾還會出現失靈的情況。
下面的程序對該兩點內容做了優化,使程序更加晚上。
/*************************************************************
* 程序名: 第一次按下按鍵LED燈亮,第二次按下按鍵LED燈滅,如此循環
* 編寫人: bruce
* 硬件支持:TC12C2052 外部12MHZ晶振
* 日 期: 2023-11-14
* 修改日志:
/*************************************************************/#include<STC12C2052AD.H>sbit LED = P1^7;
sbit KEY = P1^0;/*********************************************************************************************
函數名:毫秒級CPU延時函數
調 用:DELAY_MS (?);
參 數:1~65535(參數不可為0)
返回值:無
結 果:占用CPU方式延時與參數數值相同的毫秒時間
備 注:應用于1T單片機時i<600,應用于12T單片機時i<125
/*********************************************************************************************/
void DELAY_MS (unsigned int a){unsigned int i;while( --a != 0){for(i = 0; i < 600; i++);}
}void main(void){KEY = 1;LED = 1;while(1){if(KEY == 0){/*DELAY_MS()延時函數的作用是去掉按下按鍵抖動造成信號不穩定,導致程序失靈。當按下按鍵后讓程序稍等一會跳過按鍵抖動時刻,再讀取按鍵狀態達到去抖動效果。*/DELAY_MS(120);if(KEY == 0){//當按鍵為0時,判斷當前燈的狀態,并取反。實現輪訓控制燈的開關。LED = ~LED;//當按鍵按下沒有松開時則一直做空循環,直到松開,while(1)才開始新的一輪循環。增強了按鍵控制燈的穩定性。while(KEY == 0); }} }}