• 已解决 73482 个问题
  • 已帮助 5993 位优秀工程师

求51单片机利用定时器消抖的程序!!

韩梅梅 2018-02-05 浏览量:1512
就一个简单的例子,,用按键控制各LED的亮灭,,消抖必须用定时器消抖。。
0 0 收起

我来回答

上传资料:
选择文件 文件大小不超过15M(格式支持:doc、ppt、xls、pdf、zip、rar、txt)
最佳答案
  • 这个简单,一般用延时消抖因为简单,如果一定要用定时器消抖的话,你就配一个10ms左右的定时器,然后把Key_Scan()放在这个定时器中断服务函数里面即可,还需要再最前面定义一个状态表,在这里我只贴出关键代码吧,再具体的楼主看着手册一点一点配寄存器即可


    /* 按键返回状态 */
    #define NO_KEY          (0x00)
    #define KEY_SINGLE      (0x01)
    /* 按键返回值*/
    static uint8_t gRetValue;

    /* 状态机表 */
    typedef enum
    {
        kKEY_Idle,          /*空闲态 */
        kKEY_Debounce,      /*确认与消抖态 */
        kKEY_Confirm,       /*确认按键状态*/
    }KEY_Status;

    /* 按键扫描*/
    static void KEY_Scan(void)
    {
        static KEY_Status status = kKEY_Idle;
        switch(status)
        {
            case kKEY_Idle:
                gRetValue = NO_KEY;
                if(KEY1 == 0) 
                {
                    status = kKEY_Debounce;
                }
                break;
            case kKEY_Debounce:
                if(KEY1 == 0)
                {
                    status = kKEY_Confirm;
                }
                else
                {
                    status = kKEY_Idle;
                    gRetValue = NO_KEY;
                }
                break;
            case kKEY_Confirm:
                if(KEY1 == 1)
                {
                    gRetValue = KEY_SINGLE;
                    status = kKEY_Idle;
                }
                break;
            default:
                break;
        }
    }


     

    • 发布于 2018-02-05
    • 举报
    • 评论 1
    • 0
    • 0
电子老工程师 回复了 :这个物料带有5mmx20mm保险丝管。 回复

其他答案 数量:11
  • void key_scan(void)
    {
    KeyState = SW_RST;

    if(KeyState == OldState)
    {
    return;
    }
    else
    {
    timercnt++;
    }

    if(timercnt>4)
    {
    if(KeyState == 0)
    {
    // LED_RED = 1;
    keyPressCnt++;
    }
    else
    {
    // LED_RED = 0;
    //up
    }
    OldState = KeyState;
    timercnt = 0;
    }

    }


    定时器里面进行key_scan();扫描

    • 发布于2018-02-05
    • 举报
    • 评论 1
    • 0
    • 0
电子老工程师 回复了  :这个物料是开关控制器(类似家里电源空气开关),规格书容量大线下发送。 回复

  • if(按键按下)

    {  定时一段时间

           if(按键按下)

                  {执行语句

                   }

    }

    • 发布于2018-02-05
    • 举报
    • 评论 1
    • 0
    • 0
电子老工程师 回复了  :https://www.tme.eu/en/details/104h-tda0-r/card-connectors/attend/104h-tda0-r01/ 回复

  • 楼主参考一下这个程序http://blog.csdn.net/qq543716996/article/details/54708092
    • 发布于2018-02-05
    • 举报
    • 评论 1
    • 0
    • 0
电子老工程师 回复了  :没找到 回复

  • 定时器只需要定时就行了,然后执行按键扫描程序即可
    • 发布于2018-02-05
    • 举报
    • 评论 1
    • 0
    • 0
电子老工程师 回复了  :1-480701-0对插端:1586958-1 配套端子:640309-6 回复

  • 设置一个5ms,或者10ms的定时器,然后定时到了,执行按键扫描。

    检测到按键之后,可以设置过几个周期在次检测,中间不检测,自然消抖了。程序也不阻塞

    • 发布于2018-02-05
    • 举报
    • 评论 1
    • 0
    • 0
电子老工程师 回复了  :NTMFS5C670NLT1G MOSFET N-CH 60V 17A/71A 5DFN 回复

  • 检测到按键按下

    激活定时器

    定时器结束时检测该按键对应IO的电平

    • 发布于2018-02-05
    • 举报
    • 评论 1
    • 0
    • 0
电子老工程师 回复了  :https://www.digikey.com/en/products/detail/taiwan-semiconductor-corporation/1N4148W-G-RHG/7374103 回复

  • 这个和用不用定时器问题不是很大,要理解消抖的原理,延时检测
    • 发布于2018-02-05
    • 举报
    • 评论 1
    • 0
    • 0
电子老工程师 回复了  :确认连接器用途和种类,pin数。间距。 回复

  • 一个思路。

    使用定时器来设置读取按键的值的时间 ,两次或是几次读取的一样,就是按键有效,即实现消抖

    • 发布于2018-02-05
    • 举报
    • 评论 1
    • 0
    • 0
电子老工程师 回复了  :G3是环保,08是包装 回复

  • 一般按键采用中断的方法,在中断处理函数中,注册一个延时函数(10ms~50ms),延时时间到,在延时处理函数中再检测按键状态,如果依旧是处罚状态,就认为是一次完整的按键按下事件,也就是通过延时判断,起到了消抖的作用。
    • 发布于2018-02-07
    • 举报
    • 评论 0
    • 0
    • 0

  • 定时器消抖逻辑上很难处理并且很占内存,还是用busy waiting消抖比较好。

    • 发布于2018-02-27
    • 举报
    • 评论 1
    • 0
    • 0
电子老工程师 回复了  :1-1414761-0 12V 30A TE 回复

  • /********************************
            按独立按键使数码管加1
    ********************************/
     #include <reg52.h>

     #define uchar unsigned char
     
     sbit KEY = P1 ^ 0;                                                                                         //定义独立按键
     bit KEYSTA = 1;                                                                                         //按键的初始状态
     uchar code DispCode[] = {0xc0,0xf9,0xa4,0xb0,                                 //共阳数码管
                              0x99,0x92,0x82,0xf8,
                              0x80,0x90,0x88,0x83,
                              0xc6,0xa1,0x86,0x8e};
    void Timer0Init();                                                                                        //定时器初始化函数
    void KeyProcess();                                                                                        //按键处理函数

    void main()
    {
            Timer0Init();
            KeyProcess();
    }

    void Timer0Init()
    {
            TMOD |= 0x01;
            TH0 = 0xF8;                          //定时2MS
            TL0 = 0xCD;
            EA =1;
            ET0 = 1;
            TR0 = 1;
    }
    void KeyProcess()
    {
            bit lasttime = 1;                                                 //定义前一次按键值,初始化为1;
            uchar count = 0;                                                 //计数值初始化为0;
            KEY = 0x01;                                                                 //按键初始化;
            P0 =  DispCode[count];                                         //数码管初始化;
            while(1)
            {
                    if (KEYSTA != lasttime)                                 //如果“当前按键状态”与“前一次按键状态”不同,说明按键有动作;
                    {
                            if (lasttime == 1)                                 //如果按键有动作了,那么前一次按键状态为“弹起”(lasttime == 1),说明按键按下时,会响应动作;
                            {
                                    count++;
                                    if (count >= 16)                         //计数加到16清零,只用一个共阳数码管;
                                    {
                                            count = 0;
                                    }
                                    P0 =  DispCode[count];                 //共阳数码管显示相应的值;
                            }
                            lasttime = KEYSTA;                                 //如果按键有动作,就更新前一次按键的值;
                    }
            }
    }

    void Timer0IRQ() interrupt 1                                //2MS中断一次
    {
            static keybuf = 0xFF;                                        //定义一个静态按键缓存变量,且值为FF;主要是暂存按键状态;
            TH0 = 0xF8;                                            //重新写入初值;
            TL0 = 0xCD;
            
            keybuf = (keybuf << 1) | KEY;                    //左移一位,使当前的按键状态移到按键缓存中;
            if (keybuf == 0)                                                //如果移8次,按键状态都为0,说明按键真正按下;
            {
                    KEYSTA = 0;                                                    //确定按键状态为按键;
            }
            else if (keybuf == 0xFF)                                //如果移8次,按键状态都为1,说明按键未按下
            {
                    KEYSTA = 1;
            }

    }


    写的还不错!

    • 发布于2018-03-29
    • 举报
    • 评论 1
    • 0
    • 0
电子老工程师 回复了  :引脚绝缘材质:硅橡胶 回复

相关问题

问题达人换一批

求51单片机利用定时器消抖的程序!!