单片机按键去抖程序
单片机的按键消抖与几种按键电路

用其他的各类触发器,锁存器亦可达到消抖效果。 二、 软件消抖 : 通过软件延时 10ms 达到消除抖动的效果,不加文字赘述。 三、 按键电路 : 独立按键
矩阵按键 译码按键 AD 模拟按键 锁定按键
单片机的按键消抖与几种按键电路
一、 硬件消抖 : 按键防抖电路控制电路 所示利用 RC 积分电路来达成杂波的滤除与波形修整的电路(如图 1 )。 在 S1 ON 的瞬间由于接触弹跳的关系,会使 A 点电压呈现高速的断 续现象,再 S1 OFF 时亦然,详(如图 2 所示),然而由于电容两端电压需由 电压经电阻慢慢充电才会上升,使得 B 点电位缓步上升情形:S1 OFF 时亦 然,电容电压经 R 放电,使 B 点电压缓缓下降。此一变化,经史密特反相 修整后,可得一标准负脉波输出,如波
单片机51 去抖按键程序

#define START_TIMER1 TR1=1
#define STOP_TIMER10 TR1=0
#define KD_VAL 15
sbit Ktemph=P1^0;
sbit Ktempl=P1^1;
sbit Ktime=P1^2;
sbit Kset=P1^3;
unsigned char Irbufnum;
unsigned char Irbuf[6];
unsigned char Recposi;
unsigned int idata Irbuffer[50];
unsigned char Kscanbuf[8];
unsigned char Kscan[8];
unsigned char Kcount[8];
RCAP2L = 0XB8 ;
TR2=1;
EX0=1;/*ÔÊÐíÍⲿ0ÖжÏ*/
EA = 1;/*¿ªÈ«¾ÖÖжÏ*/
TR0=0;
TMOD|=1<<4;/*¼ÆÊ±Æ÷1×÷Ϊ16λ*/
ET1=1;
TH1=0xf8;
TL1=0xcc;
TR1=1;
PX0=1;/*ÍⲿÖжÏ0ÓÅÏÈ*/
IT0=1;/*ϽµÑØ´¥·¢ÖжÏ*/
/*ET0=1;*/
/*ES = 1;*//*ÔÊÐí´®ÐпÚÖжÏ*/
TCLK = 1 ; /*¶¨Ê±Æ÷2ÓÃ×÷²¨ÌØÂÊ·¢ÉúÆ÷*/
RCLK = 1 ;
/*¾§Õñ 22.1184 £¬ 6T £¬²¨ÌØÂÊ9600*/
RCAP2H = 0xff ;
按键开关消抖程序

按键开关消抖程序实践中,单片机端口在连接开关器件时都要考虑消抖的问题,或在硬件上增加延迟,或是增加软件延迟查询的功能模块。
这里,我们考虑这样一个检测电路:单片机连接一个开关和两个LED。
程序是这样的,如果开关的消抖正确,就点亮LED1,否则就闪亮LED2。
按下开关,点亮LED1,释放开关,LED1即熄灭。
我们加入20 毫秒的消抖延迟时间。
当检测到开关为低电平时,单片机在延迟20 毫秒后再次检测开关的状态。
如果此时开关状态为高,则LED2就闪亮,如为低则点亮LED1。
源代码:led1bitP2.0led2bitP2.1switch1bitP1.0ORG 0000hsetb switch1//initialize switch 1 as inputsetb led1//Turn OFF LED1setb led2//Turn OFF LED2wait:jb switch1,wait// Wait till switch1 has been pressedcall debounce_delayjb switch1,c1_wait//switch low even after debouncing period//switch has been succesfully debouncedclr led1//Turn ON LED1jnb switch1,$//wait till switch has been releasedsetb led1//Turn OFF LED1ajmp waitc1_wait://Switch PIN high after debounce period so error in debouncingcpl led2ajmp waitdebounce_delay://Subroutine for generating 20ms delaymov r7,#245l1_debounce_delay:mov r6,#40djnz r6,$djnz r7,l1_debounce_delayretENDtips:感谢大家的阅读,本文由我司收集整编。
单片机按键电容消抖电路

单片机按键电容消抖电路1.引言1.1 概述概述部分的内容:在许多电子设备中,按键电路常常被使用来实现用户与设备之间的交互。
然而,由于按键的物理特性,如机械弹性和触点接触的不稳定性,会导致按键的震荡现象,即按键在按下或释放时会产生多次跳变。
这种跳变会导致单片机误读按键的信号,可能引发系统错误操作或不稳定的现象。
因此,为了保证按键信号的可靠性和稳定性,需要对按键进行消抖处理。
本篇文章将详细介绍单片机按键电容消抖电路的设计和实现原理。
通过在按键电路中引入电容元件,可以达到消抖的效果。
电容元件具有快速充放电的特性,可以有效地过滤掉按键震荡带来的干扰信号,确保单片机正确读取按键状态。
文章将首先介绍单片机按键的工作原理,包括按键的接口电路和输入电平变化的检测方式。
接着,将深入探讨按键消抖的必要性,分析不进行消抖处理所带来的潜在问题。
在这之后,将详细介绍按键电容消抖电路的设计原理,包括电容的连接方式和参数的选择。
最后,将给出经过实际测试的电路实现结果和相关性能指标的评估。
通过本文的阅读,读者将能够了解单片机按键的基本原理和消抖处理的必要性,掌握按键电容消抖电路的设计和实现方法,以及了解该电路的性能表现。
这对于开发单片机应用的工程师和爱好者来说,具有一定的指导意义和实践价值。
文章结构部分的内容是对整篇文章的组织和布局进行描述。
它向读者展示了文章的章节和主题,并指导读者理解和阅读文章的内容。
在本文中,文章结构如下:1. 引言1.1 概述1.2 文章结构1.3 目的2. 正文2.1 单片机按键原理2.2 按键消抖的必要性3. 结论3.1 按键电容消抖电路的设计原理3.2 电路实现与测试结果文章的结构分为引言、正文和结论三个主要部分。
在引言部分,概述简要介绍了单片机按键电容消抖电路的背景和重要性;文章结构部分指出了本文的章节组成和布局,为读者提供了阅读指南;目的阐明了文章的目标和意图。
正文部分主要包括单片机按键原理和按键消抖的必要性。
一种软件去除键抖动的方法

一种软件去除键抖动的方法摘要:单片机控制系统中大多使用控制键来实现控制功能。
消除按键瞬间的抖动是设计者必须要考虑的问题。
本文介绍一种很实用的软件去抖动方法,它借助于单片机内的定时中断资源,只要运算一下逻辑表达就完成了去抖动。
这个方法效率高,不耗机时且易实现。
文中使用的逻辑表达式由简单卡诺图和真值表推出,使该方法的机理容易理解。
文中还提供用C51单片机编程语言编写的实用例程。
关键词:单片机键处理控制系统去抖动键盘概述在单片机控制系统中,通过按键实现控制功能是很常见的。
对按键处理的重要环节是去抖动,包括去除按下和抬起瞬间的抖动。
去抖动的方法有很多种,如使用R-S触发器的硬件方法、运用不同算法的各种软件方法等。
硬件方法会增加成本和体积,对于按键较多的矩阵式键盘,会用硬件方法;软件方法用的比较普遍,但有一种加固定延时的去抖动法效率最低,它以无谓地耗费机时来实现去抖动。
此处介绍的是一种软件方法。
简单说来是一种运算法,配合定时中断读取按键,通过运算逻辑表达式:Keradyn=Ktemp Kinput+Kreadyn-1 (Ktemp ⊙Kinput) (1)Ktemp=Kinput (2)可以获得消除抖动的按键消息。
这种方法效率高,不需耗时的循环等待,而且算法简单、使用方便。
一、基本原理由于按键的按下与抬起都会有10~20ms的抖动毛刺存在,因此,为了获取稳定的按键信息,须要避开这段抖动期。
设置3个变量Kready、Ktemp和Kinput,并设置定时中断周期为20ms。
在定时中断服务程序中读取按键,并把读取的数据存于变量Kinput中。
变量Kready中是所需要的稳定的按键信息;Ktemp是中间变量,它的值是上一次的Kinput。
根据当前按键的状态,考虑到Kready中是20ms抖动后的有效键信息,则Kready、K temp和Kinput之间,在不同时刻的状态关系如表1所列。
表1时刻1为没有键按下的初始状态;时刻2的Kinput为1,但时刻3的Kinput又变为0,说明时刻2的Kinput为1并不是有键按下,可能只是干扰,所以Kreqdy为0;时刻4同时刻2的情况类似,但是时刻4和时刻5时Kinput都为1,说明有按键按下,在时刻5时Kr eady为1;虽然时刻7时Kinput为0,但时刻5、6、8时Kinput都为1,说明按键一直按下,只不过有干扰,Kready保持为1;时刻9、10连续两个时刻Kinput为0,表示按键抬起,时刻10时Kready为0。
单片机按键去抖

单片机按键去抖
我们首先要清楚为什么要按键去抖。
先看先按键按下的波形图
通过这个图形就很清楚为什么要按键去抖了,要是不去抖的话,当按下按键的时候就会在0~5ms 内出现抖动,相当于在不停地按下按键而就不是只按了一次了。
稳定闭合时间大约是10ms,松手抖动的时间和按下抖动的时间差不多。
去抖的方法有硬件去抖和软件去抖
我们常用牺牲CPU 的时间来软件去抖,就是按下按键后延时5~10ms 时间后再来检查是否有按键按下,松手检测也一样。
硬件去抖的方法如图所示
独立按键的去抖方法很简单,就是在按下和松手后分别加一小段延时再来判断。
例:
sbit key=P1;
........................
.......................
if(!key) //如果有按键按下
{
delay(10); //延时一小段时间
if(!key) //真有按键按下
{。
// 执行按键按下后的操作
}
while(!key); // 松手检测,要是没有松手的话就一直执行while 循环。
单片机 电子钟(显示 键盘 去抖)程序

键盘(KEY)MOV 21H,#0MAIN: LCALL KEYQU ;键盘去抖LCALL KEYRD ;读键值SJMP MAINKEYQU: MOV KEYP,#0FFHANL KEYP,#11110000B ;检测四行键NOPMOV A,KEYPCPL AANL A,#0F0HJZ KEYR1JB KT,KEYQUEJNB KD,KEYR2SETB KTSETB KCLJMP KEYQUEKEYR2: SETB KDLJMP KEYQUEKEYR1: CLR KDCLR KTKEYQUE: RETKEYRD: JNB KC,KEYRD1CLR KCMOV KEYP,#0FFHANL KEYP,#11111110B ;检测第一行键NOPMOV A,KEYPJNB ACC.7,KEYR14JNB ACC.6,KEYR13JNB ACC.5,KEYR12JNB ACC.4,KEYR11LJMP KEYRD2KEYRD1: LJMP KEYRDEKEYR11: MOV KEYZ,#1LJMP KEYRDEKEYR12: MOV KEYZ,#2LJMP KEYRDEKEYR13: MOV KEYZ,#3LJMP KEYRDEKEYR14: MOV KEYZ,#4LJMP KEYRDEKEYRD2: MOV KEYP,#0FFHANL KEYP,#11111101B ;检测第二行键NOPMOV A,KEYPJNB ACC.7,KEYR24JNB ACC.6,KEYR23JNB ACC.5,KEYR22JNB ACC.4,KEYR21LJMP KEYRD3KEYR21: MOV KEYZ,#5LJMP KEYRDEKEYR22: MOV KEYZ,#6LJMP KEYRDEKEYR23: MOV KEYZ,#7LJMP KEYRDEKEYR24: MOV KEYZ,#8LJMP KEYRDEKEYRD3: MOV KEYP,#0FFHANL KEYP,#11111011B ;检测第三行键NOPMOV A,KEYPJNB ACC.7,KEYR34JNB ACC.6,KEYR33JNB ACC.5,KEYR32JNB ACC.4,KEYR31LJMP KEYRD4KEYR31: MOV KEYZ,#9LJMP KEYRDEKEYR32: MOV KEYZ,#10LJMP KEYRDEKEYR33: MOV KEYZ,#11LJMP KEYRDEKEYR34: MOV KEYZ,#12LJMP KEYRDEKEYRD4: MOV KEYP,#0FFHANL KEYP,#11110111B ;检测第四行键NOPMOV A,KEYPJNB ACC.7,KEYR44JNB ACC.6,KEYR43JNB ACC.5,KEYR42JNB ACC.4,KEYR41LJMP KEYRD2KEYR41: MOV KEYZ,#13LJMP KEYRDEKEYR42: MOV KEYZ,#14LJMP KEYRDEKEYR43: MOV KEYZ,#15LJMP KEYRDEKEYR44: MOV KEYZ,#16LJMP KEYRDEKEYRDE: RETKC BIT 21H.0 ;处理键KD BIT 21H.1 ;去抖KT BIT 21H.2 ;抬键BIAOZ DATA 20H ;标志:.0定时到。
单片机实验3LDE数码管动态显示与按键去抖程序

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。