51单片机学习——按键控制

本文详细介绍了使用51单片机进行独立按键控制LED灯的基本原理,包括消除按键抖动、控制LED灯的亮灭、实现二进制转换以及高级应用如按位移动控制LED灯的移动。作者通过实例代码展示了如何一步步掌握这些技术。
摘要由CSDN通过智能技术生成

今天是第二天,进行51单片机按键控制

1.单片机核心图和独立按键图

单片机核心图

独立按键模块

上电时P3口默认是高电平,只有按下按键时才变成了低电平,可以发现这个电平转换

2.独立按键控制LED灯亮灭

【1】按键抖动

实现这个功能非常简单,我们可以通过对具体的一个灯和具体的一个按键进行控制,此时我们只需要对一个端口值进行控制,但是按键是金属按键,会出现按键抖动的现象

按键抖动(Key Bouncing)是指当一个按键被按下或释放时,由于机械接触的不稳定性,会产生多个信号,而不是单一的、清晰的信号。这种现象常见于机械开关中,特别是在老化或低质量的按键中更为常见。

当按键被按下时,理想情况下应该只产生一个电信号。然而,在实际中,接触点可能会快速地接触和断开多次,导致多个电信号被发送。这些多余的信号可能会被电路或计算机系统误解为多次按键操作,从而引起错误。

常见的按键消抖有很多种,我们这里采取延时函数来进行消抖

【2】代码实现 

下面直接给出代码,这里不多赘述,通过代码去理解是最直观的方法

#include<REGX52.H>
#include<INTRINS.H>
void Delay(unsigned int x)	//1ms的延时函数
{
	unsigned char data i, j;
   while(x)
	 {
	 _nop_();
	i = 2;
	j = 199;
	do
	{
		while (--j);
	} while (--i);
		x--;
	 }
}

void main()
{
	while(1)
	{
		if(P3_1==0)//按下按键
		{
			Delay(20);//消抖
			while(P3_1==0);
			Delay(20);
			P2_0=~P2_0;//对P2_0取反,不亮变成亮
		}
	}
}

从而实现了按一下按键,LED亮,再按一下,LED灭

3.按键控制LED灯实现二进制

这个地方超级简单:

P2口上电时默认都是高电平,1111 1111,我们只需要每次让P2减一,就完成了二进制的转换,那我们只需要在原有代码情况下加一个P2--就行了;

#include<REGX52.H>
#include<INTRINS.H>
void Delay(unsigned int x)
{
	unsigned char data i, j;
   while(x)
	 {
	 _nop_();
	i = 2;
	j = 199;
	do
	{
		while (--j);
	} while (--i);
		x--;
	 }
}

void main()
{
	while(1)
	{
		if(P3_1==0)
		{
			Delay(20);
			while(P3_1==0);
			Delay(20);
			P2--;//P2上电后默认高电平1111 1111
			
		}
	}
}

4.按键控制 

我们想要实现一个功能,按按键1LED灯右移,按按键2LED灯右移,该如何实现?

这要用到按位左移和按位右移,假定P2初始时0xFE,1111 1110,按一下变成1111 1101,再按一下变成1111 1011,这就用到了神奇的按位移动

1111 1110

1111 1101 是1111 1110<<1

1111 1011 是1111 1110<<2

.........

由此可见我们可以假设一个LedNumber,按一下P3_1让LedNumber加一,当然不能大于8,不仿大于8时让它变回0,同理,按一下P3_0让LedNumber减一,当然不能小于0,不妨等于0时让它等于7。

从而得到代码!!!!!!

#include<REGX52.H>
#include<INTRINS.H>
void Delay(unsigned int x)
{
	unsigned char data i, j;
   while(x)
	 {
	 _nop_();
	i = 2;
	j = 199;
	do
	{
		while (--j);
	} while (--i);
		x--;
	 }
}

unsigned int LedNumber = 0;
void main()
	{ P2=0xFE;
	while(1)
	{   
		
		if(P3_1==0)
		{
			
			Delay(20);
			while(P3_1==0);
			Delay(20);
			LedNumber++;
			if(LedNumber > 8)
				LedNumber = 0;
			P2 = ~(0x01<<LedNumber);//这里我取反了,看着方便一点
			
		}
		if(P3_0==0)
		{
			Delay(20);
			while(P3_0==0);
			Delay(20);
			if(LedNumber==0)
				LedNumber=7;
			else
				LedNumber--;
			P2=~(0x01<<LedNumber);
		}
	}
}

 5.结语

  上述就是我们最对按键的一个学习,如果能够掌握这些,按键也就拿捏了,通过学习我们发现,真的不难,关键是有没有走出那一步。这是我坚持第二天更新博客,希望我能继续坚持下去。

  • 11
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Proteus是一款常用的电路仿真软件,可以模拟各种电子电路的工作原理和性能。数码管是一种常见的数字显示设备,可以显示0到9的数字。 在Proteus中,我们可以使用按键来控制数码管的显示。通过连接按键和数码管的引脚,可以实现按键控制数码管显示不同的数字。 首先,我们需要在Proteus中创建一个电路图,包括数码管和按键。选择适当的数码管和按键元件,并将它们连接到合适的引脚上。确保连接正确,按键的引脚与数码管的引脚相连。 接下来,我们需要为按键添加控制代码,以便在按下按键时改变数码管的显示。可以使用Proteus提供的C语言语法编写代码。根据按键的状态,可以通过改变数码管的输入信号来改变显示的数字。 在编写完控制代码后,可以进行仿真。运行仿真时,通过点击或按下按键,观察数码管的显示是否根据按键的操作而改变。如果一切正常,说明按键控制数码管的功能实现成功。 需要注意的是,Proteus是一款虚拟的电路仿真软件,无法真正连接和操作硬件设备。因此,这种按键控制数码管的功能只是在仿真环境中实现的。在实际应用中,需要根据具体的电路设计,连接硬件设备来实现按键控制数码管的功能。 总之,使用Proteus可以方便地进行按键控制数码管的仿真,通过连接正确的引脚,并编写合适的控制代码,可以实现按键控制数码管显示的数字。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值