51单片机(三)独立按键控制LED

这篇具有很好参考价值的文章主要介绍了51单片机(三)独立按键控制LED。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

❤️ 专栏简介:本专栏记录了从零学习单片机的过程,其中包括51单片机和STM32单片机两部分;建议先学习51单片机,其是STM32等高级单片机的基础;这样再学习STM32时才能融会贯通。
☀️ 专栏适用人群 :适用于想要从零基础开始学习入门单片机,且有一定C语言基础的的童鞋。
🌙专栏目标:实现从零基础入门51单片机和STM32单片机,力求在玩好单片机的同时,能够了解一些计算机的基本概念,了解电路及其元器件的基本理论等。

⭐️ 专栏主要内容: 主要学习51单片机的功能、各个模块、单片机的外设、驱动等,最终玩好单片机和单片机的外设,全程手敲代码,实现我们所要实现的功能。
🌴 专栏说明 :如果文章知识点有错误的地方,欢迎大家随时在文章下面评论,我会第一时间改正。让我们一起学习,一起进步。
💑专栏主页:http://t.csdn.cn/HCD8v

本学习过程参考:https://space.bilibili.com/383400717

单片机安装软件、各种资料以及源码的路径:
https://pan.baidu.com/s/1vDTN2o8ffvczzNQGfyjHng
提取码:gdzf

一、本节背景和目标

1.1 独立按键的原理(很重要!!!)

51单片机按键控制,51单片机和STM32单片机入门,单片机,51单片机,stm32
独立按键在开发板上的位置如下图所示,左右到右依次是K1、K2、K3、K4
51单片机按键控制,51单片机和STM32单片机入门,单片机,51单片机,stm32

独立按键的原理图如下所示:

51单片机按键控制,51单片机和STM32单片机入门,单片机,51单片机,stm32

其在MCU上的位置如下所示:
51单片机按键控制,51单片机和STM32单片机入门,单片机,51单片机,stm32
由上面两张图可以知道,独立按键是接在MCU的P3.0口到P3.3口的;

可以看到,独立按键的右端是接地的;这里需要注意,独立按键跟LED灯的原理有区别,LED灯是通过高低电平通电,进而使灯亮;而独立按键不一样,独立按键的一端接地,独立按键就是一个开关;以K1为例,K1右端是GND,左端是RXD,我们知道,单片机在刚上电时,所有i/o口默认都是高电平的;所以当K1按键没有按下时,RXD是高电平,但当K1按键按下时,电路进行了连通,RXD接通了GND,所以RXD此时变成了低电平。

从上一篇文章中我们知道了,在寄存器中写入一个值,该值就会同步到对应的i/o口上;其实反之也成立,即通过寄存器可以读到i/o口的状态,是高电平还是低电平。

所以当按键没有按下时,寄存器读到的该i/o的状态就是高电平(即1);反之,当按键按下时,寄存器就可以读到该i/o口的状态为低电平(即0);我们则可以通过寄存器读到的i/o口的状态是高电平还是低电平,就知道按键是按下还是松开了,进一步可以写程序对小灯进行控制。

1.2 本节目标

目标1:独立按键控制LED亮灭

K1控制LED灯D1的亮灭,即按下K1(持续不松开)时D1亮,松开D1时D1灭;如下图所示

51单片机按键控制,51单片机和STM32单片机入门,单片机,51单片机,stm32

目标2:独立按键控制LED状态

还是K1控制D1灯,现象是K1按一下并松开,D1点亮;再按一下并松开,D1灭;再按一下并松开,D1变亮;再按一次并松开,D1灭;如下图

51单片机按键控制,51单片机和STM32单片机入门,单片机,51单片机,stm32

目标3:独立按键控制LED显示二进制

每按下并松开一次K1,LED灯点亮一次,多次按下并松开,实现按照二进制递增的顺序进行点亮;具体的说,可以将8个等比作8个二进制数字,最右边的亮表示1,右边第二个灯亮表示2,右边第三个灯亮表示4,右边第四个灯亮表示8;以此类推;也可以知道,右边第一个和右边第二个灯同时亮表示3(1+2)以此类推;每次按下并松开一次K1,此8个灯中亮起的一个或几个灯组成的数字就加1;如下图所示:

51单片机按键控制,51单片机和STM32单片机入门,单片机,51单片机,stm32

目标4:独立按键控制LED移位

按下K1并松开时,LED灯向左移一位;按下K2时,LED灯向右移一位。

K1每按下一次,LED灯向左移动一位:
51单片机按键控制,51单片机和STM32单片机入门,单片机,51单片机,stm32

K2每按下一次,LED灯向右移动一位:

51单片机按键控制,51单片机和STM32单片机入门,单片机,51单片机,stm32文章来源地址https://www.toymoban.com/news/detail-716265.html

二、独立按键控制LED亮灭

代码路径:51单片机入门教程资料\课件及程序源码\程序源码\KeilProject\3-1 独立按键控制LED亮灭
代码实现:

#include <REGX52.H>

void main()
{
	while(1)
	{
		if(P3_1==0 || P3_0==0)	//如果K1按键或K2按键按下
		{
			P2_0=0;		//LED1输出0,点亮
		}
		else
		{
			P2_0=1;		//LED1输出1,熄灭
		}
	}
}

代码解释:
P3_1和P3_0分别表示按键K1和按键K2在MCU上的端口;P3_0等于0表示通过寄存器读到的P3_0端口电平状态为低电平,由1.1 独立按键的原理中可知,按键按下时对应的i/o口为低电平,按键松开时对应的i/o口为高电平。所以P3_1==0表示K2按键按下,P3_0==0表示K1按键按下。

P2_0=0表示P2_0端口赋值为低电平,即对应的LED1灯点亮。注意,在上一篇文章的学习中,我们是对P2口整体进行控制,所以使用P2=0xFE这种方式,这种方式可以一次性控制8个灯的状态;例如P2=0xFE就表示第一个灯亮,其他的均灭;但是除了对P2口整体进行控制外,我们也可以分别对P2口的8个端口进行控制,例如P2_0=0则表示第一个灯亮,至于其他七个灯是什么状态,不管。

最终实现的效果就是目标1:K1控制LED灯D1的亮灭,即按下K1(持续不松开)时D1亮,松开D1时D1灭;如下图所示
51单片机按键控制,51单片机和STM32单片机入门,单片机,51单片机,stm32

三、独立按键控制LED状态

代码路径:51单片机入门教程资料\课件及程序源码\程序源码\KeilProject\3-2 独立按键控制LED状态
代码实现:

#include <REGX52.H>

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

void main()
{
	while(1)
	{
		if(P3_1==0)			//如果K1按键按下
		{
			Delay(20);		//延时消抖
			while(P3_1==0);	//松手检测
			Delay(20);		//延时消抖
			
			P2_0=~P2_0;		//LED1取反
		}
	}
}

代码解释:
P3_1==0表示K1按键按下,上一节已经进行了解释,这里不再解释。
Delay(20)表示延时20ms,此延时函数的是通过stc-isp生成的,生成过程在上一篇文章中有讲解,这里不再重复叙述。在里面加了参数xms,是为了能实现延时时间可配置。
至于为什么要设置延时呢?目的是消除按键的抖动,什么事抖动?

51单片机按键控制,51单片机和STM32单片机入门,单片机,51单片机,stm32

通俗的解释,当我们按下按键时,并不会马上接通,可能会进行抖动,如 通->断->通->断等过程逐渐的接通;当然,在断开时,也不会马上断开,而是断->通->断->通等过程;这些抖动过程其实是不能作为准确值的,所以要消除抖动。

所以通过延时函数,将抖动期间的动作忽略掉,就可以消除抖动带来的影响,达到的消抖的目的。

最终程序运行的结果就是上面提到的目标2:
还是K1控制D1灯,现象是K1按一下并松开,D1点亮;再按一下并松开,D1灭;再按一下并松开,D1变亮;再按一次并松开,D1灭;如下图

51单片机按键控制,51单片机和STM32单片机入门,单片机,51单片机,stm32

四、独立按键控制LED显示二进制

代码路径:51单片机入门教程资料\课件及程序源码\程序源码\KeilProject\3-3 独立按键控制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()
{
	unsigned char LEDNum=0;
	while(1)
	{
		if(P3_1==0)			//如果K1按键按下
		{
			Delay(20);		//延时消抖
			while(P3_1==0);	//松手检测
			Delay(20);		//延时消抖
			
			LEDNum++;		//变量自增
			P2=~LEDNum;		//变量取反输出给LED
		}
	}
}

代码解释:
前面的代码都跟上一节一致,就是判断按键按下,且按键松开,以及延时消抖操作。

最主要的是LEDNum++以及P2=~LEDNum两行代码;下面按照程序的运行过程解释一下这两行代码;
第一次按下并松开K1按键时,进入第一次进入循环,此时LEDNum是0,所以LEDNum++后的值即为1(十六进制表示为0x0000 0001);此时将LEDNum取反后的值是0x1111 1110,将这个值给到P2口;这样8个LED灯的状态为:高7位寄存器的值是1,即P20-P26口是高电平,则前7个LED灯都是灭的,同理,最低位的寄存器的值是0,则P27口是低电平,则最后一个LED灯是亮的;

第一次按下并松开K1按键时,进入第二次进入循环,此时LEDNum是1,所以LEDNum++后的值即为2(十六进制表示为0x0000 0010);此时将LEDNum取反后的值是0x1111 1101,将这个值给到P2口;这样8个LED灯的状态为:高6位以及最低位的寄存器的值是1,即P20-P25以及P27口是高电平,则前6个LED灯以及第8个LED灯都是灭的,同理,第7个LED灯是亮的;

依次类推,每按下并松开一次K1按键,则二进制数字加1,对应的寄存器和LED灯也都加一。

最终实现的效果就是目标3:独立按键控制LED显示二进制

每按下并松开一次K1,LED灯点亮一次,多次按下并松开,实现按照二进制递增的顺序进行点亮;具体的说,可以将8个等比作8个二进制数字,最右边的亮表示1,右边第二个灯亮表示2,右边第三个灯亮表示4,右边第四个灯亮表示8;以此类推;也可以知道,右边第一个和右边第二个灯同时亮表示3(1+2)以此类推;每次按下并松开一次K1,此8个灯中亮起的一个或几个灯组成的数字就加1;如下图所示:

51单片机按键控制,51单片机和STM32单片机入门,单片机,51单片机,stm32

五、独立按键控制LED位移

代码路径:51单片机入门教程资料\课件及程序源码\程序源码\KeilProject\3-4 独立按键控制LED移位
代码实现:

#include <REGX52.H>
void Delay(unsigned int xms);

unsigned char LEDNum;

void main()
{
	P2=~0x01;				//上电默认LED1点亮
	while(1)
	{
		if(P3_1==0)			//如果K1按键按下
		{
			Delay(20);
			while(P3_1==0); //循环直到K1键松开
			Delay(20);
			
			LEDNum++;		//LEDNum自增
			if(LEDNum>=8)	//限制LEDNum自增范围
				LEDNum=0;
			P2=~(0x01<<LEDNum);	//LED的第LEDNum位点亮
		}
		if(P3_0==0)			//如果K2按键按下
		{
			Delay(20);
			while(P3_0==0);//循环直到K2键松开
			Delay(20);
			
			if(LEDNum==0)	//LEDNum减到0后变为7
				LEDNum=7;
			else			//LEDNum未减到0,自减
				LEDNum--;
			P2=~(0x01<<LEDNum);	//LED的第LEDNum位点亮
		}
	}
}

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


代码解释:

有了前三节的基础,这一节就比较简单了,看注释即可。

最终的效果是实现目 标4:独立按键控制LED移位

按下K1并松开时,LED灯向左移一位;按下K2时,LED灯向右移一位。

K1每按下一次,LED灯向左移动一位:
51单片机按键控制,51单片机和STM32单片机入门,单片机,51单片机,stm32

K2每按下一次,LED灯向右移动一位:

51单片机按键控制,51单片机和STM32单片机入门,单片机,51单片机,stm32

到了这里,关于51单片机(三)独立按键控制LED的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 四、51单片机控制独立按键

    按键相关知识。 1.1、按键工作原理 (1)按键内部是机械结构,也就是内部是没有电路的。按键对外表现位四个引脚,但本质上只是两个,引脚是两两连在一起的。按键按下内部引脚导通,松开内部断开。 (2)电路连接与原理图中图标。 按键一端接地,一端接单片机IO口。  (3)按

    2023年04月14日
    浏览(46)
  • 单片机实验三 独立按键控制LED实验

    1.熟悉实验软件和硬件,进行正确的接线; 2.8个不同的按键对应不同的8个灯,按下按键对应的灯就会亮。 1.Keil uVision4 2.PZISP自动下载软件 3.HC6800S开发板 按键实物图 按键按下就会产生一个脉冲信号,检测脉冲信号就可以知道是否有按键被按下去。 按键原理图 按键之间相互独

    2024年02月08日
    浏览(28)
  • 51单片机-按键控制led灯

    1.开发环境介绍 使用C语言,环境为keil Keil C51是美国Keil Software公司出品的51系列兼容单片机C语言软件开发系统,与汇编相比,C语言在功能上、结构性、可读性、可维护性上有明显的优势,因而易学易用. 什么是单片机 单片机(Single-Chip Microcomputer)是一种集成电路芯片,把具

    2024年02月09日
    浏览(27)
  • 51单片机按键控制LED亮灭

    通过单片机按键控制LED亮灭与传统电路的物理逻辑不同,在物理逻辑中开关控制电路的通断来控制LED的亮灭,而通过单片机完成该项目至于要不断地读取按键所连接IO口的电平来判断对LED连接的IO口输出的电平即可。 原理图如下:  根据原理图,我们可以发现按键按下时P2.1口

    2023年04月18日
    浏览(35)
  • 设计分享|单片机独立按键控制4个LED灯亮灭

    目录 具体实现功能 设计介绍 51单片机简介 设计思路 设计内容 仿真图(protues8.7) 程序(Keil5) 具体实现功能 单片机四个按键分别控制四个LED的亮灭! 设计介绍 51单片机简介 51单片是一种低功耗、高性能CMOS-8位微控制器,具有8K可编程Flash存储器,使得其为众多嵌入式控制应

    2024年02月06日
    浏览(35)
  • 如何使用单片机点亮LED灯,并使用按键控制[51单片机]

    首先先看一下我的板子,如果我们板子不相同,可能操作也不太相同 我们就不讲底层原理了,直接看,我们可以看到板子上有 8个LED灯   那这个8个LED用什么来控制呢,我们先看底层的线路图,所有的LEDD都连接到了P2带后缀的接口上, 那么只需要操作这几个接口的高低电频,

    2024年02月05日
    浏览(30)
  • 51单片机“独立按键”控制静态数码管———显示数字0-9

    (1).独立按键模块电路图可以清楚的看到,所有从引脚JP1出来的电流都会接到GND,且当所有按键按下时被执行链接GND。所以,当JP1引脚各端口----识别----到“电流为低电平为0时”,说明按键被按下,否则为高电平按键没有被按下。 ( 2).按键的原理其是需要我们单片机有检

    2024年02月11日
    浏览(33)
  • 在51单片机中使用一个独立按键控制流水灯方向

    用独立按键控制流水灯转向,按下独立按键流水灯向右移动,再按下独立按键流水灯向左移动 此代码用到 逻辑左移:_crol_(移动对象,移动的位数) 逻辑右移:_cror_(移动对象,移动的位数)

    2024年02月07日
    浏览(30)
  • 单片机原理及应用:独立式键盘控制LED与多功能按键识别

    今天来介绍另一个外设——按键与LED的配合工作,与开关不同,按键需要注意消除抖动带来的影响,代码逻辑也会更复杂一写,下面先为大家介绍独立式键盘的相关知识。 单片机的独立式键盘指的是一种不依赖于计算机或其他外部设备的键盘输入方式,由若干按键按照一定的

    2024年01月21日
    浏览(27)
  • 一周学完C51单片机(1)点亮LED灯以及按键控制

    首先找到单片机的原理图,找到LED模块。我这里是P2口是连接了LED灯,通过此原理图我们可以看到 我们只需将单片机的IO口置为低电平,就可以点亮LED灯。 因为代码比较简单,我就分别展示一下代码,一颗LED灯的亮灭,流水灯 延时函数可以通过小工具来实现,选择好系统的频

    2024年02月08日
    浏览(31)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包