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

这篇具有很好参考价值的文章主要介绍了51单片机定时器中断按键消抖(无延时)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

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

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

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

软件消抖有采用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;
        }
    }
}

多按钮示例如下文章来源地址https://www.toymoban.com/news/detail-629933.html

    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单片机定时器中断按键消抖(无延时)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 51单片机定时器中断TMOD

    最近在学定时器中断TMOD,写程序时,要对定时器进行配置 对TMOD进行赋值时,拌了好久。。。。 如何根据所用的      定时器0/1 ,  工作方式0/1/2/3      对TMOD赋值呢? 我们知道: 1.TMOD长这样 :  由八位组成,前四位是T1的参数;后四位是T0的参数;GATE 和 C/T\\\' 不用多讲,

    2024年02月12日
    浏览(41)
  • 51单片机中断定时器1用法

    中断为使单片机具有对内部或外部随机发生的事件实时处理而设置的。 中断技术不仅解决了快速主机与I/O设备的数据传送问题,而且还有具有如下的优点: 1. 分时操作:CPU可以分时为多个I/O设备服务,提高了计算机的利用率。 2. 实时操作:CPU能够及时处理应用系统的随机事

    2024年02月06日
    浏览(56)
  • 51单片机:中断系统(外部中断,定时器中断,串口通信)

    目录 中断系统简介: 中断的优先级和嵌套: 8个中断请求源及其优先级: 中断的分别介绍: 1、外部中断0:INT0   2、外部中断1  3、T0和 T1:定时计数器的功能 4、串口中断(串口为什么使用定时器后面讲) 中断寄存器 (1)中断允许控制(IE) (2)中断请求标志(TCON) (

    2024年01月25日
    浏览(44)
  • C51单片机——中断与定时器

    中断是大多数CPU最精彩的部分之一,下面我们通过讲解和编程练习学习中断和定时器相关概念 目录 1.1.什么是中断 1.2.中断的种类 1.3中断的相关概念 1.4. 51单片机可用中断及相关引脚 1.4.寄存器 1.5.中断优先级 在未进行任何关于优先级的设置情况下,51 单片机(52 单片机)中断

    2024年02月03日
    浏览(61)
  • 【51单片机】:定时器的详解(包括对单片机定时解释、各类定时方式,以及中断方式)

              51定时/计数器的详解。                   码字不易,如有帮助请收藏,点赞哦。         前提:首先我们知道51单片机内部有21~26个特殊功能寄存器: P.x口寄存器:P0、P1、P2、P3 数据指针寄存器:DP0H、DP0L、DP1H、DP1L 定时器: TH1、TL1、TH0、TL0、TMOD、TCON 串口:

    2024年02月07日
    浏览(95)
  • 51单片机——定时器中断实验,小白讲解,相互学习

    定时器介绍 1,CPU时序的有关知识 震荡周期:为单片机提供定时信号的震荡源的周期(晶振周期或外加震荡周期)。 状态周期:2个震荡周期为1个状态周期,用S表示。震荡周期又称S周期或时钟周期。 机器周期:1个机器周期含6个状态周期,12个震荡周期 指令周期:完成1条指

    2024年02月03日
    浏览(42)
  • 51单片机--定时器与按键控制流水灯模式

    51单片机上的定时器是一种硬件模块,用于计时和生成特定的时间延迟。 它的电路和运转都在单片机内完成 ,它是嵌入在单片机内部的一个功能模块,具有多种工作模式和功能。 在51单片机中,通常有两个定时器/计数器:定时器0(Timer 0)和定时器1(Timer 1)。每个定时器都

    2024年02月13日
    浏览(40)
  • C51单片机按键控制流水灯模式(定时器版本)以及定时器时钟

      上篇文章我们学了关于定时器的三大组成部分及许多寄存器的概念问题,这篇文章我们就要开始讲解实操部分。 首先,我们先来看看本文最后写成的代码:      以上三张是代码的主函数,此外,代码中还需用到的独立按键检测代码在下面:  注意:头文件中#ifndef和#def

    2023年04月17日
    浏览(45)
  • C51单片机中断系统与定时器/计时器(理论部分)

    前言 文章的开始,有人可能会问,我们在前几节课学了延时函数,为什么不用延时函数来取代定时器,而必须学定时器呢?这里,有如下几个理由: 1.使用delay函数时,单片机的cpu做不了其他事情,只能等待延时结束。 2.用了定时器cpu就可以做其他的事情,只要定时器溢出时

    2023年04月15日
    浏览(39)
  • 51单片机——秒表(定时器扫描独立按键和数码管)

            这次实验主要是用定时器来定时扫描独立按键和数码管,代替两个模块函数中的延时函数。用定时器定时扫描的好处就是,主函数中的延时并不会影响按键的检测和数码管的扫描,只会影响响应速度。因为定时器是溢出就会执行中断程序,是定时的扫描。 改进的

    2024年02月10日
    浏览(58)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包