单片机入门资料,按键消抖方式,按键怎么消抖

 1.什么是按键消我们先来看一下按键按下去的波形图watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5aWl5Yip57uZ5pyJ6ZmQ5YWs5Y-4,size_20,color_FFFFFF,t_70,g_se,x_16

 

1.按键消抖原理

我们可以看到当按键按下的那一时刻和松开的时候有类似于锯齿的形状那就是按键抖动,这个抖动不是我们人为能控制得了的,所以我们只能对进行硬件消抖或者进行软件消抖. 
        上图中我们可以看到理想波形和实际波形有很大的区别,区别在于实际波形在按键按下的那一刻前后有20毫秒的抖动,我们按键消抖的目的呢就是把抖动忽略掉只要中间的稳定闭合区域.

方法一:延时消抖法

可以使用延时的方式跳过抖动的区域

1.检测按键按下

2.延时消抖

3.等待松开

4.消除松开按键的抖动

5.执行相应程序

#include <reg52.h>
sbit S1 = P2^0;//定义按键IO口
void main()
{
	while(1)
	{
		if(S1==0)			//判断按键按下	第一步
		{
			delay(20);	//延时消抖		第二步
			
			while(S1==0);	//等待按键松开	第三步

			delay(20);	//延时消抖		第四步

			LED=1;	   //执行相应程序性	第五步
            
		}
	}
}

程序分析:

        主函数进来进行大循环判断S1有没有按下,如果按下就延时20毫秒消除抖动延时退出后循环判断 也就是等待,等待按键松开 执行第四步,理论上来说可以不用第四步我们为了程序稳定最好加上,延时20毫秒消抖后执行相应程序。

这样就很容易就实现了最简单的消抖程序。

  优缺点:   操作简单使用方便,不占用其他资源.                                                                                    优点讲解:消抖程序只有两行,所以使用非常简单,他不占用任何硬件资源和外围电路

  缺点:       ​​降低单片机使用效率,使用时单片机不能进行其他动作,                                                        缺点讲解:一个20毫秒的延时对于51单片机来说可以运行两万条程序左右所以使用效率非常低,按键按下的时候会运行等待按键松开的语句,只要按键不松开他就一直停在这里不会执行其他程序

        适合新手使用或者对使用环境要求不大的场合使用

方法二:外围元件消抖电路                                                               watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5aWl5Yip57uZ5pyJ6ZmQ5YWs5Y-4,size_20,color_FFFFFF,t_70,g_se,x_16

 

        优点:       外围电路简单,不占用其他资源.     

 优点讲解:外围原件只有电阻电容,不使用任何硬件资源不需要多写程序

 

        缺点:       开发时间和成本增加,不建议大量使用。

缺点讲解:      增加了焊接元件的时间和元件的成本,如果大量使用会造成不必要的浪费

        适合新手使用或者少量的开关使用

消抖电路原理讲解:

电流VCC经过R2限流电阻向电容充电,此时IO口电位是5V,当我们按下按钮时会立刻给电容放电并且把电位拉低,这样他的抖动就会被电容过滤掉。

方法三:定时器消抖法

主要看中断函数和主函数

#include <reg52.h>

sbit S1 = P2^0;//定义按键IO口

//*************定时器初始化*****************8
void Timer0Init(void)		//20微秒@11.0592MHz
{
	AUXR &= 0x7F;		//定时器时钟12T模式
	TMOD &= 0xF0;		//设置定时器模式
	TMOD |= 0x01;		//设置定时器模式
	TL0 = 0xA4;			//设置定时初始值
	TH0 = 0xFF;			//设置定时初始值
	EA = 1;				//打开总中断
	ET0 = 1;			//允许定时器中断
}


//***************主函数
void main()
{
	bit ss=0;			//按键消抖标志位
	Timer0Init();		//定时器初始化
	while(1)
	{
		if(S1==0)
		{
			TR0=1;//开始定时20毫秒
			if(ss==1)//判断消抖时间是否达到
			{			//如果达到
				ss=0;//给他复位因为下次按下按键还要用
				LED=1;//执行相应程序
			}
		}
		//按键按下去不影响程序继续向下跑

        //此处省略千行程序
        //此处省略千行程序
        //此处省略千行程序
        //此处省略千行程序
	}
}


//*************中断函数
void T0_T0()interrupt 1
{
	TL0 = 0xA4;			//设置定时初始值
	TH0 = 0xFF;			//设置定时初始值
	ss=1;				//表示20毫秒消抖时间已过
	TR0=0;//关闭定时
}

程序分析  :

进来大循环会不停的判断按键,一旦按键按下就会启动定时器,经过定时20毫秒后进入定时器中断函数,一进中断给他重新赋值然后把按键标志位 置一表示20毫秒达到,随后关闭定时器因为我们暂时不需要他了。

退出中断后经过第一个判断因为按键我们就没有松开按键所以就直接经过第一个判断,第二个判断是判断20毫秒有没有达到,如果达到把标志位清零,如果不清零会重复执行下边的程序所以我们要清零,随后执行相应程序。

优点:       无外围电路,效率高消抖时其他程序正常运行。                                                                         优点讲解:不需要任何外围电路元件无额外成本,使用时不会影响其他程序的正常运行

缺点:      使用一个定时器                                                                                                                         缺点讲解:因为使用定时器定时所以占用一个定时器,如果您对定时器有一定了解那样你就可以对定时器进行分时复用。

        适合对定时器中断有一定了解的开发者使用

三种消抖方式都有优点和缺点根据自己的要求选择合适的方法

如果您有更好的建议请您留言

如果此文章有使用价值请您一键三连谢谢

 

物联沃分享整理
物联沃-IOTWORD物联网 » 单片机入门资料,按键消抖方式,按键怎么消抖

发表评论