一、单片机系统的按键

  按键是单片机系统常用的输入部件,也是人对单片机运行过过程进行控制的一个重要器件。单片机常用的按键是一种点接触型按压开关,利用单片机的 I/O 输入功能可以实现按键状态输入。为了掌握单片机按键程序的编程方法,我们先从按键的工作原理和电气特性分析入手,然后介绍按键输入的程序设计。

1、按键抖动现象

  当按下按键时,内部的金属触头在接触一瞬间会因碰撞而产生振动,并发出轻微的撞击声响,这种现象称为按键抖动。按键的抖动实际上是一种接触不良现象,如果不进行处理,按键抖动会对系统电路或程序的运行产生意外的干扰。

  按键抖动时间的长短由按键的机械特性决定,一般为 5~10 ms。在单片机系统中,按键可以直接连接在单片机的 I/O 接口上,利用程序延时操作消除按键的抖动现象。

2、单按键输入程序

  当单片机系统使用的按键数量不多时,可以直接把按键连接在单片机的 I/O 与地之间,利用单片机 I/О 接口高电平的易失性实现按键的输人。单片机运行过程中,由于按下按键产生的抖动持续时间很短,程序先不对按键检测处理,可延时一段时间跳过按键的抖动时间,当按键按下达到稳定状态时再对按键的状态检测,从而实现按键的消抖。下面通过项目说明按键程序的处理过程。

二、仿真

1、选择元器件

  这次实验要用的元器件有:AT89C51、电源、接地、按钮、共阳极数码管。按钮选择位置如下:

image.png

2、摆放模拟电路

  使用两个按钮实现对数码管显示的数字进行加减控制,P2.0 口进行加操作,P2.1 口进行减操作。

image.png

三、程序

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
博客中若有不恰当的地方,请您一定要告诉我。前路崎岖,望我们可以互相帮助,并肩前行!