3.2.2 独立按键检测(消抖流程图)
- 格式:ppt
- 大小:1.57 MB
- 文档页数:2
单片机按键处理技巧及编程方式2010-10-23 15:01从这一章开始,我们步入按键程序设计的殿堂。
在基于单片机为核心构成的应用系统中,用户输入是必不可少的一部分。
输入可以分很多种情况,譬如有的系统支持PS2键盘的接口,有的系统输入是基于编码器,有的系统输入是基于串口或者USB或者其它输入通道等等。
在各种输入途径中,更常见的是,基于单个按键或者由单个键盘按照一定排列构成的矩阵键盘(行列键盘)。
我们这一篇章主要讨论的对象就是基于单个按键的程序设计,以及矩阵键盘的程序编写。
◎按键检测的原理常见的独立按键的外观如下,相信大家并不陌生,各种常见的开发板学习板上随处可以看到他们的身影。
(原文件名:1.jpg)引用图片总共有四个引脚,一般情况下,处于同一边的两个引脚内部是连接在一起的,如何分辨两个引脚是否处在同一边呢?可以将按键翻转过来,处于同一边的两个引脚,有一条突起的线将他们连接一起,以标示它们俩是相连的。
如果无法观察得到,用数字万用表的二极管挡位检测一下即可。
搞清楚这点非常重要,对于我们画PCB的时候的封装很有益。
它们和我们的单片机系统的I/O口连接一般如下:(原文件名:2.jpg)引用图片对于单片机I/O内部有上拉电阻的微控制器而言,还可以省掉外部的那个上拉电阻。
简单分析一下按键检测的原理。
当按键没有按下的时候,单片机I/O通过上拉电阻R接到VCC,我们在程序中读取该I/O的电平的时候,其值为1(高电平); 当按键S按下的时候,该I/O被短接到GND,在程序中读取该I/O的电平的时候,其值为0(低电平) 。
这样,按键的按下与否,就和与该按键相连的I/O的电平的变化相对应起来。
结论:我们在程序中通过检测到该I/O口电平的变化与否,即可以知道按键是否被按下,从而做出相应的响应。
一切看起来很美好,是这样的吗?◎现实并非理想在我们通过上面的按键检测原理得出上述的结论的时候,其实忽略了一个重要的问题,那就是现实中按键按下时候的电平变化状态。
一、按键消抖1.1 计数器型消抖电路(一)计数器型消抖电路(一)是设置一个模值为(N+1)的控制计数器,clk在上升沿时,如果按键开关key_in='1',计数器加1,key_in='0' 时,计数器清零。
当计数器值为2时,key_out 输出才为1,其他值为0时。
计数器值为N时处于保持状态。
因此按键key_in持续时间大于N个clk时钟周期时,计数器输出一个单脉冲,否则没有脉冲输出。
如果按键开关抖动产生的毛刺宽度小于N个时钟周期,因而毛刺作用不可能使计数器有输出,防抖动目的得以实现。
clk的时钟周期与N的值可以根据按键抖动时间由设计者自行设定。
主要程序结构如下:图1是N为3的波形仿真图,当按键持续时间大于3个时钟周期,计数器输出一个单脉冲,其宽度为1个时钟周期,小于3个时钟周期的窄脉冲用作模拟抖动干扰,从图1可以看出,抖动不能干扰正常的单脉冲输出。
1 按键抖动产生原因分析绝大多数按键都是机械式开关结构,由于机械式开关的核心部件为弹性金属簧片,因而在开关切换的瞬间会在接触点出现来回弹跳的现象。
虽然只是进行了一次按键,结果在按键信号稳定的前后出现了多个脉冲,如图1所示。
如果将这样的信号直接送给微处理器扫描采集的话,将可能把按键稳定前后出现的脉冲信号当作按键信号,这就出现人为的一次按键但微处理器以为多次按键现象。
为了确保按键识别的准确性,在按键信号抖动的情况下不能进入状态输入,为此就必须对按键进行消抖处理,消除抖动时不稳定、随机的电压信号。
机械式按键的抖动次数、抖动时间、抖动波形都是随机的。
不同类型的按键其最长抖动时间也有差别,抖动时间的长短和按键的机械特性有关,一般为5~10 ms,但是,有些按键的抖动时间可达到20 ms,甚至更长。
所以,在具体设计中要具体分析,根据实际情况来调整设计。
2 按键消抖电路的设计按键消抖一般采用硬件和软件消抖两种方法。
硬件消抖是利用电路滤波的原理实现,软件消抖是通过按键延时来实现。
炼狱传奇-基于边缘检测的按键消抖
之战
按键开关是各种电子设备不可或缺的人机接口,在实际应用中很大一部分的按键是机械按键,在按键闭合或断开的时候都会产生抖动,为了系统能正确识别按键信号,我们就必须进行按键消抖处理。
实际的系统中有各种按键消抖的方法,在这里我们介绍一种基于信号边缘检测的消抖方法。
在较大型的系统设计中,为了避免过多的逻辑冗余和控制错误,我们一般会选择尖峰脉冲作为多个模块之间的握手信号或控制信号,我们此战的目的就是要将检测到的按键电平变化经过抖动消除以后转换成只有一个周期的尖峰脉冲输
系统功能说明:当系统第一次检测到按键按下以后,开始启动计数器计数,如果在20ms内没有再次检测到按键值跳变说明按键确实按下,而非噪声干扰,继而可以输出尖峰脉冲,控制其他模块动作。
否则计数器清零,等待下次按键到来。
具体代码如下:
测试代码如下:
测试波形如下:
由波形图可以看出,如果按键按下时间短就会被当做抖动处理,系统不做出反应,如果按键稳定时间足够长,系统输出key_come信号就会置高一个时钟周期,说明系统设计正确。
昆明理工大学信息工程与自动化学院学生实验报告(2013 —2014 学年第 2 学期)一、实验目的掌握单片机系统中独立键盘的编程控制方法,学会实时程序的调试技巧。
二、实验原理键盘是单片机应用中常用的输入设备,在应用系统中,操作人员可通过键盘向系统输入指令、地址和数据,实现简单的人机通信。
键盘实际上是一组按键开关的集合,平时总是处于断开状态,当按下键时它才闭合。
按键在闭合和断开时,触点会存在抖动现象,抖动时间一般为5-10ms,键盘的处理主要涉及以下3个方面的内容:➢按键的识别所接I/O口线是高还是低电平(根据连接情况)➢抖动的消除硬件消抖软件消抖(延时)➢判断键值实验板电路原理图如下:三、实验内容利用TX-1C实验板上的数码管前三位显示一个跑表,从000到999之间以1%秒速度运行,当按下独立键盘的S2时跑表停止,松开手后跑表继续运行。
(用定时器设计表)。
在上面的基础上,用另外三个独立键盘(S3、S4、S5)实现按下S3时计时停止,按下S4时计时开始,按下S5时计数值清零从头开始。
四、实验步骤1、按实验内容要求在µ Vision中创建项目,编辑、调试、编译程序。
2、将编译生成的目标码文件(后缀为.Hex)下载到实验板上。
3、观察实验运行结果并记录。
1.原理补充:在简单的单片机应用系统中,往往只需要几个功能键就能满足要求,此时,可采用独立式按键结构。
独立式按键是直接用I/O口线构成的单个按键电路,其特点是每个按键单独占用一根I/O口线,每个按键的工作不会影响其它I/O口线的状态。
独立式按键的典型应用如图1.2.1所示。
独立式按键示意图独立式按键电路配置灵活,软件结构简单,但每个按键必须占用一根I/O口线,因此,在按键较多时,I/O口线浪费较大,不宜采用。
程序开始,检测按键是否被按下,若按下,则移动机器人启动,未被按下,继续检测。
这里将程序分成三个部分,分别是延时子函数、按键子函数、主函数。
一个即简单经济又稳定可靠的独立按键检测设计方案作者:罗立辉来源:《中国科技纵横》2015年第20期【摘要】本文首先简要介绍了独立按键检测主动查询与中断查询这两种方式的优缺点。
根据这两种方式的优缺点,本文着重讨论了具有跟大优势的中断查询方式的按键检测方案的实现原理和过程。
并且,针对按键普遍存在的抖动问题,本文由简单到复杂的过渡方式,详细深入地介绍进行方案的优化和改良的目的以及方法。
【关键词】按键延时抖动扫描1主动查询方式的优缺点对于主动循环查询方式,最大的优点在于原理简单,比较适合于MCU处理的任务不是特别多的情况。
如果MCU大循环的轮询周期较长,很有可能在按键按下的瞬间错过了。
这是主动查询方式的最大缺点。
另外,该方式比较浪费CPU的时间资源。
检测按键的处理程序需要有个延迟消抖的过程。
对于机械弹性开关,一般需要的的延迟消抖时间为10ms。
很多程序都是使用一般的延时函数来实现消抖的目的。
然而对于很多复杂的产品,CPU需要执行繁重的任务。
在10ms时间里,CPU可以执行上千上万条其他任务的汇编指令。
2中断查询的方式的优缺点中断查询方式主要缺点在于,该方式需要占用MCU一个外部中断功能(有些功能简单、价钱低廉的MCU,其IO引脚复用功能资源有限),以及处理程序稍微复杂一下。
与主动查询相比,中断查询方式则有响应时间短、稳定可靠等优点。
一旦有中断响应,CPU一定立即响应中断请求。
因此,中断查询方式不存在“错过”、“漏检”的情况。
按键检测的原理图设计图1所示:图1 按键检测的原理图设计图在原理图1设计中,为了检验按键被按下,MCU在中断服务程序里,通过程序翻转LED 亮灭状态,以便读者更容易理解其中的原理机制。
经过测试,每按一下按键,LDE灯都实现了翻转的动作。
该函数基本实现了预期的功能。
在中断函数里,笔者使用了简单的的概率统计方法,提高准确性。
这个中断服务程序运行的时间大概为5us*20=0.1ms,远远少于相对通常的软件延时方式所用的10ms,因此提高了CPU对资源的使用效率。
状态机实现去抖动原理:按键去抖动关键在弄提取键稳定的电平状态,滤除前沿、后沿抖动毛刺。
对于一个按键信号,可以用一个脉冲对它进行取样,如果连续三次取样为低电平,可以认为信号已经处于键稳定状态,这时输出一个低电平的按键信号。
继续取样的过程如果不能满足连续三次取样为低,则认为键稳定状态结束,这时输出变为高电平。
设计的状态转换图如图所示。
Reset信号有效时,电路进入复位状态s0,这时认为取样没有检测到低电平,在输入取样过程中,每次检测到一个低电平,发生依次向下的状态转移,直到连续检测到三个低电平时,进s3态,这时输出置低(按键信号稳定态),在中间状态s1,s2时,一旦检测到高电平,就进入s0状态,重新检测。
library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;entity xiaod isport(clk : in std_logic ;reset : in std_logic ;din : in std_logic ;dout : out std_logic);end entity;architecture rtl of xiaod isTYPE state IS( s0,s1,s2,s3);SIGNAL pre_s, next_s: state;beginprocess( reset, clk )beginif reset = '0' thenpre_s <= s0;elsif rising_edge( clk ) thenpre_s <= next_s;elsenull;end if;end process;process( pre_s, next_s, din ) begincase pre_s iswhen s0 =>dout <= '1';if din = '1' thennext_s <= s0;elsenext_s <= s1;end if;when s1 =>dout <= '1';if din = '1' thennext_s <= s0;elsenext_s <= s2;end if;when s2 =>dout <= '1';if din = '1' thennext_s <= s0;elsenext_s <= s3;end if;when s3 =>dout <= '0';if din = '1' thennext_s <= s0;elsenext_s <= s1;end if;end case;end process ;end rtl;程序中din为要去抖动的热键信号,dou为去抖后输出的稳定信号。
单片机原理■独立按键识别■单片机原理■实验报告宁德师范学院计算机系实验报告(2014— 2015 W 第2 学期)课程名称_________ 单片机原理 _________ 实验名称独立按键识别__________ 专业计算机科学与技术(非师)年级_______________ 12> _____________ 学号B2012102147姓名王秋指导教师__________ 杨烈君____________ 实验日期___________ 2015.5.27 ________实验目的:1. 掌握查询式按键的原理和编程方法实验要2.理解按键防抖技术1. 在Proteus软件中画好51单片机最小核心电路,包括复位电路和晶振电路2. 在电路中增加按键、Led灯、八位7段数码管(共阳/共阴自选),将P2 口作数据输出口与7段数码管数据引脚相连,P3引脚输出位选控制信号。
实3 现单按键控制Led灯闪烁实现单按键多功能识别一一控制4路Led 灯闪烁5 实现0・99的计数器效果,按一下数值加一- 实现0・99码表(按一次开始计时,第二第次停止,三次清零)7倉扩展要求:通过3个按键实现时钟的调整模(KEY1 式,KEY2 + , KEY3 ・)实验设备(环境):计算机、Proteus ISIS 7 Professional 应用程序、Ke 订应用程序实验内容:_[麴WS轟P 控制4路Led]'实现99的计数器效果,按一下数值加一实现99码表(按一次开始计时,第二第次停g,三次清零)J 扩展要求:通过3个按键实现时钟的调整(KEY1 模式‘ KEY2 + , KEY3 ・)实验步骤、实验结果及分析:1、使用Proteus ISIS 7 Professional 应用程序,建立一个.DSN文件2、在“库”下拉菜单中,选中“拾取元件”(快捷键P),分别选择以下元件:AT89C51 CAP CAP-ELEC CRYSTAL RESPACK。
1、MAIN.ASM;====变量定义段====CS0 BIT P2.0 ;个位位选CS1 BIT P2.1 ;十位位选CS2 BIT P2.2 ;百位位选CS3 BIT P2.3 ;千位位选CS4 BIT P2.4 ;LED灯位选DSW EQU 30H ;位选计数DSB0 EQU 31H ;显示缓冲单元个位DSB1 EQU 32H ;显示缓冲单元十位DSB2 EQU 33H ;显示缓冲单元百位DSB3 EQU 34H ;显示缓冲单元千位DSB4 EQU 20H ;显示缓冲单元指示灯状态LD1 BIT DSB4.0 ;指示灯LD1控制位LD2 BIT DSB4.1 ;指示灯LD2控制位LD3 BIT DSB4.2 ;指示灯LD3控制位LD4 BIT DSB4.3 ;指示灯LD4控制位LD5 BIT DSB4.4 ;指示灯LD5控制位LD6 BIT DSB4.5 ;指示灯LD6控制位LD7 BIT DSB4.6 ;指示灯LD7控制位LD8 BIT DSB4.7 ;指示灯LD8控制位KEY EQU 21H ;键状态字SW1 BIT KEY.6 ;SW1键SW2 BIT KEY.7 ;SW2键EKEY EQU 22H ;键前沿字ESW1 BIT EKEY.6 ;SW1键前沿ESW2 BIT EKEY.7 ;SW2键前沿KTMR EQU 35H ;键去抖延时器AJS1 EQU 40H ;每按一次SW1,(AJS2:AJS1)+1 AJS2 EQU 41H ;每按一次SW2,(AJS2:AJS1)-1 ;====常数定义段====;==================ORG 0000HLJMP MAINORG 0030HMAIN: INCLUDE "INITIAL.INC"MLOOP: LCALL DELAY ;延时5msLCALL RDKEY ;读键LCALL DISPJNB ESW1,M03 ;无SW1键转移MOV R6,#00HMOV R7,#01HSJMP M05M03: JB ESW2,M04 ;有SW2键转移LJMP MLOOPM04: MOV R6,#99HMOV R7,#99HM05: MOV A,AJS1 ;(AJS2:AJS1)十进制±1ADD A,R7DA AMOV AJS1,AMOV A,AJS2ADDC A,R6DA AMOV AJS2,AMOV A,AJS1 ;(AJS2:AJS1)送显示ANL A,#0FHMOV DSB0,AMOV A,AJS1SW AP AANL A,#0FHMOV DSB1,AMOV A,AJS2ANL A,#0FHMOV DSB2,AMOV A,AJS2SW AP AANL A,#0FHMOV DSB3,ALJMP MLOOP;====延时子程序(2*R7+3)*R6+5=5ms====DELAY: MOV R6,#0AHDL01: MOV R7,#0F8HDL02: DJNZ R7,DL02DJNZ R6,DL01RET;====通用子程序段====INCLUDE "RDKEY.ASM";添加读键状态及去抖处理子程序INCLUDE "DISP.ASM" ;添加数码管动态扫描显示子程序END2、INITIAL.INCMOV SP,#5FHMOV R0,#20HMOV R7,#60HCLR AM01: MOV @R0,A ;存储器20H-7FH清零INC R0DJNZ R7,M01MOV DSB0,#03HMOV DSB1,#01HMOV DSB2,#01HMOV DSB3,#07HMOV R4,#0C8HM02: LCALL DELAYLCALL DISP ;显示"7113"1秒DJNZ R4,M02CLR AMOV DSB0,AMOV DSB1,AMOV DSB2,AMOV DSB3,AEND3、RDKEY.ASM;====读独立按键子程序(延时去抖)==== RDKEY: ORL P1,#0C0H ;先置1,后读口MOV A,P1 ;读键ANL A,#0C0H ;接独立键盘的位保留XRL A,#0C0H ;求反转正逻辑MOV R7,A ;新的键状态暂存R7CJNE A,KEY,RDK0 ;键状态变化则转移MOV KTMR,#05H ;去抖延时器加载初值SJMP RDK1RDK0: MOV A,KTMR ;过了延时时间?JZ RDK1DEC KTMR ;延时未结束MOV R7,KEY ;放弃不稳定的键状态RDK1: MOV A,KEY ;键前沿提取XRL A,R7ANL A,R7MOV EKEY,AMOV KEY,R7 ;启用键的新状态RETEND4、DISP.ASM;====5位数码管扫描子程序====DISP: ORL P2,#1FH ;关闭数码显示器MOV A,DSW ;根据扫描循环变量转移ANL A,#07HRL AMOV DPTR,#DSTABJMP @A+DPTRDSTAB: AJMP DIS0AJMP DIS1AJMP DIS2AJMP DIS3AJMP DIS4AJMP DIS0AJMP DIS0AJMP DIS0DIS0: MOV A,DSB0 ;扫描个位数码管ANL A,#0FHMOV DPTR,#LED7 ;查显缓个位值的七段码表MOVC A,@A+DPTRMOV P0,A ;七段码送P0口CLR CS0 ;点亮个位数码管MOV DSW,#01H ;扫描指针指向下十位RETDIS1: MOV A,DSB1 ;扫描十位数码管ANL A,#0FHMOV DPTR,#LED7MOVC A,@A+DPTRMOV P0,ACLR CS1MOV DSW,#02HRETDIS2: MOV A,DSB2 ;扫描百位数码管ANL A,#0FHMOV DPTR,#LED7MOVC A,@A+DPTRMOV P0,ACLR CS2MOV DSW,#03HRETDIS3: MOV A,DSB3 ;扫描千位数码管ANL A,#0FHMOV DPTR,#LED7MOVC A,@A+DPTRMOV P0,ACLR CS3MOV DSW,#04HRETDIS4: MOV A,DSB4 ;扫描指示灯CPL AMOV P0,ACLR CS4MOV DSW,#00HRET;====LED段码表====LED7: DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H DB 80H,90H,88H,83H,86H,0A1H,86H,8EHEND。
实验5 按键消抖1. 实验目的1. 掌握QuartusII的硬件描述语言设计方法2. 了解同步计数器的原理及应用3. 设计一个带使能输入、进位输出及同步清零的增1四位N (N<16)进制同步计数器2. 准备知识在按键使用的过程中,常常遇到按键抖动的问题,开关在闭合(断开)的瞬间,不能一接触就一直保持导通(断开),因为开关的机械特性,重要经历接触-断开-再接触-再断开,最终稳定在接触位置,这就是开关的抖动,即虽然只是按下按键一次然后放掉,结果在按键信号稳定前后,竟出现了一些不该存在的噪声,这样就会引起电路的误动作。
在很多应用按键的场合,要求具有消抖措施。
按键抖动与开关的机械特性有关,其抖动期一般为5-10ms。
图5.1 按键电平抖动示意图按键的消除抖动分为硬件消除抖动和软件消除抖动。
硬件消除抖动一般采用滤波的方法,通常在按键两端并联一个1~10u左右的电容,有时这样也不能完全消除按键的抖动。
软件消除抖动的方法有多种,常用的是延时扫描和定时器扫描。
延时扫描其原理为:检测到按键操作后延时一端时间(如10ms)后,再检测是否为仍然为同样的按键操作状态,如果相同,就认为是进行了按键操作,然后对该操作进行相应的处理。
定时器扫描的原理是:每隔一端时间(几毫秒)扫描一次键盘,如果连续两次(或3次)的所获得的按键状态相同,就输出按键状态,然后再对这种按键状态进行处理,这里的扫描时间间隔和连续判断按键状态的次数是有关系的,一般总时间要大于按键的抖动期。
如果总时间太长,则感觉按键迟钝,太短可能不能完全消除抖动,要根据实际的情况合适的选择。
在实际电路设计中,经常采用的是软硬件相结合对按键进行消除抖动的处理方法。
本实验采用的方法:实验箱按键的硬件电路是共阳极电路,按下按键时输出到FPGA管脚的电平为低电平,松开按键时为高电平。
我们采用5ms的定时器扫描FPGA管脚电平,如果连续3次为低电平时,存储连续按键状态的次数CNT的值加1,直到该计数值等于10(或再大一些),就不再累加(防止长按该值溢出而重新计数),此时认为按键已稳定,输出按键操作标志;在该过程中,一旦FPGA管脚电平为低电平就对CNT复位清零并同时对按键操作标志位复位,即一个异步复位。
关于单片机按键的抖动与消抖关于单片机按键的抖动与消抖在单片机的程序中,如果涉及到按键,一般都会看到几行注释着消抖的代码。
比如下面这一段:if((KeyV|0xc3)==0xff){//无键按下return 0; } mDelay(10);//延时,去键抖KeyV=P3; if((KeyV|0xc3)==0xff){//无键按下return 0; } 关于其作用与目的,有如下解释:按键在按下时会产生电平的变化,通常是由高电平变为低电平,而且这一过程也不是瞬间完成的,按键按下之后,电平会有一段不稳定变化的时间。
一般情况下,我们的程序读取这个电平变化并做相关的动作。
但由于机械按键的局限性,当系统受到外力而产生抖动或其它动作时,也可能使系统内部产生电平变化(通常这种变化持续的时间非常短),这种现象称之为按键的抖动。
这种抖动显然不是我们期望出现的,一旦程序中没有针对它进行特殊处理,这种隐患很可能导致系统执行我们不希望出现的动作。
进而可能酿成一场悲剧。
避免按键抖动的操作就称之为消抖。
目前,单片机的消抖主要分为软件消抖和硬件消抖。
其中,软件消抖增加软件资源,但不增加硬件成本;硬件消抖反之。
现在普遍采用的是软件消抖的方式。
软件消抖具体的操作思路是:当监听到按键被按下时,不立刻执行相关的操作,而进行一定时间的延时(通常是50ms),之后再次检测按键是否被按下,如果此时按键仍然被按下,则判定按键确实被按下了(因为不论是异常情况导致的抖动还是正常情况下按键被按下产生的电平变化都会在这一段时间内过去,紧接着的电平将会是稳定的),然后进行按键被按下之后所需要的操作,否则判定按键未被按下,继续监听按键状态。
实际上,以上所说的软件消抖的方法在真正的软件中应用的不多,只是在练习的时候使用。
真正的应用上,会在可能产生抖动的那一段时间内等间隔多次监听按键状态(电流状态),等到数次(可以是连续5 次)电流平稳了才确定按键被按下。
按键被放开时采取同样操。