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

来源:互联网 发布:澳大利亚学生签证知乎 编辑:程序博客网 时间:2024/06/06 00:31

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

预备知识:
(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