1. 程式人生 > >51微控制器之獨立按鍵控制LED

51微控制器之獨立按鍵控制LED

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();
}
}