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

2023-05-16

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

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

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

软件消抖有采用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;
        }
    }
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

51单片机定时器中断按键消抖(无延时) 的相关文章

  • 自动化运维一体化

    运维一体化中的平台一体化 xff0c 指的是运维一体化与平台一体化 xff0c 其中运维一体化是数据中心在运维方面的运营体系 xff0c 它包括三方面 xff1a 人员组织一体化 流程一体化 平台一体化 一 转型 xff1a 和目前大部从运
  • 技术文档写作

    科技文排版技巧 目录 一 段落格式的设定 2 二 设置标题 3 三 利用 导航 选项 xff0c 对论文进行快速定位 xff08 建立在3的基础上 xff09 4 四 插入 分页符 和 分节符 5 五 页码的设置 6 六自动目录生成 xff
  • 资料目录三

    需要更多资料请添加微信 xff1a Stestack 毕设项目 美食美刻网站制作 视频http yun itheima com course 253 html 资料链接 xff1a http pan baidu com s 1dFkYBXv
  • VMware虚拟机ubuntu显示屏幕太小解决办法

    1 安装VMware Tool需要用到虚拟光驱 xff0c 加载一个ISO文件 2 从 media 中复制到 opt下 3 击ubuntu左侧列表里的DVD图标 xff0c 就会出现VMware Tools的安装文件VMwareTools
  • 面向edas开发的规范

    前言 概述 本文档 主要介绍了 服务开发者基于Aliware做项目开发时 xff0c 从项目环境搭建 xff0c 项目开发 xff0c 项目上线及Aliware 服务功能相关的使用 说明 xff0c 操作步骤及代码示例 应用范围 服务开发者
  • 用 Python 进行金融数据可视化

    用 Python 进行金融数据可视化 Python量化的关键是金融数据可视化 xff0c 无论是传统的K线图 xff0c 还是现在的策略分析 xff0c 都需要大量的可视化图表 具体到编程代码 xff0c 就是使用Python绘图模块库绘图
  • Ubuntu双屏的副屏抖动闪烁

    将设置按如下即可 xff1a
  • 日志切割的方法

    一 关于日志切割 日志文件包含了关于系统中发生的事件的有用信息 xff0c 在排障过程中或者系统性能分析时经常被用到 对于忙碌的服务器 xff0c 日志文件大小会增长极快 xff0c 服务器会很快消耗磁盘空间 xff0c 这成了个问题 除此
  • 软件测试的四个阶段

    软件测试的对象包括软件需求 概要设计 详细设计 软件运行环境 可运行程序和软件源代码等 软件测试包括质量 人员 资源 技术和流程五大要素 xff0c 以及测试覆盖率和测试效率两个目标 软件测试一般分为4个阶段 xff1a 单元测试 集成测试
  • Rabbitmq实现多系统间的分布式事务,保证数据一致性

    Rabbitmq实现多系统间的分布式事务 xff0c 保证数据一致性 一 实验环境二 实验目的三 实验方案四 实验步骤1 消息队列1 1 rabbitmq安装过程略过 1 2 创建订单交换器 xff1a orderExchange1 3 创
  • Android -Lottie加载动画喂饭指南

    什么是Lottie 简单的说 xff0c Lottie就是airbnb开源的一个使用json文件快速加载动画且支持多平台的库 更多介绍请查看官网 官网地址 xff1a https airbnb design lottie 怎么使用Lotti
  • Ubuntu安装汉化版Portainer(Docker图形UI界面)

    1 找镜像 docker search dockerui NAME DESCRIPTION STARS OFFICIAL AUTOMATED abh1nav dockerui An updated version of crosbymich
  • 解决Deepin、统信UOS开机出现引导错误

    开机后GRUB提示错误 错误提示 xff1a error unknown filesystem 原因分析 xff1a 对硬盘进行分区后 xff0c 导致原先的分区发生位置变化 xff0c 比如sda6分区变成了sda7分区 这时候 xff0
  • 2022年了,Windows Vista还能用吗?

    今年试用了一段时间Windows11 xff0c 老实说总觉得差点意思 怎么说呢 xff0c 现在的Windows简直就是Linux 43 macOS的缝合怪 xff1a 任务栏越来越像苹果Dock xff1b 浏览器Edge用上Chrom
  • Windows11硬盘读写速度变慢的解决方法

    解决方法 命令提示符 xff0c 以管理员身份打开 fsutil usn 查询与USN日志相关的命令 deleteJournal 删除 USN 日志 用法 fsutil usn deleteJournal lt 标志 gt lt 卷路径名称
  • Ubuntu 22.04 安装 VMware Workstation 16

    基本安装 sudo chmod 43 x VMware Workstation Full 16 2 4 20089737 x86 64 bundle sudo VMware Workstation Full 16 2 4 20089737
  • 2018年了,Windows2000还能用吗?

    前两天偶尔在B 站看到一个宝岛小伙子阿哲录了一期在 2018 年用 Windows2000 的节目 xff0c 他花了一个礼拜时间体验虚拟机下使用 Windows2000 其实真的要日常使用 Windows2000 xff0c 估计是坚持不
  • flask jsonify TypeError: Object of type int64 is not JSON serializable

    写接口的时候 Google找了半天 xff0c 觉得都很麻烦 灵机一动 xff0c 想到了一个简单方法 问题的原因 字典中的数字被识别成了int64类型 xff0c json无法识别int64 解决方式 xff1a 先将字典转换成字符串再将
  • 修改Windows的Internet时间服务器使时间同步

    Windows自带的Internet时间服务器会出现不能同步时间的毛病 xff0c 我选择了上海交通大学网络中心NTP服务器来同步时间 xff0c 速度很快 方法 xff1a 桌面右下角 xff0c 时钟 xff0c 点击 xff0c 调整
  • Ubuntu下卸载和重新安装wps ——解决wps不能带格式复制粘贴网页文字和图片问题

    我的ubuntu 原来安装的 wps 通过 apt update 命令自动升级 WPS For Linux 6634 后出现了以下问题 xff1a A 变得臃肿和缓慢 xff0c 打开时会要求登录和自动打开模板页 B 不能带格式复制粘贴网页

随机推荐