单片机按键去抖原理

上传人:mg****85 文档编号:43156606 上传时间:2018-06-04 格式:PDF 页数:4 大小:569.61KB
返回 下载 相关 举报
单片机按键去抖原理_第1页
第1页 / 共4页
单片机按键去抖原理_第2页
第2页 / 共4页
单片机按键去抖原理_第3页
第3页 / 共4页
单片机按键去抖原理_第4页
第4页 / 共4页
亲,该文档总共4页,全部预览完了,如果喜欢就下载吧!
资源描述

《单片机按键去抖原理》由会员分享,可在线阅读,更多相关《单片机按键去抖原理(4页珍藏版)》请在金锄头文库上搜索。

1、从单片机初学者迈向单片机工程师从单片机初学者迈向单片机工程师-KEY篇第一章 按键程序编写的基础篇第一章 按键程序编写的基础 从这一章开始,我们步入按键程序设计的殿堂。在基于单片机为核心构成的应用系统中,用户输入是必不可少的一部分。输入可以分很多种情况,譬 如有的系统支持PS2键盘的接口,有的系统输入是基于编码器,有的系统输入是基于串口或者USB或者其它输入通道等等。在各种输入途径中,更常见的 是,基于单个按键或者由单个键盘按照一定排列构成的矩阵键盘(行列键盘)。我们这一篇章主要讨论的对象就是基于单个按键的程序设计,以及矩阵键盘 的程序编写。 按键检测的原理 常见的独立按键的外观如下,相信大家

2、并不陌生,各种常见的开发板学习板上随处可以看到他们的身影。 总共有四个引脚,一般情况下,处于同一边的两个引脚内部是连接在一起的,如何分辨两个引脚是否处在同一边呢?可以将按键翻转过来,处于同一 边的两个引脚,有一条突起的线将他们连接一起,以标示它们俩是相连的。如果无法观察得到,用数字万用表的二极管挡位检测一下即可。搞清楚这点非 常重要,对于我们画PCB的时候的封装很有益。 它们和我们的单片机系统的I/O口连接一般如下: 对于单片机I/O内部有上拉电阻的微控制器而言,还可以省掉外部的那个上拉电阻。简单分析一下按键检测的原理。当按键没有按下的时候,单片机 I/O通过上拉电阻R接到VCC,我们在程序中

3、读取该I/O的电平的时候,其值为1(高电平); 当按键S按下的时候,该I/O被短接到GND,在程序中读取该I/O的电 平的时候,其值为0(低电平) 。这样,按键的按下与 否,就和与该按键相连的I/O的电平的变化相对应起来。结论:我们在程序中通过检测到该I/O口电平的变化与否,即可以知道按键是否被按下,从而 做出相应的响应。一切看起来很美好,是这样的吗? 现实并非理想 在我们通过上面的按键检测原理得出上述的结论的时候,其实忽略了一个重要的问题,那就是现实中按键按下时候的电平变化状态。我们的结论是基 于理想的情况得出来的,就如同下面这幅按键按下时候对应电平变化的波形图一样: 而实际中,由于按键的弹

4、片接触的时候,并不是一接触就紧紧的闭合,它还存在一定的抖动,尽管这个时间非常的短暂,但是对于我们执行时间以us 为计算单位的微控制器来说, 它太漫长了。因而,实际的波形图应该如下面这幅示意图一样。 Page 1 of 5从单片机初学者迈向单片机工程师-KEY篇第一章 按键程序编写的基础 - 嵌入.2011-4-15mhtml:file:/F:单片机从单片机初学者迈向单片机工程师KEY篇第一章 按键程.这样便存在这样一个问题。假设我们的系统有这样功能需求:在检测到按键按下的时候,将某个I/O的状态取反。由于这种抖动的存在,使得我们的微 控制器误以为是多次按键的按下,从而将某个I/O的状态不断取反

5、,这并不是我们想要的效果,假如该I/O控制着系统中某个重要的执行的部件,那结果更 不是我们所期待的。于是乎有人便提出了软件消除抖动的思想,道理很简单:抖动的时间长度是一定的,只要我们避开这段抖动时期,检测稳定的时候的 电平不久可以了吗?听起来确实不错,而且实际应用起来效果也还可以。于是,各种各样的书籍中,在提到按键检测的时候,总也不忘说道软件消抖。就 像下面的伪代码所描述的一样。(假设按键按下时候,低电平有效) If(0 = io_KeyEnter) /如果有键按下了 Delayms(20) ; /先延时20ms避开抖动时期 If(0 = io_KeyEnter) /然后再检测,如果还是检测到

6、有键按下 return KeyValue ; /是真的按下了,返回键值 else return KEY_NULL /是抖动,返回空的键值 while(0 = io_KeyEnter) ; /等待按键释放 乍看上去,确实挺不错,实际中呢?在实际的系统中,一般是不允许这么样做的。为什么呢?首先,这里的Delayms(20) , 让微控制器在这里白白等 待了20 ms 的时间,啥也没干,考虑我在学会释放CPU一章中所提及的几点,这是不可取的。其次while(0 = io_KeyEnter) ;更是程序设计中的大忌 (极少的特殊情况例外)。任何非极端情况下,都不要使用这样语句来堵塞微控制器的执行进程。

7、原本是等待按键释放,结果CPU就一直死死的盯住该按键, 其它事情都不管了,那其它事情不干了吗?你同意别人可不会同意所以合理的分配好微控制的处理时间,是编写按键程序的基础。 消除抖动有必要吗? 的确,软件上的消抖确实可以保证按键的有效检测。但是,这种消抖确实有必要吗?有人提出了这样的疑问。抖动是按键按下的过程中产生的,如果 按键没有按下,抖动会产生吗?如果没有按键按下,抖动也会在I/O上出现,我会立刻把这个微控制器锤了,永远不用这样一款微控制器。所以抖动的出现 即意味着按键已经按下,尽管这个电平还没有稳定。所以只要我们检测到按键按下,即可以返回键值,问题的关键是,在你执行完其它任务的时候,再次

8、执行我们的按键任务的时候,抖动过程还没有结束,这样便有可能造成重复检测。所以,如何在返回键值后,避免重复检测,或者在按键一按下就执行功 能函数,当功能函数的执行时间小于抖动时间时候,如何避免再次执行功能函数,就成为我们要考虑的问题了。这是一个仁者见仁,智者见智的问题,就 留给大家去思考吧。所以消除抖动的目的是:防止按键一次按下,多次响应。 本主题由 杨中科 于 2010-5-12 12:47 鉴定为 精华收藏分享C语言也能写图形的俄罗斯方块?! 发表于 2010-5-12 16:59 | 只看该作者 2楼确实是个问题。值得考虑,用中断扫描时间太短。等待大虾回答,顶下C语言学完以后学什么? TO

9、P 发表于 2010-5-12 17:48 | 只看该作者 3楼要不硬件上消下抖,加个电容? 为什么某个IO状态翻转呢?为什么不像电脑一样,有kbhit这样的判断存在,我们可以在有键按下时锁住所按键的扫描码吧,当然视 你要完成的功能而定这样的话,由于所按的键已锁存,后面的中断判断的就是有无按键了,调节好其判断条件如时间什么的,就像电 脑设置了按键响应速度一样,这样可以解决吧。 Page 2 of 5从单片机初学者迈向单片机工程师-KEY篇第一章 按键程序编写的基础 - 嵌入.2011-4-15mhtml:file:/F:单片机从单片机初学者迈向单片机工程师KEY篇第一章 按键程.讨论下吧!C语

10、言也能写图形的俄罗斯方块?! TOP 发表于 2010-5-12 23:58 | 只看该作者 4楼硬件上可以用电容消抖,并接一个104即可 ,如果还想要更好的效果,可以用74HC14对波形整形。我见过的按键除了上述的硬件处 理之外,软件上面同样要消抖,因为是用在工业环境里,什么情况都有可能出现。 “我们可以在有键按下时锁住所按键的扫描码吧,当然视你要完成的功能而定这样的话,由于所按的键已锁存,后面的中断判断的就 是有无按键了,调节好其判断条件如时间什么的,就像电脑设置了按键响应速度一样,这样可以解决吧。” 呵呵,想法太简单。 按键处理也要分情况,对于很重要的,一般接中断,剩下的应用级的,在主循

11、环中循环检测即可。 比较好的做好是,开辟一个环形缓冲。确定按键按下,丢到缓冲区,任务根据当前状态取键值,作处理。C语言也能写图形的俄罗斯方块?! TOP 发表于 2010-7-10 13:09 | 只看该作者 5楼我倒觉得有软件去抖就够了,不过在工业控制产品中更经常采用什么方法来解决我就不清楚了C语言也能写图形的俄罗斯方块?! TOP 发表于 2010-7-26 12:42 | 只看该作者 6楼这听耐人寻味的,电子技术课程里头提到过这些,在这里电子技术和01代码见面了C语言学完以后学什么? TOP 发表于 2010-7-26 21:33 | 只看该作者 7楼检测电平的上升沿就可以了,没有必要使

12、用硬件消除抖动。C语言学完以后学什么? TOP 缘海地带缘海地带 发表于 2010-7-30 15:36 | 只看该作者 8楼在你执行完其它任务的时候,再次执行我们的按键任务的时候,抖动过程还没有结束,这样便有可能造成重复检测。所以,如何在返 回键值后,避免重复检测,或者在按键一按下就执行功能函数,当功能函数的执行时间小于抖动时间时候,如何避免再次执行功能函 数,就成为我们要考虑的问题了。这是一个仁者见仁,智者见智的问题,就留给大家去思考吧。所以消除抖动的目的是:防止按键一 次按下,多次响应。 这段感觉我老是理解不来?能再清楚点不?我比较笨。Page 3 of 5从单片机初学者迈向单片机工程师

13、-KEY篇第一章 按键程序编写的基础 - 嵌入.2011-4-15mhtml:file:/F:单片机从单片机初学者迈向单片机工程师KEY篇第一章 按键程.C语言也能写图形的俄罗斯方块?! TOP 发表于 2010-8-4 19:30 | 只看该作者 9楼单片机程序是一个死循环,你循着时间一步步推导程序的执行流程就清楚“你执行完其它任务的时候,再次执行我们的按键任务的时 候,抖动过程还没有结束,这样便有可能造成重复检测”这句话的意思了。史上最牛免费.Net视频教程杨老师亲自授课 TOP 发表于 2010-8-8 00:12 | 只看该作者 10楼老大 我到哪下单片机的视频啊C语言学完以后学什么?

14、 TOP 发表于 2010-8-24 20:29 | 只看该作者 11楼用中断或者查询的方法都可以,一般都是软件去抖,延时20ms以上C语言也能写图形的俄罗斯方块?! TOP 发表于 2010-8-25 19:25 | 只看该作者 12楼用中断或者查询的方法都可以,一般都是软件去抖,延时20ms以上 yjf715 发表于 2010-8-24 20:29 不要延时,延时属于没有入门的人使用的。Page 4 of 5从单片机初学者迈向单片机工程师-KEY篇第一章 按键程序编写的基础 - 嵌入.2011-4-15mhtml:file:/F:单片机从单片机初学者迈向单片机工程师KEY篇第一章 按键程.消除抖动的目的是:防止按键一次按下,多次响应。 很精辟的论断.

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 生活休闲 > 科普知识

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号