单片机51 去抖按键程序
- 格式:doc
- 大小:35.50 KB
- 文档页数:6
单片机按键消抖处理方法(非软件延时)
以STC89C51单片机为例,STC89C51的P1.0、P1.1、P1.2分别接了3个按键。
下面代码为按键扫描处理部分函数,此部分代码通俗易懂,方便移植。
简单解释一下代码的含义:
定义一个含有3个元素的整形数组(静态变量),分别储存3个按键连续16次的状态。
Main函数不断的循环执行本函数刷新KeyDelay数组的状态,以KeyDelay[0]对应的P1.0为例,当按键没有按下的时候,KeyDelay[0]为0,即KeyDelay[0]变量的所有位均为0,
当该按键按下的时候,连续16次扫描便会使KeyDelay[0]变为0xffff(所有位都是1),
而当按下或者释放产生抖动时,那么连续16次扫描后不可能所有位都为0或都为1。
所以便可以用这种方法来进行软件消抖。
文档由胡保进编写。
本系统在光线下通过光照检测采集的光照强度值,把采集的数据通过AD模数转换成数字信号,以51单片机为主控芯片,根据实时光照强度实现窗帘打开和关闭。
整个系统在各个模块的分工合作下完成,实现自动控制、手动控制、定时控制、红外控制等功能内在联系。
主程序的任务是系统初始化,开关中断,对按键进行扫描,判断是否有按键按下,经过分析及处理后,执行相应的手动控制、定时控制、自动控制和红外控制等的指令,这四个模式可以自动互相切换。
显示模块是将各个模块信息显示在LCD1602屏幕上。
主程序还操控步进电机工作和显示步进电机的工作。
系统流程图如下图4-1所示。
图4-1 系统总流程图(一)显示模块程序设计执行该子程序时,首先对LCD1602显示屏初始化,对所有显示内容进行清零,接着对时钟进行初始化、对定时器初始化,根据程序中设定的时间显示时间。
当LCD1602的寄存器RS工作状态为高电平时,选择指令寄存器;读写选择RW,执行写操作;使能端EN从高电平到低电平过程中下降沿信号,将显示数据送到P2口,LCD执行数据指令,判断是否执行完毕。
若执行完成,数据显示,子程序退出。
若没有,返回到选择指令寄存器继续重复执行以前的步骤。
流程图如下图4-2所示。
图4-2 显示模块流程图(二)按键模块程序设计在本系统中,根据任务需求,设计了五个按键,分别是阈值+1、阈值-1、主功能键、手动开窗和手动关窗。
五个按键相互独立存在,互不干扰,与单片机串联。
但是这里我们需要先解决一个问题,就是对按键进行消抖。
任一按键无论是按下还是松开都会发生抖动,有时按了多次反应表现延迟或者按得快没有反应,这都是按键抖动的表现,所以这时就需要对按键进行消抖,按键消抖如果处理不好,可能还会给单片机发送错误指令,导致单片机运行工作错误。
为了解决这个问题,我采用了利用软件延迟的方法来解决按键抖动的问题。
思路:当扫描到某个按键按下时,编写程序时判别按键电路能否闭合是先通过2毫秒的延时,确定按下按键后再延时10毫秒,再次扫描按键时,如果此时按键还是按下状态,说明上面的方案是可行的。
单片机按键电容消抖电路1.引言1.1 概述概述部分的内容:在许多电子设备中,按键电路常常被使用来实现用户与设备之间的交互。
然而,由于按键的物理特性,如机械弹性和触点接触的不稳定性,会导致按键的震荡现象,即按键在按下或释放时会产生多次跳变。
这种跳变会导致单片机误读按键的信号,可能引发系统错误操作或不稳定的现象。
因此,为了保证按键信号的可靠性和稳定性,需要对按键进行消抖处理。
本篇文章将详细介绍单片机按键电容消抖电路的设计和实现原理。
通过在按键电路中引入电容元件,可以达到消抖的效果。
电容元件具有快速充放电的特性,可以有效地过滤掉按键震荡带来的干扰信号,确保单片机正确读取按键状态。
文章将首先介绍单片机按键的工作原理,包括按键的接口电路和输入电平变化的检测方式。
接着,将深入探讨按键消抖的必要性,分析不进行消抖处理所带来的潜在问题。
在这之后,将详细介绍按键电容消抖电路的设计原理,包括电容的连接方式和参数的选择。
最后,将给出经过实际测试的电路实现结果和相关性能指标的评估。
通过本文的阅读,读者将能够了解单片机按键的基本原理和消抖处理的必要性,掌握按键电容消抖电路的设计和实现方法,以及了解该电路的性能表现。
这对于开发单片机应用的工程师和爱好者来说,具有一定的指导意义和实践价值。
文章结构部分的内容是对整篇文章的组织和布局进行描述。
它向读者展示了文章的章节和主题,并指导读者理解和阅读文章的内容。
在本文中,文章结构如下:1. 引言1.1 概述1.2 文章结构1.3 目的2. 正文2.1 单片机按键原理2.2 按键消抖的必要性3. 结论3.1 按键电容消抖电路的设计原理3.2 电路实现与测试结果文章的结构分为引言、正文和结论三个主要部分。
在引言部分,概述简要介绍了单片机按键电容消抖电路的背景和重要性;文章结构部分指出了本文的章节组成和布局,为读者提供了阅读指南;目的阐明了文章的目标和意图。
正文部分主要包括单片机按键原理和按键消抖的必要性。
基于51单片机按键长按短按效果源程序[复制链接]* 实验名称:多位数按键加减** 晶振:12MHZ* 内容:按键加减数字,多个数码管显示,使用定时器做数码管动态扫描** 并区别长按短按效果,完全可以应用的实际生产中** ---------------------------------------------------------------*/#include<reg52.h> //包含头文件,一般情况不需要改动,//头文件包含特殊功能寄存器的定义sbit KEY_ADD=P3^3; //定义按键输入端口S17sbit KEY_DEC=P3^2; //S18#define DataPort P1 //定义数据端口程序中遇到DataPort 则用P1 替换sbit LATCH1=P2^0;//定义锁存使能端口段锁存sbit LATCH2=P2^1;// 位锁存sbit P35 = P3^5;//这是为了关闭开发板上的点阵实际应用去掉unsigned char code HEYAO_DuanMa[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};// 显示段码值0123456789unsigned char code HEYAO_WeiMa[]={0x1,0x2,0x4,0x8,0x10,0x20,0x40,0x80};//分别对应相应的数码管点亮,即位码unsigned char TempData[8]={0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF};//存储显示值的全局变量void DelayUs2x(unsigned char t);//函数声明void DelayMs(unsigned char t);void Init_Timer0(void);void Display(unsigned char FirstBit,unsigned char Num);/*------------------------------------------------主函数------------------------------------------------*/void main (void){unsigned char num=0,key_press_num;P35=0; //这是为了关闭开发板上的点阵实际应用去掉KEY_ADD=1; //按键输入端口电平置高KEY_DEC=1;Init_Timer0();while (1) //主循环{if(!KEY_ADD) //如果检测到低电平,说明按键按下DelayMs(10); //延时去抖,一般10-20msif(!KEY_ADD) //再次确认按键是否按下,没有按下则退出{while(!KEY_ADD){key_press_num++;DelayMs(10); //10x200=2000ms=2sif(key_press_num==200) //大约2s{key_press_num=0; //如果达到长按键标准//则进入长按键动作while(!KEY_ADD) //这里用于识别是否按//键还在按下,如果按//下执行相关动作,否则退出{if(num<99) //加操作num++;//即时把显示数据处理,如果去掉下面2//句处理信息,实际上看不到渐变效果,//而是看到跳变效果//用户可以自行屏蔽测试//分解显示信息,如要显示68,则68/10=6 68%10=8 TempData[0]=HEYAO_DuanMa[num/10];TempData[1]=HEYAO_DuanMa[num%10];DelayMs(50);//用于调节长按循环操作//的速度,可以自行调整此值以便达到最佳效果}}}key_press_num=0;//防止累加造成错误识别if(num<99) //加操作num++;}}if(!KEY_DEC) //如果检测到低电平,说明按键按下{DelayMs(10); //延时去抖,一般10-20msif(!KEY_DEC) //再次确认按键是否按下,没有//按下则退出{while(!KEY_DEC)key_press_num++;DelayMs(10);if(key_press_num==200) //大约2s{key_press_num=0;while(!KEY_DEC){if(num>0) //减操作num--;//分解显示信息,如要显示68,则68/10=6 68%10=8 TempData[0]=HEYAO_DuanMa[num/10];TempData[1]=HEYAO_DuanMa[num%10];DelayMs(50);//用于调节长按循环操作的速度}}}key_press_num=0;//防止累加造成错误识别if(num>0) //减操作num--;}}//分解显示信息,如要显示68,则68/10=6 68%10=8 TempData[0]=HEYAO_DuanMa[num/10];TempData[1]=HEYAO_DuanMa[num%10];// Display(0,8); //显示全部8位//主循环中添加其他需要一直工作的程序}}/*------------------------------------------------uS延时函数,含有输入参数unsigned char t,无返回值unsigned char 是定义无符号字符变量,其值的范围是0~255 这里使用晶振12M,精确延时请使用汇编,大致延时长度如下T=tx2+5 uS------------------------------------------------*/void DelayUs2x(unsigned char t){while(--t);}/*------------------------------------------------mS延时函数,含有输入参数unsigned char t,无返回值unsigned char 是定义无符号字符变量,其值的范围是0~255 这里使用晶振12M,精确延时请使用汇编------------------------------------------------*/void DelayMs(unsigned char t){while(t--){//大致延时1mSDelayUs2x(245);DelayUs2x(245);}}/*------------------------------------------------显示函数,用于动态扫描数码管输入参数FirstBit 表示需要显示的第一位,如赋值2表示从第三个数码管开始显示如输入0表示从第一个显示。
2007 年 11 月 第 4 期吉林师范大学学报 (自然科学版)Journal of J ilin Normal University ( Nat ural Science Edition)№. 4 Nov. 2007C51 中对按键的处理方法王春武1 ,李 岩2 ,孟祥英3 ,尹冬梅4(1. 吉林师范大学 信息技术学院 ,吉林 四平 136000 ;2. 山东临邑第一中学 ,山东 临邑 251500 ; 3. 四平德科电子有限公司 ,吉林 四平 136000 ;4. 东北师范大学 物理学院 ,吉林 长春 130024 ;)摘 要 :单片机控制系统中大多使用按键来实现控制功能 . 非编码键盘中如何消除按键瞬间的抖动和响应按键操作是设计者必须要考虑的问题 . 本文通过软件消除了按键抖动 ,并讨论如何实现响应一次键操作 . 文中还提供C51 单片机的按键识别的实用例程 .关键词 :单片机 ;按键 ;响应 ;抖动中图分类号 : TP368 文献标识码 :A 文章编号 :1000 - 1840 - (2007) 04 - 0086 - 02 在单片机控制系统中 ,通过按键实现控制功能是 M Hz ,编程软件为 Keil uVision2 [ 5 ] . 很常用的. 对按键处理[1 ]的重要环节是去抖动[2 ] ,即除 按下和抬起瞬间的抖动. 而消除抖动后面临的更大问 题就是解决按键的响应问题 ,包括按键的一次响应 ,一 键多功能等. 下面从两个方面来进行相应的讨论.1 按键去抖问题1. 1 原理阐述常用的按键由于机械触点的弹性作用 ,一个按 键开关在闭合时或断开时不会马上稳定下来 ,因而 在闭合和断开的瞬间都伴随着一连串的抖动 ,如图 1. 抖动时间的长短由按键的机械特性来决定 ,一般 为 5~10 ms. 这种抖动对人来说是感觉不到的 , 但图 1 按键抖动void delay (unsigned char i) {unsigned char j ;while ( - - i) {j = 180 ; while ( - - j) ;}}图 2 触发器去除抖动对单片机来说 ,则是完全可以感知的 ,因为单片机的 1. 2 举例说明 处理速度在微秒量级. 如果不对按键消除抖动则会 假设有电路图如图 3 所示 ,要完成如下要求的 引起程序处理的误操作. 去抖动的方法有很多种 ,如 电路控制 :当按键按下时 L ED 亮灭状态取反. 使用 R - S 触发器等的硬件方法[ 3 ] , 运用不同算法的各种 软 件[ 4 ] 方 法 等. 硬 件 方 法 会 增 加 成 本 和 体 积 ,如图 2 ;软件方法用的比较普遍 , 现 在 常 应 用 加 固定软件延时来去抖动. 具体方法就是在有按键按 下时 ,利用软件延时 10ms 或稍长的时间 ( 根据具体 键的机械特性来确定) 后再次检测按键是否按下 ,实 际上是避开了按键按下时的抖动时间. 实践证明 ,不 对按键释放的抖动进行处理 ,也能满足设计的要求.在程序中 添 加 此 函 数 则 可 以 实 现 延 时 , 参 数 i 表示 延 时 i 个 毫 秒. 应 用 中 可 以 这 样 调 用 : delay 图 3 按键触发 L ED 电路图(10) ,表示延时 10 ms. 本例中单片机的晶振采用 12收稿日期 :2007 - 09 - 24第一作者简介 :王春武 (1978 - ) ,男 ,吉林省松原市人 ,现为吉林师范大学信息技术学院助教 ,硕士. 研究方向 :计算机软件与应用.— 86 —main ( ){for ( ; ;){L ED = 1 ;/ /初始状态L ED灯灭if ( ! P10){delay (10) ;/ /延时10ms去抖按键仍然是按下的则执行while语句,系统会一直查询按键状态,只有按键抬起才可以退出循环结构,从而可以一次响应.方法二:加入按键标志( ! P10) / /确认去抖后按键是否真的按下P30 = ! P30 ;/ /触发L ED灯亮}}} bit k eymai n ( )mark = 0 ;/ /一次按键响应封锁标志2按键响应问题{for ( ; ;){if ( ! K & & ! key mark )2. 1问题阐述如图3所示,主要讨论如何在单片机设计中实现对按键的一次响应问题,即每次按下键时,系统只响应一次按键处理.从程序设计的表面上看,执行L ED = ! {delay (1) ;延时10ms去抖if ( ! K ){key mark = 1 ;/ /封锁按键,直到按键抬起L ED = ! L ED ;/ / L ED状态去反}}else if ( K )L ED语句即可,但实际应用中却出现L ED一直处于闪key mark = 0 ;/ /标志清零,为下次按键做好准备}}烁的情况,经分析发现:当程序中确定按键已被按下分析:其中key mark是位变量,只有当按键按时,会将L ED的状态取反,可当主程序不断的扫描按键下且keymark = 0时,程序才会继续确认是否真的时,按键一直处于按下的状态,系统会频繁的调用此语有键按下.经过延时去抖,程序中将key mark的值句,从而导致了,显然程序无法实现预期的要求. 置 1 ,然后执行其它语句,设想按键没有抬起,则因为现在介绍一下本文所用的方法. key mark的值已经变为 1 ,if ( ! K & & ! key mark 2. 2举例说明)将不会再次成立,直到当前的按键抬起,即else if下面是实现按键一次响应问题的常用两种方法. ( K)成立时key mark的值才重新为0.这样处理可方法一:查询方式main ( ){for ( ; ;){if ( ! k ){delay (1) ;延时10ms去抖if ( ! k ){L ED = ! L ED ;/ / L ED状态去反While ( ! k) ;/ /查询按键状态,只有按键抬起则退出循环}}}} 以实现每一次按键,系统只会调用一次键处理.3结论虽然以上的两种方法在实践中都有所应用,但是两种方法在效率上却大不相同.方法一,通过查询方式来判断按键系统就一直进行while死循环,从效率上看,CPU的执行效率变低.方法二,当第一次检测到按键真的按下处理完相应的程序后,CPU无分析:当有键按下时,经过延时去抖后,如果按需浪费时间等待按键抬起操作,从而可以用大部分键真的按下,则执行L ED状态取反语句,然后如果时间进行其它的处理,提高CPU的执行效率.参考文献[ 1 ]张素芬.键处理程序的设计方法[J ] .电子仪器仪表用户,1997 , (3) :12~15.[ 2 ]肖广安.一种软件去除键抖动的方法[J ] .单片机与嵌入式系统应用,2001 , (7) :63~65.[ 3 ]马家辰,孙玉德,张颖. MCS - 51单片机原理及接口技术[ M ] .哈尔滨:哈尔滨工业大学出版社,2004.[ 4 ]曾旖,奚大顺,李向阳.按键开关的抖动与消除方法[J ] .电子世界,2005 (9) :55~56.[ 5 ]孙鉴. KELL u ision2环境下仿真单片机程序[J ] .计算机辅助工程,2006 , (2) :74~77.The Handles Method on Button in C51W A N G Chun - w u 1 , L I Yan 2 , M EN G Xiang - ying3 , Y IN Dong - mei 4(1. College of In formation and Technology ,Jilin Normal Universit y ,Siping 136000 ,China ;2.№1 Middle School of Linyi ,Linyi 251500 ,China3. Siping Decaux Ltd. ,Siping 136000 ,China ;4. College of Physics ,Nort heast Normal Universit y ,Changchun 130024 ,China)Abstract :MCS - 51 system is mostly controlled with keys. It must be considered for designers which are eliminating the dithering of keys and operating respond of keys in non - coding keyboard. In this thesis ,the dithering problem of keys was solved by software and discussed how to come true once key operation of respond. In addition ,some applied procedures were provided with C51 language in the paper.Key words :MCU ;key ;respond ;dit hering感谢您试用AnyBizSoft PDF to Word。
.51系列单片机原理与应用实验华南师范大学物理与工程工程学院微机教研室20010年9月目录实验须知 (2)实验一数字量输入输出实验 (4)实验二交通灯控制实验 (6)实验三定时与中断实验 (8)实验四串行通信实验 (11)实验五串行A/D转换实验 (13)实验六现实人体视觉暂留特性测试实验 (14)实验七实时时钟制作实验 (17)实验八简易电子琴制作实验 (18)实验九 EEPROM应用—数字密码锁 (20)实验十综合实验:教学板自检程序设计 (25)实验十一数据采集—火灾报警装置的软硬件设计 (26)附录一实验教学板 (27)附录二实验用软件使用说明 (28)实验须知一、预习要求1.实验前认真阅读实验指导书的相关内容,明确实验目的和实验任务。
2.实验前应做好预习报告,在报告中,要求画出所设计的实验电路原理图、程序流程图,编写好程序,并对程序加以注释,还要拟订好实验步骤。
二、实验要求1.按实验中心安排的时间到指定实验室上实验课,不要迟到、缺席。
有特殊原因不能在原安排时间来实验时,须提前一天通知实验中心负责教师。
2.认真完成每次实验的各项任务,实验结果要请指导教师检查。
教师对实验内容提问,并对完成者进行记录。
3.爱护设备,保持清洁,不得在实验室内大声喧哗,不要将食物带入实验室,不擅自更换设备。
4.在实验箱(板)通电状态下,不要用手随意触摸电路板上除按键和开关以外的芯片等其它元器件。
,严禁带电操作,即所有接线、改线和拆线操作均应在不带电的状态下进行。
5.实验中若发生异常情况应立即切断电源,并向指导教师报告,检查原因,避免再次发生类似情况。
6.实验完毕,请整理好实验设备后再离开实验室。
三、实验报告要求实验报告必须使用实验报告专用纸,书写要工整、清楚,并在下一次实验时交给指导教师。
实验报告应包括以下内容:1.实验名称、实验人姓名、学号、班级、同组人姓名。
2.实验目的、任务(内容)。
3.各任务程序流程图、自编程序清单,对程序须给出适量注释(例如:变量和某些寄存器的作用,关键程序段的功能等)。
51单片机按键消抖程序原理一、引言按键消抖是嵌入式系统编程中常见的问题之一,尤其是在使用51单片机时。
51单片机是一款常用的微控制器,广泛应用于各种嵌入式系统中。
按键作为常见的输入设备,在51单片机应用中经常被使用。
由于按键的机械特性,当按键按下或释放时,会产生机械抖动,给系统带来误操作。
因此,了解并编写按键消抖程序对于保证系统的正常运行至关重要。
二、消抖原理按键消抖,简单来说,就是通过一定的算法,消除按键产生的机械抖动,从而准确识别按键的状态。
其原理主要基于以下两点:1.机械抖动的特点:按键的机械抖动主要表现为按键触点之间的快速开关,产生一系列微小的电信号。
这些信号通常包含真实的按键输入信号和噪声信号。
2.消抖算法:通过分析这些信号,识别出真实的按键输入信号,并忽略噪声信号,从而达到消除机械抖动的目的。
常用的消抖算法有阈值比较法、防抖延时法、防抖滤波法等。
三、消抖程序实现下面以51单片机为例,介绍一种简单的阈值比较法消抖程序实现:```cvoidkey_debounce(intkey_pin){//定义按键引脚intdebounce_time=50;//消抖时间,单位毫秒intthreshold=5;//阈值,可以根据实际情况调整intkey_state=0;//按键状态,初始化为0(未按下)intlast_key_state=0;//上一次的按键状态while(1){//读取按键状态key_state=digitalRead(key_pin);last_key_state=key_state;//判断按键是否按下if(key_state==LOW){//按键按下,开始消抖if(millis()-last_key_state>=debounce_time){//经过一定时间,确定按键状态if(key_state==digitalRead(key_pin)){//检测到真实的按键输入信号//这里可以进行相应的操作,例如点亮LED灯等}else{//检测到噪声信号或其他干扰,忽略}}else{//消抖时间不足,忽略当前状态}}else{//按键释放,忽略当前状态}}}```上述程序中,通过设置一个阈值和消抖时间,来判断按键状态是否发生变化。
单片机按键去抖动程序设计思路1.硬件电路设计为了能够较好地去抖动按键,我们可以在按键的输入引脚上加一个RC组合电路,以延迟触发信号的上升沿和下降沿,从而消除抖动。
RC组合电路一般由一个电阻R和一个电容C组成,其原理是通过RC的时间常数来控制信号的上升和下降过程。
2.软件设计在单片机程序中,我们需要采取一定的算法来检测按键的真实触发信号,下面是一个简单的按键去抖动的程序设计思路:(1)初始化首先,我们需要对按键的输入引脚进行初始化,配置为输入模式,并设置为上拉电阻模式。
这样可以确保在按键未按下时,输入引脚保持高电平。
(2)读取按键状态通过读取按键的输入引脚状态,来判断当前按键是否处于按下状态。
一般来说,输入引脚为高电平时表示按键未按下,为低电平时表示按键已按下。
(3)去抖动算法当检测到按键状态发生变化时,即从未按下到按下或从按下到未按下,可以认为触发了一次按键操作。
在这个过程中,我们需要使用去抖动算法来过滤掉抖动信号。
常见的去抖动算法有两种:软件延时法和状态延时法。
软件延时法是通过在检测到按键状态发生变化后,延时一段时间,再次读取按键状态来判断是否真正触发了按键操作。
通过调整延时时间,可以达到去抖动的效果。
但是使用软件延时法会占用较多CPU时间,因此在需要很高响应速度的系统中不适用。
状态延时法是通过引入一个状态变量,用来保存按键的状态。
在检测到按键状态发生变化后,将状态置为相反的值,并延时一段时间。
在延时结束后,读取按键状态和状态变量的值,如果相等则认为触发了按键操作,否则不触发。
需要注意的是,为了防止按键的持续震动导致多次触发,我们一般会设置一个最小的按键触发间隔。
即在两次按键操作之间需要间隔一段时间,才能再次触发。
(4)执行按键操作当确认触发了按键操作后,我们可以执行相应的操作,如触发一个中断、改变LED灯的状态等。
通过上述程序设计思路,可以实现按键去抖动的功能,从而得到准确的按键触发信号。
当然,具体的实现还需要根据具体的单片机平台和开发环境来进行调整。
单片机消除按键抖动的方法
单片机中,当按键被按下时,可能会出现按键抖动的现象,即按下按键后,按键会不断地重复触发,导致程序的不稳定性等问题。
为了消除按键抖动,可以采取以下方法:
1. 软件消抖法:在程序中通过延时、多次采样等方法,对按键
进行去抖处理。
但这种方法需要占用一定的CPU资源,容易影响程序的稳定性和响应速度。
2. 硬件消抖法:通过外部电路对按键进行去抖处理,如添加 RC 滤波器、加电容等组合电路,可稳定按键的电平信号,避免按键的震动和干扰。
3. 系统延时法:在按键按下后,延时一段时间再读取按键的状态,可消除按键的抖动。
但这种方法需要根据实际情况设置合适的延时时间,否则会影响系统的响应速度。
4. 确认法:在按键按下后,通过程序对按键的状态进行多次确认,只有当确认多次读取的状态一致时,才认为按键的状态是有效的。
这种方法需要设置合适的确认次数和时间,才能达到较好的去抖效果。
总之,消除按键抖动是单片机程序开发中的一个重要问题,需要根据实际情况选择合适的去抖方案,保证程序的稳定性和可靠性。
- 1 -。
基于51单片机的电子琴设计课程设计单片机原理》课程设计前言本课程设计旨在通过基于51单片机的电子琴设计,加深学生对单片机原理的理解和应用。
在本设计中,我们将介绍电子琴的设计要求、所用设备及软件以及总体设计方案。
随后,我们将详细介绍系统硬件设计中琴键控制电路、音频功放电路、时钟-复位电路和LED显示电路的设计。
第1章基于51单片机的电子琴设计1.1 电子琴的设计要求在电子琴的设计中,我们需要考虑琴键数量、音频输出质量、电源电压和外部接口等因素。
在本设计中,我们将采用25个琴键,保证音频输出质量和电源电压稳定,并提供外部接口以便于扩展和调试。
1.2 电子琴设计所用设备及软件在本设计中,我们将使用51单片机、琴键、音频功放、时钟、LED显示器等设备,并使用Keil C51编译器进行软件开发。
1.3 总体设计方案在总体设计方案中,我们将采用按键扫描方式实现琴键控制,使用PWM技术实现音频输出,使用外部晶振提供时钟信号,并使用LED显示器显示琴键状态。
第2章系统硬件设计2.1 琴键控制电路在琴键控制电路中,我们将采用矩阵按键扫描方式,通过51单片机的IO口进行扫描和检测。
同时,我们还将使用电容式触摸开关来实现琴键的触发。
2.2 音频功放电路在音频功放电路中,我们将采用TDA7297芯片作为功放,通过PWM技术实现音频输出,并通过滤波电路滤除杂音和谐波。
2.3 时钟-复位电路在时钟-复位电路中,我们将采用12MHz晶振作为时钟源,并使用复位电路确保系统在上电时能够正确运行。
2.4 LED显示电路在LED显示电路中,我们将采用MAX7219芯片实现LED点阵显示,并通过SPI接口与51单片机进行通信。
同时,我们还将使用CD4511芯片实现数码管显示琴键状态。
通过本课程设计,我们可以深入理解单片机原理的应用,掌握电子琴的设计和制作技术,提高自身的实践能力和创新能力。
2.5 整体电路本章将介绍电子琴的整体电路设计。
单片机按键防抖策略及实用代码笔者从事单片机类工作多年,碰到过很多问题,也成功解决过很多问题。
闲来无事想分享一些经验、心得,今天就聊一下按键防抖的问题,希望能够帮助到大家。
按键分好多种,就拿微动(非自锁) 开关举例吧,如下图1为实物,图2为原理。
大家注意,按键S1两端并没有并联104或103消抖电容,其实是出于成图1图2本考虑,因为有的行业每天生产电路板达100000个,如果每个电容按0.03元计算,那么每天因为一个电容产生的成本为3000元,那一年多出的成本呢?所以就需要软件消抖了,软件的价值就体现出来了。
为了找到按键抖动的一般规律,笔者接上示波器测量开关S1两端的波形,通过数百次按动按键,挑选了3组非常有代表性的波形,理想波形如下图3:图3可惜的是理想波形出现的概率比较低,实际的波形基本都存在不同程度的抖动,如下图4和图5:图4图5其实抖动的原因多半是按动时触点接触不实,触点有油污,氧化等等。
抖动电平的特点是持续时间较短,时间上靠近触点接触的时刻。
此按键的抖动时间不超过5ms,其他按键的抖动时间可能会更长,实际以示波器测量为准。
有了以上测量和分析,就要考虑如何过滤抖动,避免按键功能异常。
笔者整理了两个思路,使用场景有些区别,需要根据实际情况灵活选择。
第一个思路:判断按键连续低电平的时间是否超过(15ms~30ms),适合非自锁按键短按或长按,代码段示例如下:void ReadKey(void) //微动(非自锁) 开关检测,假设函数1ms运行一次{static unsigned short int key_counter=0; //统计按键按下且持续低电平的时间if(IO == 1) //IO口识别到高电平(可能是按键松开或按下时出现了高电平抖动) {key_counter=0; //持续低电平时间计数器清0,重新等待低电平}else //IO口识别到低电平{if(key_counter < 3000) //计数器限制最大值,防止溢出key_counter++; //持续低电平时间计数器累加if(key_counter == 20) //持续低电平时间达到20ms(按键短按){短按用户代码}else if(key_counter == 3000) //持续低电平时间达到3000ms(按键长按){长按用户代码}}}第二个思路:延时一段固定的时间,再判断哪个电平的持续时间长,适合自锁开关或拨动开关,代码段示例如下:unsigned char ReadKey(void)//拨动(或自锁) 开关检测,假设函数1ms运行一次{static unsigned short int high_level_counter=0; //一段时间内高电平的时间static unsigned short int low_level_counter=0; //一段时间内低电平的时间static unsigned short int judge_counter=0; //时间长度计数器static unsigned char level_value=1; //开关的返回值judge_counter++; //时间长度累计if(IO == 1) //IO口识别到高电平{if(high_level_counter < 25)high_level_counter++; //高电平时间计数累加}else //IO口识别到低电平{if(low_level_counter < 25)low_level_counter++; //低电平时间计数累加}if(judge_counter > 25) //固定延时时间(15~30ms)到,判定有效电平状态{judge_counter =0;if(high_level_counter > low_level_counter) //高电平时间>低电平时间{if(high_level_counter > 20) //高电平总时间超过固定时间的一半{level_value = 1; //此时判定IO口为高电平可以在此添加用户高电平功能代码}}else if(low_level_counter > high_level_counter) //低电平时间>高电平时间{if(low_level_counter > 20) //低电平总时间超过固定时间的一半{level_value = 0; //此时判定IO口为低电平可以在此添加用户低电平功能代码}}high_level_counter = 0;low_level_counter = 0;}return level_value; //返回开关的值}以上是笔者实际使用的两段防抖代码,测试效果很好。
单片机按键去抖动程序设计思路
1.去抖动原理:按键在按下和松开的瞬间会产生震动,导致按键信号在短时间内出现多次转换,给程序带来困扰。
为了解决这个问题,需要对按键信号进行去抖动处理,即在按键按下和松开时,只记录一次按键状态变化。
2.软件去抖动方法:软件去抖动方法主要通过软件延时来判断按键信号是否稳定。
具体来说,可以通过以下步骤实现软件去抖动:-初始化按键引脚为输入模式,并使能内部上拉电阻;
-设定一个延时时间阈值t,用于判断按键是否稳定;
-读取按键引脚的电平,如果为低电平,说明按键按下;
-进入一个循环,每次循环读取一次按键引脚的电平,并与前一次读取的电平进行比较;
-如果连续读取到的电平与前一次相同,说明按键信号稳定;
-如果连续读取到的电平与前一次不同,则说明按键信号还在抖动,继续读取直到连续读取到的电平与前一次相同;
-当稳定的电平持续时间超过延时时间阈值t时,认为按键信号已稳定,可以进行相应的处理。
3. 硬件去抖动方法:硬件去抖动方法主要通过电路设计来实现。
常见的硬件去抖动电路包括RC滤波电路和Schmitt触发器电路。
其中,RC 滤波电路利用电容和电阻的特性,对按键信号进行平滑处理;Schmitt触发器电路则通过正反馈的方式,将不稳定的信号转换为稳定的信号。
这两种方法可以根据实际需求选择。
总结:
按键去抖动程序设计可以通过软件去抖动和硬件去抖动两种方式实现。
软件去抖动主要通过软件延时判断按键信号是否稳定,而硬件去抖动则通
过电路设计实现。
根据具体的应用场景和需求,可以选择适合的方法来设
计按键去抖动程序。