51单片机-独立按键控制LED灯

目录

1.硬件设计

2.软件设计

2.1.独立按键控制LED闪烁

2.2.独立按键控制LED状态

2.3.独立按键控制LED显示二进制

2.4.独立按键控制LED移位

3.知识点

3.1.if语句的运用

3.2.常用运算符


1.硬件设计

轻触按键:相当于是一种电子开关,按下时开关接通,松开时开关断开,实现原理是通过轻触按键内部的金属弹片受力弹动来实现接通和断开;原理图如下:

2.软件设计

2.1.独立按键控制LED闪烁

功能需求:按下按键,LED点亮;松开按键,LED熄灭;可单个按键控制,也可多个按键控制

程序设计:分析原理图,确定要通过控制哪个按键去决定LED亮灭;单个按键K1,控制LED亮灭的程序如下:

#include <REGX52.H>

void main()
{
	while(1)
	{
		if(P3_1==0)//通过控制K1按键,去控制LED闪烁
        //P3_0==0,即是控制K2
		{
			P2_0=0;
		}
		else
		{
			P2_0=1;
		}
	}
}

逻辑与的应用:多个按键同时按下,LED灯才能点亮(逻辑与“&&”);如K1,k2同时按下,LED点亮

#include <REGX52.H>

void main()
{
	while(1)
	{
		if(P3_1==0 && P3_0==0)// 逻辑与&&
		{
			P2_0=0;
		}
		{
			P2_0=1;
		}
	}
}

逻辑或的应用:多个按键,只要有一个按下,LED点亮(逻辑或“||”);如K1,k2,k3,k4四个按键,只要有一个按下,LED点亮

#include <REGX52.H>

void main()
{
	while(1)
	{
		if(P3_1==0 || P3_0==0 || P3_2==0 || P3_3==0) // 逻辑或||
		{
			P2_0=0;
		}
		{
			P2_0=1;
		}
	}
}

2.2.独立按键控制LED状态

功能需求:按位取反~,按一下LED点亮,再按一下LED熄灭

硬件分析:对于机械开关,当机械触点断开、闭合时,由于机械触点的弹性作用,一个开关在闭合时不会马上稳定地接通,在断开时也不会一下子断开,所以在开关闭合及断开的瞬间会伴随一连串的抖动

程序设计:分析原理图,选择按键,考虑消抖,检测松手;如单个按键K1,控制LED的程序如下:

#include <REGX52.H>

void Delay(unsigned int xms)
{
	unsigned char i, j;
	while(xms--)
	{
		i = 2;
		j = 239;
		do
		{
			while (--j);
		} while (--i);
	}
}

void main()
{
	while(1)
	{
		if(P3_1==0)
		{
			Delay(20);//按键消抖 延时20ms
			while(P3_1==0);//如果松手,P3_1==1,while循环就不成立
			Delay(20);//松手消抖 延时20ms
			P2_0=~P2_0;
		};
/*------------------------------------------------
如果把if语句的逻辑表达式换成4个按键的逻辑或运算,那就相当于是个4控开关
		if(P3_0==0 || P3_1==0 || P3_2==0 || P3_3==0)
		{
			Delay(20);
			while(P3_0==0 || P3_1==0 || P3_2==0 || P3_3==0);
			Delay(20);
			P2_0=~P2_0;
		};
------------------------------------------------*/
	}
}

2.3.独立按键控制LED显示二进制

功能需求:独立按键控制LED显示二进制,从0000 0000-->1111 1111;按一次,进一位

程序设计:在2.2基础上优化,保留按键消抖的延时代码,增加无符号字符LEDNum的定义,因要考虑按一次,进一位,所以需增加算数运算符“+”的使用

#include <REGX52.H>

void Delay(unsigned int xms)
{
	unsigned char i, j;
	while(xms--)
	{
		i = 2;
		j = 239;
		do
		{
			while (--j);
		} while (--i);
	}
}

void main()
{
	unsigned char LEDNum=0;
	while(1)
	{
		if(P3_1==0)
		{
			Delay(20);
			while(P3_1==0);
			Delay(20);
			
			LEDNum++;//LEDNum++等同于LEDNum=LEDNum+1
			P2=~LEDNum;
		}
	}
}

注意:在后面定义的函数,如果要调用,必须在main函数前面进行申明,如下程序中的Delay函数

#include <REGX52.H>
void Delay(unsigned int xms);
/*Delay函数申明*/

void main()
{
	unsigned char LEDNum=0;
	while(1)
	{
		if(P3_1==0)
		{
			Delay(20);
			while(P3_1==0);
			Delay(20);
			
			LEDNum++;//LEDNum++等同于LEDNum=LEDNum+1
			P2=~LEDNum;
		}
	}
}

/*Delay函数定义*/
void Delay(unsigned int xms)
{
	unsigned char i, j;
	while(xms--)
	{
		i = 2;
		j = 239;
		do
		{
			while (--j);
		} while (--i);
	}
}

2.4.独立按键控制LED移位

功能需求1:独立按键按下一次,LED点亮移动一位

程序设计:在2.3迭代,保留按键消抖的延时代码,增加无符号字符LEDNum的定义,因要考虑独立按键按下一次,LED点亮移动一位,所以需增加位运算的应用(按位左移“<<”)

#include <REGX52.H>

unsigned char LEDNum;
void Delay(unsigned int xms)
{
	unsigned char i, j;
	while(xms--)
	{
		i = 2;
		j = 239;
		do
		{
			while (--j);
		} while (--i);
	}
}

void main()
{
	P2=~0x01;//P2口初始化;0000 0001取反就是1111 1110
	while(1)
	{
		if(P3_1==0)
		{
			Delay(20);
			while(P3_1==0);
			Delay(20);
			
			LEDNum++;
			if(LEDNum>=8)
				LEDNum=0;
			P2=~(0x01<<LEDNum);//按位左移“<<”
		}
	}
}

功能需求2:那么如果要通过多个按键来控制呢,如按下按键1左移,按下按键2右移动

程序设计:算数运算符中的+/-运算,都要考虑最高和最低位的溢出问题,我们选用的这款51单片机,P2口是个8位寄存器,所以从0-7,最高位不能大于7,最低位不能小于0;

#include <REGX52.H>

unsigned char LEDNum;
void Delay(unsigned int xms)
{
	unsigned char i, j;
	while(xms--)
	{
		i = 2;
		j = 239;
		do
		{
			while (--j);
		} while (--i);
	}
}

void main()
{
	P2=~0x01;
	while(1)
	{
		if(P3_1==0)
		{
			Delay(20);
			while(P3_1==0);
			Delay(20);
			
			LEDNum++;
			if(LEDNum>=8)//如果当最高位大于7的时候,为防止LEDNum++的益处问题
				LEDNum=0;//P2口跳转到最低位的P2_0口
			P2=~(0x01<<LEDNum);
		}
		
		if(P3_0==0)
		{
			Delay(20);
			while(P3_0==0);
			Delay(20);
			
			if(LEDNum==0)//如果当最低位等于0的时候,为防止LEDNum--的益处问题
				LEDNum=7;//P2口跳转到最高位的P2_7口
			else
				LEDNum--;
			P2=~(0x01<<LEDNum);
		}
	}
}

3.知识点

3.1.if语句的运用

/*------------------------------------------------
如果逻辑表达式成立
    执行语句体1
否则
    执行语句体2
------------------------------------------------*/
if(逻辑表达式)
{
	语句体1;
}
else//可以不写
{
	语句体2;
}

3.2.常用运算符

  • 12
    点赞
  • 84
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

李十懿

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

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

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

打赏作者

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

抵扣说明:

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

余额充值