按键消抖及时间按键

按键消抖及时间按键

ID:21150422

大小:72.50 KB

页数:7页

时间:2018-10-20

按键消抖及时间按键_第1页
按键消抖及时间按键_第2页
按键消抖及时间按键_第3页
按键消抖及时间按键_第4页
按键消抖及时间按键_第5页
资源描述:

《按键消抖及时间按键》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库

1、按键消抖与时间按键这篇文章写给正在学51单片机的或者刚入门51单片机准备进阶的的朋友,我们来着重讨论一下按键消抖和时间按键这两项。我们常用的按键大多都是机械的,机械开关就会出现机械振动,这个由物理学或者实验可以推出来,抖动会在单片机上面出现重复扫描次数,次数多少与单片机的时钟晶振有关,时钟晶振越高单片机执行速度越快,重复次数就越多整个按键数百ms按下瞬间,抖动时间大概10ms弹起瞬间,抖动大概10ms按键一次出现的电平变化(上面的时间都是老师说的和书上现成的,没有实际测试,而且不同的按键应该也会有差异,作为学习研究确实不应该,找个时间

2、锅锅会测出这个时间供大家参考,嘿嘿)由图我们可以看出,按下去瞬间会出现抖动,弹起来也会出现抖动,明显是个阻尼振动,按键扫描程序是按顺序执行的;首先提出三个问题大家思考一下1.为什么要消除抖动2.如何消抖3.是不是按键都要消抖,不是的话,哪些需要消抖,哪些不需要消抖4.消抖的时间是不是必须10ms5.按键消抖的方式是不是一定像书上的那样,如何消抖更节省CPU,且更简单按键如果不消除抖动,那么单片机检测到的低电平的次数就不止一次,那我们按键一次,单片机会检测到多次,比如我们把按某个按键设置按一次成某个变量加1,结果按一次就加了很多次,这样

3、我们就不能精确的通过按键来调整我们想要的参数,所以我们消除抖动的目的就是要实现按一次按键让单片机读出一次按键操作消抖分硬件和软件消抖,硬件消抖有《模拟电子技术》上提到用三态门实现,当然还有周立功那个7920(管理数码管和按键的芯片),当然还有很多硬件电路以及一些按键有自带消抖电路,但是如果要做产品硬件消抖肯定会增加成本,一般都会考虑软件消抖软件消抖我们先来看看书上消抖方法如下图7延时10ms延时10ms书上的按键软件消抖方法例程Unsignedcharkeyscan()//这里是用的P2口作为按键的输入口{Unsignedcharke

4、y;//定义按键的键值变量if(P2!=0xff){delay(10);//延时10mskey=P2;while(P2!=0xff)delay(10);//延时10msswitch(key){//返回键值case0xfe:return1;break;case0xfd:return2;break;case0xfb:return3;break;case0xf7:return4;break;case0xef:return5;break;case0xdf:return6;break;case0xbf:return7;break;case0x7

5、f:return8;break;default:return0;break;}}}当然延时函数delay肯定要写才能用这个函数voiddelay(unsignedcharx)//对应12M的晶振是1ms{7unsignedchari,j;for(i=0;i<100;i++)for(j=0;j<10*x;j++);}这个消抖里面有延时函数如果时序处理不好就要出问题;被我们单片机老师称为“弱智程序”,原因就是用了软件延时(软件延时会占用CPU资源),当然对于刚入门还是可以学一下,很容易理解,方便以后提升(学习嘛当然由易到难还是值得推荐的)

6、要提高首先要把软件延时换成定时器,或者不用这种方法下面介绍我自己改进的两种方法首先我们消抖的目的就是为了按键一次只让单片机采集到一次按键操作,所以我就让单片机采集到一次操作以后不再检测,当然是在按键时间内,前面提到人按键一次操作数百ms,所以这儿我们可以再检测到一次按键后打开定时器,在数百ms内不再检测检测到按键一次不检测方法一Unsignedcharkeyscan()//这里是用的P2口作为按键的输入口{StaticT=0;Unsignedcharkey;//定义按键的键值变量if(P2!=0xff){key=P2;while(P2

7、!=0xff);if(TR0=0)TR0=1;if(T>100)TR0=0;7if(TR0=1&&T<100)continue;//在定时器里面设置初值让定时器中断一次1ms并且T自加1,100次就100msswitch(key){//返回键值case0xfe:return1;break;case0xfd:return2;break;case0xfb:return3;break;case0xf7:return4;break;case0xef:return5;break;case0xdf:return6;break;case0xbf:r

8、eturn7;break;case0x7f:return8;break;default:return0;break;}}}定时器函数voidtimer0()interrupt1{TH0=(66636-1000)/256;

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。