8051单片机实战分析(以STC89C52RC为例) | 07 - 独立按键驱动

本文详细介绍了独立按键的工作原理及其在单片机系统中的应用,包括按键的两种电路形式——独立式和矩阵式。重点讲解了独立按键的硬件和软件消抖方法,通过RS触发器和电容滤波来消除机械开关的抖动。此外,还提供了一个简单的C语言代码示例,展示如何用独立按键控制LED的亮灭,以帮助理解按键处理的流程。
摘要由CSDN通过智能技术生成

按键是比较常用的也是比较简单的人机交互操作,按键实际上是一个非自锁的轻触开关,按下时触点会闭合,松开是触点断开。

1 独立式按键

常用的按键电路有两种形式,独立式按键矩阵式按键,独立式按键比较简单,它们各自与独立的输入线相连接,如图所示。


4 条输入线接到单片机的 IO 口上,当按键 K3 按下时,K3两边的线路将会导通,P32这个单片机IO口直接接到GND,此时P32这个引脚就是低电平了。当松开按键后,当松开按键后,线路断开,就不会有电流通过,那么P32引脚就会是默认的电平状态,是一个高电平,因为被上拉电阻R8拉到了VCC状态。所以我们就可以通过 P32 这个 IO 口的高低电平来判断是否有按键按下。

2 按键抖动

通常的按键所用开关为机械弹性开关,当机械触点断开、闭合时,由于机械触点的弹性作用,一个按键开关在闭合时不会马上稳定地接通,在断开时也不会一下子断开。因而在闭合及断开的瞬间均伴随有一连串的抖动。

抖动时间的长短由按键的机械特性决定,一般为5ms~10ms。 我们只要记得10ms这个参数即可。

2.1 硬件消抖

RS触发器:利用RS触发器来吸收按键的抖动。一旦有键按下,触发器立即翻转,触电的抖动便不会再对输出产生影响,按键释放时也一样。

电容滤波:将电容并联在按键的两端,利用电容的放电的延时特性,即电容两端电压不能突变。将产生抖动的电平通过电容“吸收”掉。从而达到消抖的作用。

2.2 软件消抖

在项目中为了省成本,基本上不使用硬件消抖,一般是使用软件方法去消除抖动,即检测出键闭合后执行一个延时程序,5ms~10ms的延时,让前沿抖动消失后再一次检测键的状态,如果仍保持闭合状态电平,则确认为真正有键按下。当检测到按键释放后,也要给5ms~10ms的延时,待后沿抖动消失后才能转入该键的处理程序。

3 原理图

① 独立按键:

② 上拉电阻:

③ MCU原理图:

4 代码

下面我们写一个使用独立按键控制LED亮灭的Demo:

#include "reg52.h"			 //此文件中定义了单片机的一些特殊功能寄存器

typedef unsigned int u16;	  //对数据类型进行声明定义
typedef unsigned char u8;

sbit key=P3^2;	 //定义P32口是key
sbit led=P2^0;	 //定义P20口是led

/*******************************************************************************
* 函 数 名         : delay
* 函数功能		   : 延时函数,i=1时,大约延时10us
*******************************************************************************/
void delay(u16 i)
{
	while(i--);	
}

/*******************************************************************************
* 函 数 名         : KeyProcess
* 函数功能		   : 按键处理函数,判断按键K1是否按下
*******************************************************************************/
void KeyProcess()
{
	if(key==0)		  //检测按键是否按下
	{	
		delay(1000);   //消除抖动 一般大约10ms
		if(key==0)	 //再次判断按键是否按下
		{
			led=~led;	  //led状态取反
		}
		while(!key);	 //检测按键是否松开
	}		
}

/*******************************************************************************
* 函 数 名       : main
* 函数功能		 : 主函数
* 输    入       : 无
* 输    出    	 : 无
*******************************************************************************/
void main()
{	
	while(1)
	{	
		KeyProcess();  //按键处理函数	
	}		
}

简要分析:

main函数单纯给KeyProcess子函数进行无限循环。

KeyProcess子函数首先通过语句if(key==0)检测按键是否按下,就是判断key端口是否为低电平,如果当前为低电平,就说明可能有按键被按下。

==》 然后延时大约10ms,消除抖动。

==》紧接着第二次检测按键是否按下,这是已经过了按下抖动的时候,如果key端口当前仍为低电平,则确定按键被按下了,执行led端口电平反转led=~led;,如果当前是LED灯点亮则变成熄灭,反之则点亮。

==》最后检测按键是否松开while(!key);,只有当前key==1才说明按键松开了。

③ 事实上这只是一个理解独立按键工作原理的Demo,我们后面会认识到按键在工程中的真正用法,敬请期待!

STC89C52RC/LE52RC单片机上,实现一个按键K1控制三位动态数码管显示1到100的功能,通常会涉及以下几个步骤: 1. **初始化硬件**: 首先,需要配置按键K1的中断处理函数,并将数码管设置为动态扫描模式。 2. **按键检测**: 使用中断来监听K1的按下状态。当按键被按下时,进入相应的中断服务程序。 3. **计数和显示**: 在中断内,每次按键触发,可以使用一个计数变量(如int count = 1;),然后通过循环结构(for或while)逐次增加计数,直到达到100。每增加一次,就更新动态数码管显示对应的数字,通常使用位操作或其他库函数来驱动数码管的段选和数值位。 4. **动态显示**: 对于动态数码管,你需要按照数码管的编码规则(7段LED加小数点)逐位更新显示,可能需要用到定时器配合,以便在每个数码管的一个“闪烁周期”里完成所有数位的切换。 5. **中断返回和保护计数**: 中断结束后,记得返回主循环,同时保护好计数器,防止意外中断导致计数丢失。 ```c #include <reg52.h> #define LED PORTB //假设数码管连接到P0口 #define KEY P3_0 //假设K1连接到P3.0 void key_isr() interrupt 1 { if (KEY == 0) { //如果按键按下 count++; //计数++ if (count > 100) count = 1; //超过100则回零 display(count); //更新显示 } } void display(int num) { // 根据数码管的编码规则更新LED值... } void main() { init(); // 初始化硬件 TRISB = 0xFF; // 数码管数据线设为输出 ET1 = 1; // 开启定时器1外部中断 EA = 1; // 全局中断使能 EIE1 = 1; // 中断允许 key_isr(); // 设置按键中断处理函数 while(1); } ```
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

嵌入式逍遥

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值