关于按键抖动现象
背景,在学习 51 单片机的时候,用按键控制 LED 灯的亮灭,按一次后亮灭会进行替换,当我写好程序以后,没有想到有时候按下去按键能够灵敏,有时候却不灵敏。所以为什么???
在电子设备中,按键是一种常见的输入设备,用于用户与设备之间的交互。然而,按键在被按下或释放时可能会出现"按键抖动"的现象,导致多次触发输入信号。
原理
按键抖动是什么?
- 按键抖动:指的是在按下或释放按钮时,由于机械元件的特性,导致开关频繁打开和关闭,产生短暂的波动信号,这是按键抖动现象。
为什么会发生按键抖动?
- 机械结构:按键通常由弹簧、金属片等物理部件组成,在按下和释放过程中,这些部件可能会受到机械振动或弹性反弹的影响,导致接触不稳定,从而产生抖动。
抖动信号对系统的影响
- 误操作:按键抖动可能导致系统误认为出现多次按键操作,进而触发不必要的功能或指令。
- 用户体验下降:频繁的按键抖动会影响用户体验,使得用户感到不便和困扰。
解决方法
硬件解决方案
- 消抖电路:添加消抖电路可以通过延迟、滤波等技术来消除按键抖动信号,确保只有有效的按键操作被识别。
- 优化按键结构:设计更稳定的按键结构,如增加减震垫、改进接触点设计等,减少机械振动对按键的影响。
软件解决方案
- 软件延时处理:在软件层面引入延时处理机制,通过设置合适的时间阈值来判断是否是有效的按键操作。
- 状态机设计:使用状态机设计模式,根据按键状态的变化进行状态转移,避免误认为抖动信号是有效操作。
综合方法
- 硬件与软件结合:结合硬件消抖电路和软件延时处理,可以更好地应对复杂的按键抖动情况,提高按键的稳定性和可靠性。
- 多重校验:对按键信号进行多重校验,例如检测连续触发次数、持续时间等,来确保准确识别有效按键操作。
初始代码:
#include <REGX52.H>
void main()
{
int my_switch = 0;
while(1)
{
if(P3_1 == 0){
if(my_switch == 1)
my_switch = 0;
else my_switch = 1;
if(my_switch == 1){
P2_0 = 0;
}else P2_0 = 1;
}
}
}
用软件消除按键抖动代码:
#include <REGX52.H>
#include <INTRINS.H>
void Delayxms(unsigned int x) //@12.000MHz
{
while(x)
{
unsigned char i, j;
i = 12;
j = 169;
do
{
while (--j);
} while (--i);
x--;
}
}
void main()
{
while(1){
if(P3_1 == 0)
{
Delayxms(20); // 一般前 20ms 是抖动,消除按下按键的抖动,所以当检测到了按下,先延迟20ms
while(P3_1 == 0); // 如果检测到一直是在按下,那么就停留在这里。
Delayxms(20);// 消除松开按键的抖动
P2_0 = ~P2_0; // 控制 LED 亮灭
}
}
}