51單片機教程:按鍵的定時器消抖(有延時的程序不是好程序)

按鍵消抖原理

一、首先來回顧一下按鍵延時消抖
按鍵由於是機械結構,按下的時候難免產生抖動,一般抖動會在按下的時候與鬆開的時候產生,抖動時間大概是10ms
在這裏插入圖片描述
於是針對按鍵抖動就有了延時消抖的一種簡單的解決方法:

二、按鍵消抖代碼
方法一: 按下按鍵損耗的時間取決於按下按鍵到鬆開的時間,至少10ms,按下按鍵後CPU不再執行其他指令,直到按鍵鬆開,應用能力弱


void main(void)
{
	while(1)
	{
		if(key==0)	  //讀P1.0引腳,如果引腳爲低電平,則進入if
		{
			delay_ms(10); //延時10ms消抖
			if(key==0)	 //再次判斷按鍵是否按下,防止干擾,增強穩定
			{
				 led = !led;//led狀態改變
				 while(key==0);//等待按鍵鬆開,防止往下執行
			}
		}
	}
}

方法二: 按下按鍵損耗的時間大約10ms,鬆開按鍵時損耗10ms,累計20ms,按下按鍵期間可以進行其他操作,應用能力較強



void main(void)
{
	int status=0;	//按鍵標誌位
	while(1)
	{
		if(status==1 && key==1)	 //判斷按鍵是否鬆開
		{
			delay_ms(10);  //延時消抖
			if(key==1 && status==1)	//再次判斷,排除是外界雜波干擾
			{
				status=0; //更改標誌防止循環執行判斷鬆開程序
			}
		}
		if(key==0 && status==0)//判斷按鍵是否按下
		{
			delay_ms(10);//延時消抖
			if(key==0 && status==0)    //再次判斷,排除是鬆開狀態或外界雜波干擾
			{
				status=1;//防止循環執行按鍵控制程序
				led=!led;
			}
		}
	}
}

可以看到,延時消抖最大的弊端就是有延時,至少要消耗10ms~20ms的時間,對於我們來說10ms或許很短,但對於一些高性能的MCU來說,那就是能執行幾萬條指令的時間

按鍵定時器消抖

一、按鍵消抖
按鍵消抖一般分爲4步:
1、判斷按鍵是否按下
2、消抖
3、再次判斷按鍵是否按下
4、等待按鍵鬆開
二、定時器消抖原理
1、判斷按鍵是否按下,
2、若檢測到有按鍵按下,則開啓定時器,開啓定時中斷,定時時間爲10ms 左右,使得按鍵按下10ms後進入定時中斷,進入中斷的時候按鍵抖動時間已過
3、在定時器中斷中再次判斷按鍵是否按下
4、關閉定時器,等待按鍵鬆開

代碼:

#include <reg51.h>
sbit key=P1^0;  //定義key爲P1.0
sbit led=P2^0; //定義LED爲P2.0

void main(void)
{
	TMOD|=0X01;//選擇爲定時器0模式,工作方式1,僅用TR0打開啓動。
	TH0=(65536-10000)/256;	//給定時器賦初值,定時10ms
	TL0=(65536-10000)%256;
	ET0=1;//打開定時器0中斷允許
	EA=1;//打開總中斷
	TR0=0;//關閉定時器			
	while(1)
	{
		if(key==0)	  //讀P1.0引腳,如果引腳爲低電平,則進入if
		{
			TR0=1;//打開定時器
		}
	}
}

/*定時器中斷*/
void Timer0() interrupt 1
{
	TH0=(65536-10000)/256;	//給定時器賦初值,定時10ms
	TL0=(65536-10000)%256;	

	TR0=0;//關閉定時器
	if(key==0)	 //再次判斷按鍵是否按下
	{	
		led=!led;
		while(key==0);	  //等待按鍵鬆開
	}
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章