欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

单片机:独立按键的应用实验

程序员文章站 2022-06-08 19:57:31
...

一、 实验目的:

(一) 熟悉单片机 I/O 口的输入控制;
(二) 熟悉开发板上单片机 I/O 口与数码管、 独立按键的电路连接;
(三) 掌握 keil C 软件的使用;
(四) 掌握独立按键的应用;
(五) 掌握按键的消抖原理。

二、 主要仪器设备及耗材:

(一) 电脑一台;
(二) 单片机开发板一套。

三、 实验原理

(一) 键盘的分类
键盘分编码键盘和非编码键盘。 键盘上闭合键的识别由专用的硬件编
码器实现, 并产生键编码号或键值的称为编码键盘, 如计算机键盘; 而靠
软件编程来识别的称为非编码键盘。 在单片机组成的各种系统中, 用的最
多的是非编码键盘。 也有用到编码键盘的。
非编码键盘有分为: 独立键盘和行列式(又称为矩阵式) 键盘。
(二) 独立按键
独立按键, 按键一端接地, 另一端与 I/O 引脚相连, 按键按下为低电平,
未按下为高电平, 其电路连接方式如图 3.1 所示。第 11 页 共 58 单片机:独立按键的应用实验

(三) 按键消抖

按下按键或松手的时候, 单片机 I/O 得到的理想波形与实际波形如图
单片机:独立按键的应用实验
因此, 按键在闭合和断开时, 触点会存在抖动现象。
1.为什么要消抖?
如图 3.2 所示, 在按键被按下的短暂瞬间, 由于硬件上的抖动, 往往会
产几毫秒的抖动, 在这时候若采集信号, 势必导致误操作, 甚至系统崩溃;
同样, 在释放按键的那一刻, 硬件上会相应的产生抖动, 会产生同样的后
果。 因此, 在模拟或者数字电路中, 我们要避免在最不稳定的时候采集信
号, 进行操作。
2.如何消抖?
一般可以采用延时、 N 次低电平计数、 低通滤波等方式进行消抖。 在单
片机应用中, 一般采用延时进行消抖, 其消抖顺序如下:
(1) 检测到信号, 如: if(k0)
(2) 延时 5ms, 消抖动, 如: delay(5);
(3) 继续检测信号, 确认是否被按下, 如: if(k
0)
①是, 则开始等待释放, 如: while(!k);
②否, 则继续检测信号。

四、 实验内容及步骤

(一) 实验内容
利用所学的单片机知识及电路知识编程实现单片机 I/O 口检测按键输
入电平。
1.选中 8 位数码管的其中 1 位数码管, 当独立按键 1 每按下一次, 数码
管加一(按下期间加 1) , 范围为 0—F;
2.选中 8 位数码管的另 1 位数码管, 当独立按键 2 每按下一次, 数码管
减一(松手之后减 1) , 范围为 F—0;
3.按下独立按键 3 期间, 流水灯以 600ms 的速度流动;
4.按下独立按键 4, 松手之后, 8 个 LED 灯作一次花样循环。
注意: 以上 4 个功能需要在同一个程序中完成。
(二) 实验步骤
1.根据电路原理图编写 C 程序, 调试并烧写入单片机;

#include <reg51.h>
/*
1.选中 8 位数码管的其中 1 位数码管, 当独立按键 1 每按下一次, 数码管加一(按下期间加 1) , 范围为 0—F;

2.选中 8 位数码管的另 1 位数码管, 当独立按键 2 每按下一次, 数码管减一(松手之后减 1) , 范围为 F—0;
3.按下独立按键 3 期间, 流水灯以 600ms 的速度流动;
4.按下独立按键 4, 松手之后, 8 个 LED 灯作一次花样循环。
*/

#define uint unsigned int

sbit a=P2^2;
sbit b=P2^3;
sbit c=P2^4;

#define smg1 c=1;b=1;a=1//选中第一个数码管
#define smg2 c=1;b=1;a=0//选中第二个数码管

char code LED[] = {0xfe, 0xfd, 0xfb, 0xf7, 0xef, 0xdf, 0xbf, 0x7f};//LED流水灯

char code number[] = {0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07, 0x7f, 0x6f,0x77, 0x7c, 0x39, 0x7e, 0x79, 0x71};//用于数码管显示0-F

code char led[] = {0xfe, 0xfd, 0xfb, 0xf7, 0xef, 0xef, 0xdf, 0xbf, 0x7f, //LED花式流水灯
				   0x7e, 0xbd, 0xdb, 0xe7,
				   0xdb, 0xdb, 0xe7, 0x7e,
				   0x00};

char k1_i=0;//用于加法
char k2_i=15;//用于减法

sbit k1 = P3^1;
sbit k2 = P3^0;
sbit k3 = P3^2;
sbit k4 = P3^3;
//	延迟函数,单位毫秒
void delay(uint ms)
{
	char i;
 	while(ms--)
	{
	 	for(i=0; i<110; i++);

	}
}

void method_1(); //方式一
void method_2(); //方式二
void method_3(); //方式三
void method_4(); //方式四

void main()
{
 	while(1)
	{
		 if(k1==0)
		 {
		 	  method_1();
		
		 }
		 else if(k2==0)
		 {
			  method_2();
		 }
		 else if(k3==0)
		 {
			  method_3();
		 }
		 else if(k4==0)
		 {
			  method_4();
		 }
	} 

}

void method_1()//选中 8 位数码管的其中 1 位数码管, 当独立按键 1 每按下一次, 数码管加一(按下期间加 1) , 范围为 0—F;
{
	smg1;
 	if(k1==0)
	{
		delay(5);
	 	if(k1==0)
		{
		 	P0 = number[k1_i];
			while(!k1);
		  	k1_i++;
			if(k1_i == 16) k1_i = 0;
		}		
	}

}

void method_2()//选中 8 位数码管的另 1 位数码管, 当独立按键 2 每按下一次, 数码管减一(松手之后减 1) , 范围为 F—0;
{
	smg2;
 	if(k2==0)
	{
		delay(100);
	 	if(k2==0)
		{
		 	P0 = number[k2_i];
			while(!k1);
			k2_i--;
			if(k2_i == -1) k2_i = 15;
		}		
	}	
}

void method_3()//按下独立按键 3 期间, 流水灯以 600ms 的速度流动;
{
	char i;
 	if(k3==0)
	{
		delay(5);
	 	if(k3==0)
		{	
			for(i=0; i<8; i++)
			{
			 	while(k3);
				LED[i];	
			}		
		}		
	}	
}

void method_4()//按下独立按键 4, 松手之后, 8 个 LED 灯作一次花样循环。
{
	char i;
 	if(k4==0)
	{
		delay(5);
	 	if(k4==0)
		{
			while(!k4);
			for(i=0; i<18; i++)
			{
		 		P2 = led[i];
				delay(200);
			}		
		}			
	}	
}



2.观察实验结果, 验证程序是否正确。
五、 思考题: 画图说明矩阵键盘的结构是怎样的?