关闭

4.3.认识按键抖动并消除抖动

133人阅读 评论(0) 收藏 举报
分类:

实验目的:认识按键抖动并消除抖动

预备知识:
(1)什么是抖动:按键的内部结构是一个弹簧,当按键被按下的时候,弹簧可能会抖动好几次,而CPU轮训读取按键的IO端口的速度是很快的,可在抖动期间可能会多次读取IO口的电平值造成“按一次按键增加多次的现象”
(2)通过延时一段时间来“错过抖动期”
(3)全局变量:全局变量定义在函数外面,其作用与为整个程序,生命周期为从程序开始到程序结束。
实验过程分析:
(1)通过“按键一次使数码管增加1”实验,了解什么是抖动
(2)如何消除抖动
(3)测试代码

第一步:通过上节课代码进行改造成按键一次使数码管增加1
第二步:发现现象:按一次可能会增加好多数,而非只增加1
第三步:分析现象发现按键抖动

实验代码:

/******************** 按键一次使数码管增加1实验的代码************************/

#include<reg51.h>

sbit key1 = P1^0;       //  按键1接在P1^0
                        //  P0端口接数码管
unsigned char dnum = 0;
int dm[16]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc7,0xa1,0x86,0x8e};
                        //独立数码管的段码表

void display(void);
void delay(void);

void main(void)
{

    while(1)
    {
        if(key1==0)             //如果按键1被按下,则数码管就显示增加1
        {           
            display();
        }

          delay();      //延时函数
    }
}
//数码管显示函数
void display(void)
{                           //只有按键被按下,此函数才被执行
    dnum = dnum +1          //display函数每被执行一次,dnum 就 + 1
    P0 =dm[dnum];           //P0端口接到数码管上
}

void delay()
{
    unsigned char i = 0,j = 0;
    for(i=0;i<200;i++)
        for(j=0;j<200;j++);
}

上面的代码会导致一个问题,当按下一个按键时,数码管不是增加1,而是增加很多次,考虑其中的原理就是按键的抖动

/**************************** 按键消抖代码****************************/

#include<reg51.h>

sbit key1 = P1^0;
unsigned char dnum = 0;      //标记数码管显示的标记数
int dm[16]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc7,0xa1,0x86,0x8e};
    //独立数码管的段码表

void add_display(void);
void delay10ms(void);
void delay(void);

void main(void)
{
    unsigned char i=0;
    unsigned char keynum = 0;

    while(1)
    {
        if(key1==0)         //在1点检测到低电平
        {       
            delay10ms();    //延时10ms之后再来检测该电平
            if(key1 == 0)   //在2点及其之后,还是低电平,说明确实是按键被按下
            {
                add_display() ;     //显示函数被执行,数码管显示加 1
            }   

        }
        delay();
    }
}
/********************独立数码管显示****************************/
void add_display(void)
{
    dnum += 1;
    P0 = dm[dnum];
}
/*************延时函数(时间未知)*******************************/
void delay(void)
{
    unsigned char i = 0,j = 0;
    for(i=0;i<200;i++)
        for(j=0;j<200;j++);

}
/****************延时10ms*************************************/
void delay10ms(void)
{
    unsigned char a,b,c;
    for(c=5;c>0;c--)
        for(b=4;b>0;b--)
            for(a=248;a>0;a--);
}

实验总结
(1)当按住一个按键不松开时,数码管会不停地增加,这是为什么?下节课介绍完整的按键检测。

0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:15205次
    • 积分:717
    • 等级:
    • 排名:千里之外
    • 原创:58篇
    • 转载:3篇
    • 译文:0篇
    • 评论:1条