一、单片机系统的按键
按键是单片机系统常用的输入部件,也是人对单片机运行过过程进行控制的一个重要器件。单片机常用的按键是一种点接触型按压开关,利用单片机的 I/O 输入功能可以实现按键状态输入。为了掌握单片机按键程序的编程方法,我们先从按键的工作原理和电气特性分析入手,然后介绍按键输入的程序设计。
1、按键抖动现象
当按下按键时,内部的金属触头在接触一瞬间会因碰撞而产生振动,并发出轻微的撞击声响,这种现象称为按键抖动。按键的抖动实际上是一种接触不良现象,如果不进行处理,按键抖动会对系统电路或程序的运行产生意外的干扰。
按键抖动时间的长短由按键的机械特性决定,一般为 5~10 ms。在单片机系统中,按键可以直接连接在单片机的 I/O 接口上,利用程序延时操作消除按键的抖动现象。
2、单按键输入程序
当单片机系统使用的按键数量不多时,可以直接把按键连接在单片机的 I/O 与地之间,利用单片机 I/О 接口高电平的易失性实现按键的输人。单片机运行过程中,由于按下按键产生的抖动持续时间很短,程序先不对按键检测处理,可延时一段时间跳过按键的抖动时间,当按键按下达到稳定状态时再对按键的状态检测,从而实现按键的消抖。下面通过项目说明按键程序的处理过程。
二、仿真
1、选择元器件
这次实验要用的元器件有:AT89C51、电源、接地、按钮、共阳极数码管。按钮选择位置如下:
2、摆放模拟电路
使用两个按钮实现对数码管显示的数字进行加减控制,P2.0 口进行加操作,P2.1 口进行减操作。
三、程序
1、按键抬起有效
在程序设计时,按下按键抬起有效控制编程时需要注意几个方面:首先,按键抖动时间一般在10ms 以内,按键按下需要消除抖动;第二,按键按下不管时间有多长,数码管都不受控制;第三,按键抬起的一瞬间数码管状态才发生改变。
#include<reg51.h>
// 数码管要显示的数字
unsigned char i=6;
//数字0~9的显示方法
code unsigned char seven_seg[] = {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
sbit key_add=P2^0;
sbit key_sub=P2^1;
void delay(unsigned int x) //延时函数
{
while(x--);
}
void main(void)
{
while(1) //进入主程序循环
{
P0=seven_seg[i];
if(key_add==0){ //按下增加按钮则执行
delay(500); //消除抖动
if(key_add==0)i++; //如果消抖动后,按钮还在被按则对数字进行自增
if(i>=10)i=9;
while(key_add==0); //当按钮抬起后,才可以结束当前判断
}
if(key_sub==0){
delay(500);
if(key_sub==0)i--;
if(i<=0)i=0;
while(key_sub==0);
}
}
}
2、按键按下有效
按下按键有效时,要求按键按下立即对数码管的状态进行控制。根据人的控制习惯,按键的程序能够实现的功能有:第一,按下按键需要消除抖动;第二,按下按键就能改变数码管状态,每按一次改变一次,速度不能限制;第三,按键抬起时不对数码管控制。
#include<reg51.h>
// 数码管要显示的数字
unsigned char i=6;
//数字0~9的显示方法
code unsigned char seven_seg[] = {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
sbit key_add=P2^0;
sbit key_sub=P2^1;
void delay(unsigned int x) //延时函数
{
while(x--);
}
void main(void)
{
//设置初始值
P0=seven_seg[i];
while(1) //进入主程序循环
{
if(key_add==0){ //按下增加按钮则执行
delay(500); //消除抖动
if(key_add==0)i++; //如果消抖动后,按钮还在被按则对数字进行自增
if(i>=10)i=9;
P0=seven_seg[i]; //更改显示的值
while(key_add==0); //当按钮抬起后,才可以结束当前判断
}
if(key_sub==0){
delay(500);
if(key_sub==0)i--;
if(i<=0)i=0;
P0=seven_seg[i];
while(key_sub==0);
}
}
}
标题:实验四(1):单片机系统的按键,按键抬起(按下)有效 —— AT89C51
作者:Yi-Xing
地址:http://47.94.239.232/articles/2020/09/30/1601436367671.html
博客中若有不恰当的地方,请您一定要告诉我。前路崎岖,望我们可以互相帮助,并肩前行!