51单片机开发板实验:使用独立按键控制LED灯
- 物联网-嵌入式工程师
- 2025-02-20
- 724热度
- 0评论

一、实验目标
学会如何使用 51 单片机来检测独立按键的控制,通过开发板上的独立按键控制 D1 指示灯亮灭。
二、按键介绍
按键,作为一种电子开关装置,其操作简便,仅需轻轻一按即可实现电路的通断控制。在释放后,电路则自动断开。
51单片机开发板上所使用的按键,其内部结构依据引脚间距离的长短来定义默认状态:长距离代表常态下为闭合状态,而短距离则代表常态下为断开状态。当按键被按下时,这种默认状态会发生反转,即闭合变为断开,断开变为闭合。

然而,由于按键采用机械弹性触点,其闭合与断开的过程并非瞬间完成,而是伴随着一定的时间延迟和信号波动,这一现象被称为“抖动”。抖动的时间长度取决于按键的机械特性,通常在5毫秒至10毫秒之间。为了确保微处理器(CPU)能够准确识别并响应每一次按键操作,而非因抖动而产生误读,必须进行消抖处理。

消抖可以通过硬件或软件两种方式实现。出于简化电路设计的考虑,51单片机开发板采用软件消抖方法。其基本原理是:首先检测按键的初始状态,若检测到按键被按下(即电平由高变低),则通过软件延时(如10毫秒)来等待抖动结束。之后,再次检测按键状态,若仍处于按下状态,则确认按键操作有效,并执行相应的程序逻辑。
这里给大家列出单片机常用的软件去抖动方法:
1,先设置 IO 口为高电平(由于开发板 IO 都有上拉电阻,所以默认 IO 为高
电平)。
2,读取 IO 口电平确认是否有按键按下。
3,如有 IO 电平为低电平后,延时几个毫秒。
4,再读取该 IO 电平,如果任然为低电平,说明对应按键按下。
5,执行相应按键的程序
键盘根据识别方式的不同,可分为编码键盘和非编码键盘两大类。其中,非编码键盘,特别是独立式键盘,在单片机系统中应用广泛。这类键盘通过软件编程来识别闭合的按键,无需额外的硬件编码器。本实验采用的是独立键盘。
三、独立按键检测原理
独立按键电路构成是由各个按键的一个管脚连接在一起接地,按键其他引脚
分别接到单片机 IO 口。
单片机的 IO 口既可作为输出也可作为输入使用,当检测按键时用的是它的输入功能,独立按键的一端接地,另一端与单片机的某个 I/O 口相连,开始时先给该 IO 口赋一高电平,然后让单片机不断地检测该 I/O 口是否变为低电平,当按键闭合时,即相当于该 I/O 口通过按键与地相连,变成低电平,程序一旦检测到 I/O 口变为低电平则说明按键被按下,然后执行相应的指令。
独立按键检测步骤:
初始化IO口:在程序开始时,首先将该IO口配置为输入模式,并通过软件或硬件方式(如上拉电阻)将其电平设置为高电平。
循环检测:程序进入一个循环,不断地检测该IO口的电平状态。这通常是通过读取IO口的电平值来实现的。
按键检测:当按键被按下时,按键的两个引脚之间形成通路,将单片机的IO口与地相连。由于IO口之前被设置为高电平,并且连接了上拉电阻,因此当按键按下时,IO口的电平会迅速下降为低电平。
响应按键:程序一旦检测到IO口的电平变为低电平,就认为按键被按下。随后,程序可以执行与该按键相关的指令或函数。
等待按键释放:在按键的响应逻辑执行完毕后,程序通常会继续检测IO口的电平状态,以等待按键释放(即IO口电平再次变为高电平)。这样做是为了防止按键被长时间按下时,程序重复执行相同的指令。
通过这种方式,单片机可以准确地检测到每个独立按键的按下和释放事件,并根据需要执行相应的操作。
四、硬件电路
本实验使用到硬件资源如下:
(1)LED 模块中的 D1 指示灯
(2)K1 按键
LED 模块电路在前面介绍过,这里就不多说,开发板上的独立按键模块电路如下图所示:

从上图中可以看出,该电路是独立的,4 个独立按键的控制管脚直接连接到
51 单片机的 P3^0~P3^3 IO 上。
如果要想 51 单片机能够检测按键是否按下,就必须通过单片机管脚来控制独立按键。由于独立按键模块电路是集成的,所以使用单片机 P3^0~P33 管脚即可。
五、软件设计
本软件设计是基于51系列单片机的一个独立按键控制LED灯开关的系统。系统通过检测按键K1的状态来控制LED灯的亮灭。
1. 硬件配置
按键K1:连接到单片机的P3.1引脚,用于控制LED灯的亮灭。
LED灯:连接到单片机的P2.0引脚,作为被控制的对象。
2. 数据类型定义
u16:无符号16位整型,用于定义延时函数的计数器。
u8:无符号8位整型,虽然在本设计中未直接使用,但为常见的数据类型定义,保持代码的一致性。
3. 位定义
使用sbit关键字定义了k1和led,分别对应单片机的P3.1引脚和P2.0引脚,便于后续直接操作这些引脚。
4. 延时函数
delay(u16 i):该函数通过空循环实现延时,延时的具体时间取决于单片机的时钟频率和编译器优化,在本设计中,delay(1000)用于消抖处理,大约延时10ms左右。
5. 按键处理函数
keypros():该函数负责检测按键K1的状态,并控制LED灯的亮灭。
首先,通过读取k1的值判断按键是否被按下。如果按键被按下,则调用delay(1000)进行消抖处理。消抖后再次检查按键状态,确认按键确实被按下。将led的状态取反,即如果LED灯之前是亮的,则熄灭;如果之前是灭的,则点亮。使用while(!k1);循环等待按键释放,确保在按键未松开前不会重复执行LED状态切换的操作。
6. 主函数
main():主函数通过无限循环不断调用keypros()函数,以持续检测按键状态并控制LED灯的亮灭。在循环开始前,将led初始化为高电平(即LED灯初始状态为熄灭)。无限循环中,仅调用keypros()函数,该函数会根据按键K1的状态来控制LED灯的亮灭。
7. 注意事项
延时函数的准确性:在实际应用中,可能需要使用更精确的延时方法,如定时器中断。
消抖处理:通过延时来消除按键抖动是一种简单有效的方法,但延时时间需要根据实际情况进行调整。
按键检测逻辑:本设计中的按键检测逻辑相对简单,适用于简单的按键控制场景。在更复杂的应用中,可能需要考虑更多的按键状态和组合。
LED控制:通过直接操作led引脚的状态来控制LED灯的亮灭是一种常见的方法,但需要注意单片机的引脚输出电流限制,以免损坏LED灯或单片机。
六、编写程序
/*************************************************************************************
*
实验现象:下载程序后按下K1按键可以对D1小灯状态取反
**************************************************************************************
*/
#include "reg52.h" //此文件中定义了单片机的一些特殊功能寄存器
typedef unsigned int u16; //对数据类型进行声明定义
typedef unsigned char u8;
sbit k1=P3^1; //定义P31口是k1
sbit led=P2^0; //定义P20口是led
/*******************************************************************************
* 函 数 名 : delay
* 函数功能 : 延时函数,i=1时,大约延时10us
*******************************************************************************/
void delay(u16 i)
{
while(i--);
}
/*******************************************************************************
* 函 数 名 : keypros
* 函数功能 : 按键处理函数,判断按键K1是否按下
*******************************************************************************/
void keypros()
{
if(k1==0) //检测按键K1是否按下
{
delay(1000); //消除抖动 一般大约10ms
if(k1==0) //再次判断按键是否按下
{
led=~led; //led状态取反
}
while(!k1); //检测按键是否松开
}
}
/*******************************************************************************
* 函 数 名 : main
* 函数功能 : 主函数
* 输 入 : 无
* 输 出 : 无
*******************************************************************************/
void main()
{
led=1;
while(1)
{
keypros(); //按键处理函数
}
}
七、实验现象
使用 USB 线将开发板和电脑连接成功后,把编写好的程序编译后将编译产生的.hex 文件烧入到芯片内,按照如下 图所示的接线方式可以看到当按键 K1 按下后,指示灯 D1 点亮,再次按下则熄灭, 如此循环。
