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

一、 实验目的:

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

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

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

三、 实验原理

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

(三) 按键消抖

按下按键或松手的时候, 单片机 I/O 得到的理想波形与实际波形如图
单片机:独立按键的应用实验_第2张图片
因此, 按键在闭合和断开时, 触点会存在抖动现象。
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 
/*
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;
 	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;
	delay(5);
 	if(k2==0)
	{
     
	 	P0 = number[k2_i];
		while(!k2);
		k2_i--;
		if(k2_i == -1) k2_i = 15;
	}		
		
}

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

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

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

你可能感兴趣的:(笔记,c,单片机,嵌入式)