【51单片机系列】独立按键介绍

本文是关于独立按键的介绍及使用。首先介绍了按键,包括什么是按键及使用按键时如何实现软件消抖。然后使用proteus仿真实现独立按键控制LED指示灯的操作。

之前的LED、蜂鸣器、数码管中IO口都是作为输出使用,这里通过独立按键实验介绍IO口作为输入的使用。

一、按键介绍

按键是一种电子开关,使用时按开关按钮就可使开关接通,当松开手时,开关断开。简单的按键及内部简易图如下:

按键及内部简易图

按键管脚两端距离长的表示默认是导通状态,距离短的默认是断开状态。

如果按键按下,初始导通状态变为断开,初始断开状态变为导通。

通常的按键使用的开关为机械弹性开关,当机械触电断开、闭合时,电压信号如下所示:

机械触点断开闭合时的电压信号

由于机械点的弹性作用,按键开关在闭合时不会马上稳定的接通,在断开时也不会一下子断开。因而在闭合和断开的瞬间均伴随着一连串的抖动。抖动时间的长短由按键的机械特性决定,一般为5ms到10ms。

按键稳定闭合时间的长短由操作人员的按键动作决定,一般为零点几秒至数秒。按键抖动会引起按键被误读多次。为了确保CPU对按键的依次闭合仅作一次处理,必须及时进行消抖。

按键消抖有两种方式,一种是硬件消抖,另一种是软件消抖。为了使电路更加简单,通常采用软件消抖。

软件消抖一般来说一个简单的按键消抖就是先读取按键的状态,如果得到按键按下之后,延时10ms,再次读取按键状态,如果按键还是按下状态,那么说明按键已经按下。其中的延时10ms就是软件消抖处理。

常用的软件去抖动方法:

  1. 先设置IO口为高电平,由于开发板IO有上拉电阻,默认IO为高电平;
  2. 读取IO口电平确认是否有按键按下;
  3. 如果有IO电平为低电平后,延时几个毫秒;
  4. 再读取该IO电平,如果仍为低电平,说明按键按下;
  5. 执行相应按键的程序;

键盘分为编码键盘和非编码键盘。键盘上闭合键的识别由专用的硬件编码器实现,并产生键编码号或键值的称为编码键盘,如计算机键盘。靠软件编程来识别的键盘称为非编码键盘。

单片机系统中,用的较多的是非编码键盘。非编码键盘又分为独立键盘和行列式键盘(即常说的矩阵键盘)。

二、独立按键检测原理

独立按键电路构成是由各个按键的一个管脚连接在一起接地,按键其它引脚分别接到单片机IO口。

单片机的IO口既可作为输出也可作为输入使用,当检测按键时用的是它的输入功能,独立按键的一端接地,另一端与单片机的某个IO口相连,开始时先给IO口赋一高电平,然后让单片机不断检测该IO口是否变为低电平,当按键闭合时,相当于该IO口通过按键与地相连,变成低电平,程序一旦检测到IO口变为低电平则说明按键被按下,然后执行相应的指令。

三、硬件设计

要实现的功能是:通过开发板上的独立按键控制LED指示灯亮灭。使用到的硬件资源如下:

  • LED指示灯
  • K1按键

proteus中仿真如下:

独立按键硬件设计

从电路中可以知道,该电路是独立的,4个独立按键的控制管脚直接连接到单片机的P3^0 ~ P3^3 IO口上。

要想单片机能够检测按键是否按下,需要通过单片机管脚来控制独立按键。

四、软件设计

实现代码如下:

/*
	实现功能:使用独立按键控制指示灯的亮灭
	[2023-12-06] zoya
*/
#include "reg52.h"

typedef unsigned int u16;

sbit KEY1 = P3^0;  // 独立按键
 
#define GPIO_LED P2  // 指示灯

// 延时函数,i=1延时10us
void delay(u16 i)
{
	while(i--);
}

// 独立按键处理函数
void keypros()
{
	if(0 == KEY1){  // 2. 读取IO口是否为低电平确认按键是否按下
		delay(1000);  // 3. 延时10ms
		if(0 == KEY1) {  // 4. 在读取IO口判断是否为低电平,如果仍然是低电平,说明按键按下
			GPIO_LED = ~GPIO_LED;  // 5. 执行按键按下的操作
		}
		
		while(!KEY1);  // 6. 稳定闭合期间保持按键操作
	}
}


void main()
{
	KEY1 = 1;  // 1. 先设置IO口为高电平
	GPIO_LED = 0xFF;  // 默认指示灯为不亮状态
	while(1)
	{
		keypros();
	}
}

仿真结果:

独立按键控制指示灯

  • 4
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
根据提供的引用内容,可以得知独立按键是一种常见的电子元器件,它通常由四个引脚组成,其中两组间距较短,而另两组间距较长。间距长的两组引脚之间是连接在一起的,而短间距引脚之间初始状态是断开的,当按键被按下时,四个引脚被接通,可视作一根导线。在51单片机中,我们可以通过定时器来实现对独立按键的检测。 以下是51单片机定时器独立按键的实现步骤: 1. 配置定时器:选择一个合适的定时器,并设置其工作模式和计数器初值,使其能够按照一定的时间间隔产生中断。 2. 配置IO口:将独立按键的一个引脚连接到单片机的一个IO口上,并将该IO口设置为输入模式。 3. 编写中断服务程序:在定时器中断服务程序中,读取独立按键的状态,如果检测到按键被按下,则执行相应的操作。 4. 启动定时器:启动定时器,使其开始按照设定的时间间隔产生中断。 5. 等待按键事件:在主程序中,等待独立按键的事件发生,如果检测到按键被按下,则执行相应的操作。 以下是51单片机定时器独立按键的代码示例: ```c #include <reg52.h> sbit KEY = P1^0; // 独立按键连接到P1.0 void Timer0_Init() // 定时器0初始化函数 { TMOD &= 0xF0; // 设置定时器0为模式0 TH0 = 0x3C; // 设置定时器0的计数初值为0x3C TL0 = 0xB0; // 设置定时器0的计数初值为0xB0 ET0 = 1; // 使能定时器0中断 TR0 = 1; // 启动定时器0 } void main() { Timer0_Init(); // 初始化定时器0 while(1) { if(KEY == 0) // 检测独立按键是否被按下 { // 执行相应的操作 } } } void Timer0_ISR() interrupt 1 // 定时器0中断服务程序 { if(KEY == 0) // 检测独立按键是否被按下 { // 执行相应的操作 } } ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值