单片机入门学习记录(二)

在机械按键的触点闭合和断开时,都会产生抖动,为了保证系统能正确识别按键的开关,就必须对按键的抖动进行处理。按键的抖动对于人类来说是感觉不到的,但对单片机来说,则是完全可以感应到的,而且还是一个很“漫长”的过程,因为单片机处理的速度在“微秒”级,而按键抖动的时间至少在“毫秒”级。单片机如果在触点抖动期间检测按键的通断状态,则可能导致判断出错,即按键一次按下或释放被错误地认为是多次操作,从而引起误处理。因此,为了确保单片机对一次按键动作只作一次响应,就必须考虑如何消除按键抖动的影响。———————————————————————————(来自百度百科)

为了实现按键消抖通常有软件消抖和硬件消抖的方法。

软件消抖有采用delay()的延迟消抖,虽然代码简单,但是在函数执行时CPU无法执行其他指令,直到函数执行完毕,影响程序运行。

定时器消抖则是采用定时器中断的方法,把按键扫描程序放置在定时器中断中,可以使得扫描程序减少对于cpu的占用,但是会占用一个定时器,虽然不及硬件消抖但是对于软件消抖来说已是很高效的方法。因此采用的此方法。


通过定时器中断以5ms的速度扫描一次当前的按键值,中断程序时间设置如下,

void int_time0() interrupt 1
{TH0=(65536-5000)/256;TL0=(65536-5000)%256;i++;if(i>3)i=0;key();
}

key_flag 为按键是否按下的标志位,其初始化为0。当key按下为0,high开始加一,只有按键值被定时器扫描到2次即持续为10ms以上时,判定key0按键确实按下了,key_flag置为1。开始松手检测,检测key0为1的时间达到10ms以上时,判定key0按键是完全松开,到此为一次完整的按键动作。所以P2的状态值改变。(下面程序为单按钮示例,多个按钮可以通过放置多个标志位来实现相同效果)

void key()
{if(key0==0&&key_flag==0)    //按键按下{high++;if(high>1)        //按下消抖{high=0;key_flag=1;}}else if(key0==1&&key_flag==1)    //松手检测{low++;if(low>1)        //松手消抖{P2=~P2;        //状态反转key_flag=0;}}
}

多按钮示例如下

    if(key0==0&&key_flag1==0)    //按键按下{high1++;if(high1>1)        //按下消抖{high1=0;key_flag1=1;}}else if(key0==1&&key_flag1==1)    //松手检测{low1++;if(low1>1)        //松手消抖{key_state1=~key_state1;key_flag1=0;}}if(key1==0&&key_flag2==0)        //按键按下{high2++;if(high2>1)        //按下消抖{high2=0;key_flag2=1;}}else if(key1==1&&key_flag2==1)        //松手检测{low2++;if(low2>1)        //松手消抖{key_state2=~key_state2;key_flag2=0;}}

51单片机定时器中断按键消抖(无延时)相关推荐

  1. 【51MCU】51单片机定时器中断写MIDI音乐(按键可切换音乐)

    Author: Manba Cople 专业:IOT 说明:记录和输出学习内容 文章目录 前言 定时器 音乐播放 音乐库 总结和展望 前言 程序思路:该程序是利用51单片机的定时器中断,另外根据音符的 ...

  2. c语言单片机定时器的应用程序,51单片机定时器中断程序(C语言)

    51c程序 51单片机定时器中断程序(C语言) 用C语言实现的,先要定义好定时器的初值 不管你使用多大的晶振,使用51单片机,一般都是12分频出来,也就可以得出一个机器周期 机器周期=12/n(n指晶 ...

  3. 单片机学习笔记 —— 按键消抖

      按键是我们学习单片机时一个重要的器件,我们在按下按键时,难免会一位手抖动或者接触不稳定,但如果不消抖,按键按下的瞬间将会产生成百上千次按键有效的结果,最终的现象不可预料,所以有必要进行消抖. 一. ...

  4. 51单片机定时器扫描按键

    定时器扫描按键 定时器每隔20毫秒扫描一次按键 问题:在之前写的按键检测函数中,要在按键按下后用Delay函数进行软件消抖,还要用while(P3_1==0)来判断是否松手,如果长期不松手,则CPU会 ...

  5. 【IMX6ULL驱动开发学习】17.内核定时器(按键消抖)

    1. 内核定时器初始化 setup_timer(struct timer_list *timer, void (*function)(unsigned long), unsigned long dat ...

  6. 单片机定时报警C语言程序,51单片机 定时器 中断程序 (C语言)

    EA     是 中断总开关, 不管是定时器,串口还是外部中断,都需要打开 EA 才能触发中断; ET0   是 定时器0 的专用中断开关, 也就是说: 打开了EA.而不打开ET0,定时器0是无法触发 ...

  7. 51单片机-定时器中断

    目录 1.定时器/计数器 1.1.工作原理 1.2.相关寄存器 1.3.工作模式(模式1) 2.中断系统 2.1.中断的概念 2.2.中断结构 2.3.中断源 2.4.相关寄存器 3.如何配置定时器中 ...

  8. 51单片机定时器中断怎么用-------51单片机基础篇

    首先,什么时定时器,简单来说可以比喻为一个闹钟,当你把他打开以后,他就会每秒动一下,+1,+1,+1,+1,如果你设置了某一个时间点闹钟会向以后,那么当闹钟的时间点+1,+1,+1,+到了你设置的时间 ...

  9. 51单片机——定时器中断

    新版51单片机内部有3个16位可编程的定时器/计数器,即定时器T0,T1,T2.他们既有定时功能又有计数功能,我们可以通过配置与它们相关的特殊功能寄存器可以选择启用定时功能或计数功能:其中需要注意的是 ...

最新文章

  1. javascript中 this 指向问题
  2. Codeforces 1480A. Yet Another String Game (阅读理解题)
  3. 使用ueditor实现多图片上传案例——实体类(Shopping.java)
  4. Hibernate学习笔记_核心幵发接口及三种对象状态
  5. 阿里云镜像加速Docker
  6. c语言程序设计题库 微盘下载,《C语言程序设计》题库及答案.pdf
  7. 安徽计算机技术学院蚌埠,安徽蚌埠技师学院2021年招生简章
  8. 【备忘】mysql优化工具
  9. 学习用PySide写界面
  10. Node-跟着李南江学编程
  11. 显微镜下的大明内容_《显微镜下的大明》读后感1000字
  12. SPI专题(二)——STM32驱动FLASH(W25Q64)
  13. TensorFlow RunTime(TFRT) 小试
  14. classpath、path、JAVA_HOME的作用及JAVA环境变量配置 (转)
  15. 未来的电子计算机作文300字,未来的校园科幻作文300字(精选3篇)
  16. 经典问题 小白鼠试毒药 这个算法你绝对不知道
  17. uni-app 微信小程序分享功能河北银丹互联网科技有限公司
  18. SQL中NVL()用法
  19. phpstudy本地配置教程You don't have permission to access解决
  20. 电脑手柄,Windows7电脑游戏手柄怎么设置?

热门文章

  1. fc安卓模拟器_Win10可以原生使用安卓APP了,模拟器的地位没了!
  2. 支付宝 当面付(扫描支付) 对接逻辑
  3. ExtJs自学教程(2):从DOM看EXTJS
  4. TYPORA的使用手册
  5. babel安装后无法使用:babel : 无法加载文件 C:\Users\DZG\AppData\Roaming\npm\babel.ps1
  6. getElementsByTagName的用法
  7. 第三方登录-[微博、微信、qq] java实现
  8. 聊天室php数据库,聊天室phpmysql(五)
  9. 去VB程序NAG窗口方法-4C法
  10. 4路红外循迹模块使用教程