单片机:独立按键的应用实验
一、 实验目的:
(一) 熟悉单片机 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(k0)
①是, 则开始等待释放, 如: 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.观察实验结果, 验证程序是否正确。
五、 思考题: 画图说明矩阵键盘的结构是怎样的?
上一篇: 基于51单片机的数字电子时钟
推荐阅读
-
国家金融大数据实验室(深圳):数字经济时代催生独立第三方大数据应用平台
-
浅析独立博客如何在手机上应用的技巧
-
单片机:按键(使用中断)控制数码管的数字加减(c语言实现)
-
百度成立增强现实实验室 看好AR的应用和发展
-
单片机(MCU)的HTTP应用——上传(POST)数据到服务器,从服务器下载(GET)文件
-
WP7应用开发笔记 继承BitmapSource并使用独立存储来缓存远程的图片
-
51单片机Proteus仿真+Keil工程-实验2-按键-数码管
-
微机原理及应用实验——汇编环境MASM的使用
-
微机原理及应用实验——MOV指令的使用详解
-
ZDNS联合发起创建的“粤港大数据图像和通信应用联合实验室”成功获批