开关抖动的处理可以分为硬件去抖动和软件去抖动。
硬件去抖动增加硬件投入
在单片机应用电路中,一般采用软件去抖动,软件去抖动就是执行一段软件延时程序
即键按下先延时消抖,等键稳定后键抬起之前再延时消抖,直至键完全抬起,恢复初始状态。
这个不一样的 ,,always @(posedge clk) 这个模块是比较常用的去抖动电路,很简单,也很实用,三个clk上升沿以后,dout1,dout2,dout3将和key_in波形保持一致,只是相应的顺序延迟一个clk周期。 assign key_out=(dout1|dout2|dout3);// 能有效的将信号上出现的抖动纹波去除掉,尤其是低电平纹波。而assign key_out=dout1; 却不行。建议采用assign key_out=(dout1|dout2|dout3);//
外部中断的一般都是采用延时程序,而且延时程序一般是利用定时器做10~15ms的延时去抖,来实现的,而且时间不是特别精确,单片机书上和有关资料上应该都有我写一个参考一下:
void DelayMS(unsigned char a)
{int i;
for(;a>0;a--)
for(i=110;i>0;i--);
}延时约为a毫秒,不过不够准确,可以通过keil软件或者汇编来确立更精确的延时时间!
在中断执行前先做判断:用if语句看看引脚的电平,如果没有跳变,那么再延时判断,如果还没有跳变那么再延时,如此重复;
等到电平跳变了,延时看看是不是电平收其他非 *** 作性因素引起的,比如说电源抖动,延时之后再判断如果的确是跳变了,可以进行中断后的 *** 作了!
你把这个second的数据类型改成unsigned char second;
本身second最大计数直到60 定义成int太浪费空间
你本身定的数据TAB[]是unsigned char 类型的 放进去int类型可能会报错
你试下
硬件消抖:加电容滤波
软件消抖1:加delay延时,基本用于教学,实际工作中没人用。
软件消抖2:定时扫描,其实就是放一个变量cnt在定时器中 cnt=1; ,假设定时器每5ms中断一次。按键扫描就是每次cnt==1的时候就判断一次按键状态,顺便cnt=0清零,假设连续2次有按键按下,说明按键按下的时间至少有5ms,抖动的时间大概也就这么多,不放心就延长时间或者判断次数。
优点:按键5ms等待间隔的时候,cpu可以执行其他函数,比如显示。
程序中尽量减少出现delay_ms级别的延时,浪费1ms太长。
以上就是关于开关抖动 如何消除全部的内容,包括:开关抖动 如何消除、fpga 去抖verilog、51单片机,用按键实现外部中断,软件如何去抖等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)