按键消抖与时间按键
单片机的按键消抖与几种按键电路

用其他的各类触发器,锁存器亦可达到消抖效果。 二、 软件消抖 : 通过软件延时 10ms 达到消除抖动的效果,不加文字赘述。 三、 按键电路 : 独立按键
矩阵按键 译码按键 AD 模拟按键 锁定按键
单片机的按键消抖与几种按键电路
一、 硬件消抖 : 按键防抖电路控制电路 所示利用 RC 积分电路来达成杂波的滤除与波形修整的电路(如图 1 )。 在 S1 ON 的瞬间由于接触弹跳的关系,会使 A 点电压呈现高速的断 续现象,再 S1 OFF 时亦然,详(如图 2 所示),然而由于电容两端电压需由 电压经电阻慢慢充电才会上升,使得 B 点电位缓步上升情形:S1 OFF 时亦 然,电容电压经 R 放电,使 B 点电压缓缓下降。此一变化,经史密特反相 修整后,可得一标准负脉波输出,如波
单片机延时消抖

单片机延时消抖1 前言在单片机中,我们经常会遇到开关的按键输入。
由于按键的机械结构,按键开关会存在弹跳现象,即开关接触时会迅速接开多次,这会影响程序正常的判断和计算。
因此我们需要对按键输入进行处理,例如进行延时和消抖处理。
2 延时处理延时处理是指等待一段时间,等待电磁干扰消失和按键完全稳定后再进行下一步逻辑处理。
常用的方法是在等待一段时间后再次读取按键状态,如果状态改变则说明还没有稳定,需要再次等待。
这样循环等待处理,直到检测到按键状态未发生变化,就可以认为按键已经稳定了。
在这个过程中,需要选择合适的时间和时间间隔,既不能太短,也不能太长,否则会影响响应速度或者拖慢整个程序的运行效率。
3 消抖处理消抖处理是指对按键输出信号的瞬时原始动作进行处理。
常用的方法是通过软件算法处理,采用滤波器的原理去除瞬时的不稳定状态,只留下按键实际状态的转换。
处理完成后,按键的状态就能够真实地反映输出信号,避免误判和重复操作的情况出现。
具体实现方式包括软件延时去抖、硬件RC去抖和Schmitt触发器去抖等。
4 延时消抖综合处理在实际应用中,延时和消抖的处理通常会综合使用。
这样可以避免按键出现连续的多次按下和抬起,以及相邻按键误触等问题。
实现方式可以先进行消抖处理,再进行适当的延时处理。
这样能够保证按键输入的准确性和稳定性,同时又不影响程序的响应速度和效率。
5 结论按键输入在单片机应用中是重要的输入方式,合理的延时和消抖处理能够有效避免按键输入的误判和误操作,提高应用程序的可靠性和稳定性。
延时消抖的综合处理方式是目前十分流行和有效的处理方式,能够适用于大多数单片机应用场景。
因此,在设计和开发单片机应用程序的过程中,应该重视按键输入的处理,选用合适的处理方式和算法,避免可能的问题和不确定因素,以提高应用程序的质量和性能。
按键消除抖动的措施

按键消除抖动的措施
按键消除抖动是指在使用电子设备中,当按下按键后可能会出
现的多次触发信号的问题。
为了解决这个问题,可以采取以下措施:
1. 软件滤波,在程序设计中,可以采用软件滤波的方法来消除
按键抖动。
软件滤波可以通过延时、状态机等方式来确保只有真正
的按键按下才会触发相应的操作,而忽略短暂的抖动信号。
2. 硬件滤波,在电路设计中,可以加入电容、电阻等元件来实
现硬件滤波,通过延长按键信号的上升沿或下降沿时间,从而消除
按键抖动带来的干扰。
3. 使用稳定的按键元件,选择质量好、稳定性高的按键元件,
可以减少按键抖动的发生。
4. 金属片设计,在按键设计中,可以添加金属片来增加按键的
稳定性,减少抖动。
5. 硬件消抖器,使用专门的硬件消抖器芯片,这些芯片可以自
动检测和消除按键抖动,提高按键的稳定性。
综上所述,消除按键抖动可以通过软件滤波、硬件滤波、选择稳定的按键元件、金属片设计以及使用硬件消抖器等多种措施来实现。
在实际应用中,可以根据具体情况选择合适的方法或者结合多种方法来解决按键抖动问题。
按键消抖电路中可能遇到的问题

按键消抖电路的问题及解决方案引言在很多电子设备和系统中,我们经常会遇到按键输入的问题,尤其是当按键被长时间按下或快速频繁按下时,可能会出现按键误触或重复触发的现象。
为了解决这个问题,需要使用按键消抖电路。
按键消抖电路是一种用于解决按键输入中抖动问题的电路,其主要功能是确保每个按键信号只被触发一次。
本文将介绍按键消抖电路可能遇到的问题,并提供相应的解决方案。
问题一:按键抖动按键抖动是指在按键被按下或释放的瞬间,由于机械开关的弹性导致的电气接触不稳定现象。
抖动会导致信号在短时间内多次切换,从而可能引起系统错误触发或功能失效。
解决方案: - 硬件滤波:可以使用外部电容器和电阻器组成的RC电路来进行硬件滤波。
通过适当选择电容和电阻值,可以使抖动信号被滤除,只有稳定的按键信号被传递给后续电路。
- 软件滤波:可以在微控制器或数字逻辑芯片中使用软件滤波算法来处理按键信号。
软件滤波可以通过设置特定的时间窗口,在此期间内检测和记录按键状态变化,并在时间窗口结束时确定按键的最终状态。
这种方式可以有效抑制按键抖动,但需要相应的处理算法支持。
问题二:按键重复触发当按键被长时间按下时,由于机械开关的弹性使得接触点会产生微小的颤动,这可能会导致按键信号以较高频率持续触发,而不是期望的单次触发。
解决方案: - 软件消抖:可以在软件中设置合适的按键触发间隔。
当按键被按下时,记录触发时间,并在下一次检测到按键状态变化时,检查与上次触发时间的间隔是否超过设定的阈值。
如果超过阈值,则认为新的按键触发有效,否则忽略。
这种方式可以防止按键重复触发,但要求相应的处理算法支持。
- 硬件消抖:可以使用SR触发器或者集成了消抖功能的按键开关来进行硬件消抖。
SR触发器可以稳定输入信号,并将其作为触发器的输出,以确保只输出一次触发信号。
问题三:按键失效按键失效是指按键无法产生正确的信号输出。
这可能是由于电路连接不良、开关接触不良或按键磨损等原因导致的。
io按键消抖算法

io按键消抖算法
IO按键消抖算法是电子设备中常用的一种技术,用于处理按键在按下或释放时可能出现的抖动现象。
抖动现象是由于机械开关在接触或断开时,由于物理原因(如弹性、接触电阻等)导致电路状态瞬间不稳定,从而产生多个快速的电平变化。
如果不进行消抖处理,这些快速变化可能会被设备误识别为多次按键操作,导致程序逻辑混乱。
消抖算法的主要目的是识别并过滤这些快速的电平变化,确保设备只响应一次按键操作。
一种常用的消抖算法是延时消抖法。
当检测到按键被按下时,程序会先等待一段时间(通常是几十毫秒),然后再读取按键状态。
如果按键仍然处于按下状态,则认为是有效的按键操作;如果按键已经释放,则认为是抖动现象,忽略这次操作。
同样地,当检测到按键被释放时,也需要进行类似的延时处理。
除了延时消抖法外,还有其他一些消抖算法,如软件定时器消抖、硬件消抖等。
软件定时器消抖是通过在程序中设置一个定时器,在定时器到期后再读取按键状态,从而过滤掉抖动现象。
硬件消抖则是通过外部电路实现消抖功能,例如使用施密特触发器、RC滤波器等。
需要注意的是,消抖算法的实现方式和参数选择需要根据具体的硬件环境和应用场景来确定。
在实际应用中,可能需要根据按键的特性和使用频率来调整消抖时间和算法复杂度,以确保程序的稳定性和响应速度。
总之,IO按键消抖算法是电子设备中不可或缺的一部分,它能够提高设备的可靠性和用户体验。
在实际应用中,需要根据具体情况选择合适的消抖算法和参数,以确保设备的正常运行。
按键消抖

按键消抖
1.按键抖动
通常的按键所用开关为机械弹性开关,当机械触点断开、闭合时,电压信号小型如下图。
由于机械触点的弹性作用, 一个按键开关在闭合时不会马上稳定地接通,在断开时也不会一下子断开。
因而在闭合及断开的瞬间均伴随有一连串的抖动,如下图。
抖动时间的长短由按键的机械特性决定,一般为5ms~10ms。
这是一个很重要的时间参数,在很多场合都要用到。
2.软件消抖
如果按键较多,常用软件方法去抖,即检测出键闭合后执行一个延时程序,产生5ms~10ms的延时,让前沿抖动消失后再一次检测键的状态,如果仍保持闭合状态电平,则确认为真正有键按下。
当检测到按键释放后,也要给5ms~10ms的延时,待后沿抖动消失后才能转入该键的处理程序
3.硬件消抖
在键数较少时可用硬件方法消除键抖动。
下图所示的RS触发器为常用的硬件去抖。
也可以加入RC滤波电路,进行消抖
利用电容的放电延时,采用并联电容法,也可以实现硬件消抖:消抖电路如下:。
vivado按键消抖原理

vivado按键消抖原理按键消抖是指在数字电路中,当按键按下或释放时,由于按键机械开关的特性,会导致电路出现不稳定的信号状态。
这种不稳定状态可能会导致错误的触发,例如出现多次触发或漏触发。
因此,为了确保按键信号的稳定性和可靠性,需要进行按键消抖处理。
按键消抖的原因主要有两个方面。
首先,按键机械开关的接触面存在微小的弹跳现象,当按键按下或释放时,接触面会在短时间内反复接触和分离,导致电路信号出现多次变化。
其次,由于电路中存在的噪声干扰,也会使得按键信号产生抖动。
为了解决按键消抖问题,可以采用硬件和软件两种方法。
硬件方法主要通过添加滤波电路或使用稳定的按键开关来消除按键弹跳现象。
滤波电路可以通过RC电路或者使用专用的按键消抖芯片来实现。
而软件方法主要通过在数字电路中添加按键消抖算法来处理按键信号。
在Vivado中,按键消抖可以通过使用状态机来实现。
状态机是一种用于描述系统行为的模型,可以根据输入信号的状态变化来改变系统的状态和输出。
在按键消抖中,可以使用状态机来检测按键信号的变化,并根据一定的状态转换规则来消除按键弹跳现象。
具体实现时,可以将按键信号作为输入,将按键状态和输出作为状态机的状态和输出。
当按键信号发生变化时,状态机会根据一定的状态转换规则进行状态转换,并输出消抖后的按键信号。
常用的状态转换规则包括按键按下时状态转换为按下状态,按键释放时状态转换为释放状态,以及连续按键时状态不变。
在Vivado中,可以使用Verilog或VHDL等硬件描述语言来编写状态机代码。
首先,需要定义状态机的输入、输出和状态变量,并初始化各个变量的初始值。
然后,需要编写状态转换规则和输出逻辑,根据输入信号的状态变化来改变状态和输出。
最后,需要将状态机代码综合生成对应的逻辑电路,并进行仿真和验证。
总结起来,按键消抖是数字电路设计中常见的问题,为了确保按键信号的稳定性和可靠性,需要进行按键消抖处理。
在Vivado中,可以使用状态机来实现按键消抖,通过定义状态转换规则和输出逻辑,消除按键弹跳现象。
c语言按键消抖常用方法

在C语言中,按键消抖是指处理物理按键在按下或释放时可能产生的抖动或不稳定信号的问题。
常用的方法包括软件延时消抖和状态机消抖。
1. 软件延时消抖:- 当检测到按键按下或释放时,可以通过在代码中添加一个短暂的延时来过滤掉按键可能产生的抖动信号。
例如,在按键检测到变化后,延时几毫秒以确保按键信号稳定后再进行状态读取。
```cvoid delay(unsigned int ms) {unsigned int i, j;for (i = 0; i < ms; i++)for (j = 0; j < 300; j++);}// 在按键检测中使用延时if (button_pressed && !last_button_state) {delay(10); // 等待10毫秒if (button_pressed) {// 执行按键按下后的操作last_button_state = button_pressed;}}```这种方法简单易行,但需要根据具体硬件和按键特性调整延时时间,且可能会造成按键响应速度变慢。
2. 状态机消抖:- 利用状态机来跟踪按键状态变化,并在一定持续时间内保持一致的状态才认定为有效按键按下或释放。
这可以通过一个状态变量和定时器结合实现。
```cenum ButtonState {IDLE, PRESSED, RELEASED};enum ButtonState current_state = IDLE;unsigned int debounce_timer = 0;// 在按键检测中使用状态机void button_check() {switch (current_state) {case IDLE:if (button_pressed) {current_state = PRESSED;debounce_timer = 10; // 设定10毫秒的延时}break;case PRESSED:if (!button_pressed) {current_state = RELEASED;debounce_timer = 10; // 设定10毫秒的延时}break;case RELEASED:if (button_pressed) {current_state = PRESSED;debounce_timer = 10; // 设定10毫秒的延时}break;}if (debounce_timer > 0) {debounce_timer--;} else {if (current_state == PRESSED) {// 执行按键按下后的操作} else if (current_state == RELEASED) {// 执行按键释放后的操作}current_state = IDLE; // 处理完毕后返回IDLE状态 }}```这种方法相对于延时消抖更加灵活,可以根据具体需求设置不同的延时时间,并且不会影响整体的按键响应速度。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
case 0xdf:return 6;break;
case 0xbf:return 7;break;
case 0x7f:return 0;break;
}
}
}
定时器函数
void timer0 ()interrupt1
TR0=1;
if(T>100)
{
TR0=0;
T=0;
}
if(TR0=1&&T<100)
continue;//在定时器里面设置初值让定时器中断一次1ms并且T自加1,100次就100ms
switch(key)
{//返回键值
case 0xfe:return 1;break;
case 0xfd:return 2;break;
消抖分硬件和软件消抖,
硬件消抖有《模拟电子技术》上提到用三态门实现,当然还有周立功那个7920(管理数码管和按键的芯片),当然还有很多硬件电路以及一些按键有自带消抖电路,但是如果要做产品硬件消抖肯定会增加成本,一般都会考虑软件消抖
软件消抖我们先来看看书上消抖方法如下图
例程
Unsignedchar keyscan()//这里是用的P2口作为按键的输入口
第4个问题了,从物理上我们可以知道,既然是阻尼振动,必定到振动到某个时候肯定是和稳定的状态一致的,所以肯定不是必须10ms的延时的,比如按下去假设10ms振动后机械才稳定,但是电平上当触点挨得很近振动的时候就算触点不是挨着,还是显示低电平
第5个问题实际上前面已经说了,有硬件消抖肯定对CPU占用最少,软件消抖当然就是尽量不要用些没用的语句,分配好时序
2.如何消抖
3.是不是按键都要消抖,不是的话,哪些需要消抖,哪些不需要消抖
4.消抖的时间是不是必须10ms
5.按键消抖的方式是不是一定像书上的那样,如何消抖更节省CPU,且更简单
按键如果不消除抖动,那么单片机检测到的低电平的次数就不止一次,那我们按键一次,单片机会检测到多次,比如我们把按某个按键设置按一次成某个变量加1,结果按一次就加了很多次,这样我们就不能精确的通过按键来调整我们想要的参数,所以我们消除抖动的目的就是要实现按一次按键让单片机读出一次按键操作
{
TH0=(66636-1000)/256;//对应12M晶振是1ms
TL0=(66636-1000)%256;
T++;
}
至于定时器初始化和主函数就不需要我一一说明了吧,初学单片机一般都会先学到中断里面就有定时器中断
前面是用的定时器作为时间,书上用的空语句作为延时时间,其实我们写的其他和扫描不相关的语句还是可以作为延时;这就是我的第二种方法:
接下来我们来讨论时间按键,什么叫时间按键?
就是通过按键的时间长短来执行不同的功能,不如手机关机键,大概在按键按住3s后就会提示或直接关机,按一下就直接是关闭背光,再比如我们要设置一个参数,本来按一下只加1,我们要设置上百次或者上千次怎么办,可以按住时间比较长以后直接快速的加或者快速的减,时间按键是首选了了呀是不是呀,当然还可以加一个位选键直接设置对应的位也可以,不过要增加按键
{
Unsigned char key;//定义按键的键值变量
if(P2!=0xff)
{
delay(10);//延时10ms
key=P2;
while(P2!=0xff)
delay(10);//延时10ms
switch(key)
{//返回键值
case 0xfe:return 1;break;
case 0xfd:return 2;break;
现在我就来说一下这是怎么实现的吧
在说按键消抖的时候,书上的例程里面有一个等待按键释放,用的while语句,等待的时候是用的空语句;即是按下去一直执行空语句,放开之后才返回键值,是不是对大家已经有了提示呀:就是直接在检测到按键按下去以后直接执行要执行的语句然后做一个时间内不检测键值或者延时来控制按键的执行的速度
用写好的其他函数作为延时时间控制时序,执行一次扫描后执行其他函数占用100ms左右
这个历程因为有其他函数,只有在编程序的时候才来考虑了用些什么函数语句,这里就不列了哈
第一种方法是大多数情况都能用,这种方法是利用CPU效率比较高的一种(说不定谁做出更牛的,所以就不说最牛的了,当然希望大家能做出更高效率的程序了,哈哈),因为CPU没有执行空语句之类的一些没用的语句,但是必须控制后面所执行的程序是百ms级的所以不是每个程序都能用
还有一种硬件加软件的方法
在所有的按键上接IO口的线上并联一根线接到与门上,与门的另一端接外中断输入口,然后在外中断函数里面扫描键值,当然效率还行,不过加了硬件还要用软件成本上升了不说软件上还要外中断,按键少的时候可以没问题,多了就麻烦了,特别是独立按键,不经济也不好用,但是特别情况还是可以考虑
第3个问题当然肯定不是所有的按键都要消抖的,比如说我们设置按键是按了按键实现电机转动,没有其他功能了,不管抖动几次,只要开启了就不会关闭嘛,是不是呀,嘿嘿,或者设置成按键按一次后关闭,就算抖动,电机关闭了一次就已经关闭了,再关闭还是关闭状态是不是呀
为了节省CPU这里就不用延时函数了,看看下面的例程
Unsignedchar keyscan()//这里是用的P2口作为按键的输入口
{
Static T=0;
Unsigned char key;//定义按键的键值变量
if(P2!=0xff)
{
key=P2;
while(P2!=0xff)
{
if(TR0=0)
要提高首先要把软件延时换成定时器,或者不用这种方法
下面介绍我自己改进的两种方法
首先我们消抖的目的就是为了按键一次只让单片机采集到一次按键操作,所以我就让单片机采集到一次操作以后不再检测,当然是在按键时间内,前面提到人按键一次操作数百ms,所以这儿我们可以再检测到一次按键后打开定时器,在数百ms内不再检测
从上面这两个例子我们可以看出:按键只要设置的一些单一的功能就算出现抖动也不会影响我们设置的功能;假如我们设置的按键一次实现数码管显示的数字加1,那没有加消抖的话单片机会读到好几次按键,那我们按一次出现的结果就是加3或者加4或者某个未知数X了哦,又假如,我们的按键功能是按一次实现led灯打开,再按一次实现led灯关闭,这个是一个按键2个功能了,假设现在状态是led开启的,我们想关闭它,没有消抖的话,单片机读出来的按键次数是个未知数X,X是3,5,7之类的奇数还好能关闭,如果X是偶数的话,那我们不管按多少次那个led灯是不是都开启的呀,由上面两个例子可以看出:按键设置的如果是重复操作或者一个按键有2个以上的功能就必须消抖了
case 0xfb:return 3;break;
case 0xf7:return 4;break;
case 0xef:return 5;break;
case 0xdf:return 6;break;
case 0xbf:return 7;break;
case 0x7f:return 8;break;
continue;//在定时器里面设置初值让定时器中断一次1ms并且T自加1,100次就100ms
switch(key)
{//返回键值
case 0xfe:return 1;break;
case 0xfd:return 2;break;
case 0xfb:return 3;break;
case 0xf7:return 4;break;
(上面的时间都是老师说的和书上现成的,没有实际测试,而且不同的按键应该也会有差异,作为学习研究确实不应该,找个时间锅锅会测出这个时间供大家参考,嘿嘿)
由图我们可以看出,按下去瞬间会出现抖动,弹起来也会出现抖动,明显是个阻尼振动,按键扫描程序是按顺序执行的;
首先提出三个问题大家思考一下
1.为什么要消除抖动
按键消抖与时间按键
这篇文章写给正在学51单片机的或者刚入门51单片机准备进阶的的朋友,我们来着重讨论一下按键消抖和时间按键这两项。
我们常用的按键大多都是机械的,机械开关就会出现机械振动,这个由物理学或者实验可以推出来,抖动会在单片机上面出现重复扫描次数,次数多少与单片机的时钟晶振有关,时钟晶振越高单片机执行速度越快,重复次数就越多
default:return 0;break;
}
}
}
当然延时函数delay肯定要写才能用这个函数
void delay(unsigned char x)//对应12M的晶振是1ms
{
unsigned char i,j;
for(i=0;i<100;i++)
for(j=0;j<10*x;j++)
;
}
这个消抖里面有延时函数如果时序处理不好就要出问题;被我们单片机老师称为“弱智程序”,原因就是用了软件延时(软件延时会占用CPU资源),当然对于刚入门还是可以学一下,很容易理解,方便以后提升(学习嘛当然由易到难还是值得推荐的)
Unsignedchar keyscan()//这里是用的P2口作为按键的输入口
{
Static T=0;
Unsigned char key;//定义按键的键值变量
if(P2!=0xff)
{
key=P2;
while(P2!=0xff)
;
if(TR0=0)
TR0=1;
if(T>100)
TR0=0;
if(TR0=1&&T<100)
case 0xfb:return 3;break;
case 0xf7:return 4;break;
case 0xef:return 5;break;
case 0xdf:return 6;break;