预览加载中,请您耐心等待几秒...
1/7
2/7
3/7
4/7
5/7
6/7
7/7

在线预览结束,喜欢就下载吧,查找使用更方便

如果您无法下载资料,请参考说明:

1、部分资料下载需要金币,请确保您的账户上有足够的金币

2、已购买过的文档,再次下载不重复扣费

3、资料包下载后请先用软件解压,在使用对应软件打开

(完整版)按键消抖与时间按键(完整版)按键消抖与时间按键(完整版)按键消抖与时间按键按键消抖与时间按键这篇文章写给正在学51单片机的或者刚入门51单片机准备进阶的的朋友,我们来着重讨论一下按键消抖和时间按键这两项.我们常用的按键大多都是机械的,机械开关就会出现机械振动,这个由物理学或者实验可以推出来,抖动会在单片机上面出现重复扫描次数,次数多少与单片机的时钟晶振有关,时钟晶振越高单片机执行速度越快,重复次数就越多整个按键数百ms按下瞬间,抖动时间大概10ms弹起瞬间,抖动大概10ms按键一次出现的电平变化(上面的时间都是老师说的和书上现成的,没有实际测试,而且不同的按键应该也会有差异,作为学习研究确实不应该,找个时间锅锅会测出这个时间供大家参考,嘿嘿)由图我们可以看出,按下去瞬间会出现抖动,弹起来也会出现抖动,明显是个阻尼振动,按键扫描程序是按顺序执行的;首先提出三个问题大家思考一下为什么要消除抖动如何消抖是不是按键都要消抖,不是的话,哪些需要消抖,哪些不需要消抖消抖的时间是不是必须10ms按键消抖的方式是不是一定像书上的那样,如何消抖更节省CPU,且更简单按键如果不消除抖动,那么单片机检测到的低电平的次数就不止一次,那我们按键一次,单片机会检测到多次,比如我们把按某个按键设置按一次成某个变量加1,结果按一次就加了很多次,这样我们就不能精确的通过按键来调整我们想要的参数,所以我们消除抖动的目的就是要实现按一次按键让单片机读出一次按键操作消抖分硬件和软件消抖,硬件消抖有《模拟电子技术》上提到用三态门实现,当然还有周立功那个7920(管理数码管和按键的芯片),当然还有很多硬件电路以及一些按键有自带消抖电路,但是如果要做产品硬件消抖肯定会增加成本,一般都会考虑软件消抖软件消抖我们先来看看书上消抖方法如下图延时10ms延时10ms书上的按键软件消抖方法例程Unsignedcharkeyscan()//这里是用的P2口作为按键的输入口{Unsignedcharkey;//定义按键的键值变量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;case0x7f:return8;break;default:return0;break;}}}当然延时函数delay肯定要写才能用这个函数voiddelay(unsignedcharx)//对应12M的晶振是1ms{unsignedchari,j;for(i=0;i〈100;i++)for(j=0;j<10*x;j++);}这个消抖里面有延时函数如果时序处理不好就要出问题;被我们单片机老师称为“弱智程序”,原因就是用了软件延时(软件延时会占用CPU资源),当然对于刚入门还是可以学一下,很容易理解,方便以后提升(学习嘛当然由易到难还是值得推荐的)要提高首先要把软件延时换成定时器,或者不用这种方法下面介绍我自己改进的两种方法首先我们消抖的目的就是为了按键一次只让单片机采集到一次按键操作,所以我就让单片机采集到一次操作以后不再检测,当然是在按键时间内,前面提到人按键一次操作数百ms,所以这儿我们可以再检测到一次按键后打开定时器,在数百ms内不再检测检测到按键一次不检测方法一Unsignedcharkeyscan()//这里是用的P2口作为按键的输入口{StaticT=0;Unsignedcharkey;//定义按键的键值变量if(P2!=0xff){key=P2;while(P2!=0xff);if(TR0=0)TR0=1;if(T>100)TR0=0;if(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:return7;break;case0x7f:return8;break;default:return0;break;}}}定时器函数