51微控制器之獨立按鍵控制LED
阿新 • • 發佈:2019-02-18
1.獨立按鍵的原理(1703A)
1.獨立按鍵一共有四個針腳,兩個短針腳之間預設不導通,兩個長針腳之間預設導通
2.按下按鈕後,會出現“抖動”,消抖後,輸入低電平;
2.為什麼會出現按下按鈕輸入低電平?
1.對於p1,p2,p3口而言,是屬於準雙向IO口結構,在按下按鈕(按鈕在p3口)後,自然直接從內部輸入低電平;
2.對於p1,p2,p3而言,上拉電阻是為了更好的控制高低電平,所以,p0口有外加的上拉電阻
3.而且在內部輸入時NOT為非門,所以輸入高電平時,到達這裡變成了低電平,不能通過三極體,只有輸入低電平時,才能轉換為高電平,通過三極體(自己的理解,不太準確)
3.關於抖動的問題(轉載)
通常的按鍵所用開關為機械彈性開關,當機械觸點斷開、閉合時,由於機械觸點的彈性作用,一個按鍵開關在閉合時不會馬上穩定地接通,在斷開時也不會一下子斷開。因而在閉合及斷開的瞬間均伴隨有一連串的抖動,為了不產生這種現象而作的措施就是按鍵消抖
按鍵消抖有兩種,一種是硬體消抖,一種是軟體消抖
參考連結:http://www.eeworld.com.cn/mcu/2012/0806/article_9776.html
4.程式碼練習
#include<reg52.h> typedef int u16; typedef char u8; sbit led1=P2^0; //D1 sbit led2=P2^1; //D2 sbit led3=P2^2; //D3 sbit led4=P2^3; //D4 sbit k1=P3^1;//定義一個獨立按鍵 sbit k2=P3^2;//定義一個獨立按鍵 sbit k3=P3^3;//定義一個獨立按鍵 sbit k4=P3^4;//定義一個獨立按鍵 //定義延時函式 void delay(u16 i) { while(i--); } void keypros()//定義獨立按鍵控制 { if(k1==0)//說明按下去了 { delay(1000);//消抖 if(k1==0) { led1=~led1;//翻轉 } while(!k1);//按鍵鬆開 } if(k2==0)//說明按下去了 { delay(1000);//消抖 if(k2==0) { led2=~led2;//翻轉 } while(!k2);//按鍵鬆開 } if(k3==0)//說明按下去了 { delay(1000);//消抖 if(k3==0) { led3=~led3;//翻轉 } while(!k3);//按鍵鬆開 } if(k4==0)//說明按下去了 { delay(1000);//消抖 if(k4==0) { led4=~led4;//翻轉 } while(!k4);//按鍵鬆開 } } void main() { while(1) { keypros(); } }