01-51单片机LED与独立按键

一、单片机概述

注意:个人学习笔记,里面涉及到的C语言和进程转换相关的知识在C语言部分已经写了,这里是默认都会的状态学习单片机。

1.什么是单片机

单片机,英文Micro Controller Unit,简称MCU。其内部集成了CPU、RAM、ROM、定时器、中断系统、通讯接口等一系列电脑的常用硬件功能。

我们可以依靠单片机的传感器采集相应的数据,可以通过 CPU 处理数据,还可以完成对硬件设备,如:LED,蜂鸣器,电机等的控制。

  • 单片机相当于一台微型计算机,相比于我们平时使用的电脑,有优势也有劣势:
    • 缺点:在性能上,与计算机相差甚远,处理数据的能力要远低于计算机;
    • 优点:单片机成本低、体积小、结构简单,有其适用的领域,比如智能家居、工业自动化控制等。并不一定说性能越高的就越好,要看起使用需求,合适的才是最好的。

2. 51单片机简介

2.1命名规范

在这里插入图片描述

2.2笔记使用单片机配置

本笔记学习使用的是普中科技 STC89C52RC 的开发板。

  • 系列:51单片机系列
  • 公司:STC公司
  • 位数:8位
  • RAM:512字节,理解为电脑内存条,断电丢失
  • ROM:8K(Flash),理解为电脑磁盘,断电不丢失
  • 工作频率:12MHz

二、LED 模块

1.认识LED

LED:发光二极管,外文名(Light Emitting Diode),用于:照明、广告灯、指引灯、屏幕等。

LED 具有单向导电性,即电流只能从正极流向负极,引脚较长的一端为正极,引脚较短的一端为负极。

2.单片机中 LED 模块电路图

在这里插入图片描述

  • 说明:
    1. LED 的电路图可以看出,这是一个共阳极电路,我们需要通过芯片从另外一端(阴极)控制 LED 的亮灭,串联的电阻用于限流,防止烧坏 LED;
    2. 单片机里用 1 表示高电平(简单理解为给电),0 表示低电平(不给电),当我们给阴极赋 1 的的时候,两边都给电,没有压差,没有电势差,无法形成电流, LED 就无法点亮,因此这里给阴极赋 0 就可以点亮对应的LED;
    3. 而芯片控制 LED 对应线路的方式,单片机的芯片引出一定数目的引脚,此单片机 40 引脚,分为几组(也有独立的),8个引脚为一组,正好一字节数据也是 8 位。一组一个寄存器,一个寄存器分为 8 个,每个就是一个驱动器。我们通过代码的一字节数据,给对应位赋 0 ,其它位赋 1 ,就能点亮我们想要点亮的 LED 灯泡了;
    4. 上图可以看到,每条线路对应了一个编号,如 P21 ,这里的 p2 就代表了使用 P2 号锁存器来控制 LED ,后面的 1 对应的是锁存器的其中一个位选段,具体到驱动几号 LED。

3. LED 实验

3.1点亮一颗 LED

  • 代码演示
#include <REGX52.H>

void main()
{
	P2=0xFE; // 1111 1110
	while(1);
}
  • 说明:

    1. 上面的演示效果,是点亮了电路图中的 D1 号 LED;
    2. 在分析每位二进制的时候,对应的 LED 灯泡从 D1 ~ D8 分别对应二进制中的由低位到高位,代码里面显示的从右往左依次是低位到高位,但是C语言里面没有二进制类型,依次通过十六进制表示;
    3. 要想通过C语言调用对应的寄存器和驱动器,需要包含头文件#include <REGX52.H>
    4. 单片机里程序运行结束不会直接停止,而是会反复去执行,因此下面放一个死循环,防止反复执行,减小 CPU 占用,但是实现效果上是没有区别的。
  • 点亮指定多颗 LED

#include <REGX52.H>

void main()
{
	P2=0xAA; // 1010 1010
	while(1);
}
  • 说明:上面的代码点亮了,D1 3 5 7 四颗 LED。

3.2 LED 闪烁

  • 代码演示
#include <REGX52.H>
#include <INTRINS.H> // _nop_需要的头文件

void Delay500ms()		//@12.000MHz
{
	unsigned char i, j, k;

	_nop_();
	i = 4;
	j = 205;
	k = 187;
	do
	{
		do
		{
			while (--k);
		} while (--j);
	} while (--i);
}

void main()
{
	while(1)
	{
		P2=0xFE; // 1111 1110 亮
		Delay500ms(); // 延时500ms
		P2=0xFF; // 1111 1111 灭
		Delay500ms();
	}
}
  • 说明:
    1. 上面的演示效果,是实现了 D1 LED 每 0.5 秒闪烁一次的效果;
    2. 上面的延时函数可直接通过软件 STC-ISP 软件的延时计算器生成,需要包含头文件#include <INTRINS.H>
    3. 这里实现原理很简单,即先点亮,过 0.5s 熄灭,再过 0.5s 点亮,通过 while 实现循环。

3.3 LED 流水灯

  • 代码演示
#include <REGX52.H>
#include <INTRINS.H>

// 自定义延时多少毫秒
void Delayxms(unsigned int xms)		//@12.000MHz
{
    unsigned char i, j;
	while(xms)
	{
		i = 2;
		j = 239;
		do
		{
			while (--j);
		} while (--i);
		xms--;
	}
}


void main()
{
	// 定义变量,保存延时的毫秒数
	unsigned int time_ms = 500;
	
	while(1)
	{
		P2=0xFE; // 1111 1110
		Delayxms(time_ms);
		P2=0xFD; // 1111 1101
		Delayxms(time_ms);
		P2=0xFB; // 1111 1011
		Delayxms(time_ms);
		P2=0xF7; // 1111 0111
		Delayxms(time_ms);
		P2=0xEF; // 1110 1111
		Delayxms(time_ms);
		P2=0xDF; // 1101 1111
		Delayxms(time_ms);
		P2=0xBF; // 1011 1111
		Delayxms(time_ms);
		P2=0x7F; // 0111 1111
		Delayxms(time_ms);
	}
}
  • 说明:
    1. 代码运行结果,会从 D1 ~ D8 号 LED 依次点亮 0.5s ,如此循环;
    2. 和上面闪烁原理一样,只不过交替闪烁而已,需要计算出每个 LED 点亮对应的十六进制码就行了;
    3. 这里实现了自定义点亮时间,即先生成一个一毫秒的延时函数,然后在延时函数里放一个 while 循环,将延时函数函数体放到循环里面,要延时多少毫秒,就循环多少遍函数体即可;
    4. 需要注意的是,在单片机里,int 类型占16位,2字节。

三、按键控制 LED

1.认识独立按键模块

1.1独立按键介绍

  • 按键的结构实物图

在这里插入图片描述

如图右边,按键的底部有四个引脚,左边两个是接通的,右边两个是接通的,左右两边不接通,当我们按下的时候,左图所示的金属弹片会将左右接通,因此按下的时候,四个引脚都是接通的。

1.2独立按键电路图

在这里插入图片描述

  • 说明:
    1. 如图所示,这里的独立按键是一个共阴极电路;
    2. 前面讲到的寄存器,除了可以将指令发送到 IO 口控制 LED 的亮灭,还能读取线路中的高低电平状态返回到 IO 口;
    3. 因此,按键按下的时候,和 GND 接通,回馈信号为 0 ,松开按键,回馈信号为1;
    4. 这里使用的是 P3 锁存器,1 ~ 4 位选段。

2.按键实验

2.1按键控制 LED 亮灭

  • 代码演示
#include <REGX52.H>

void main()
{
	while(1)
	{
		// 按键按下回馈信号为0,反之为1
		if(P3_1==0)
			P2_0=0;
		else
			P2_0=1;
	}
}
  • 说明:
    1. 运行效果:按键 K1 按下的时候,LED 亮起,松开 LED 熄灭;
    2. 除了上面 LED 实验里,一次性对一个段的 8 位进行操作以外,也能单独对某一位进行操作。

2.2按键控制 LED 状态

2.2.1按键抖动

前面提到的按键里面的金属弹片,按键按下的时候,弹片会将左右引脚接通,但是机械触点也会产生振动,虽然这振动对于宏观世界而言无关紧要。但从微观来看,机械触点的弹性作用,一个开关在闭合时不会马上稳定地接通,在断开时也不会一下子断开,所以在开关闭合及断开的瞬间会伴随一连串的抖动,如下图:

在这里插入图片描述

因此,在按键按下和松开的时候,各设置一个延时函数消抖即可。

2.2.2按键点亮 LED
  • 代码演示
#include <REGX52.H>
#include <INTRINS.H>

void Delayxms(unsigned int xms)		//@12.000MHz
{
    unsigned char i, j;
	while(xms)
	{
		i = 2;
		j = 239;
		do
		{
			while (--j);
		} while (--i);
		xms--;
	}
}

void main()
{
	while(1)
	{
		if(P3_1 == 0)
		{
			// 延时为了消除按键抖动
			Delayxms(20);
			// 如果按键不松开就一直循环
			while(P3_1 == 0);
			Delayxms(20);
			// 这一次值为上一次的取反,即上一次灭,这一次就亮
			P2_0 =~ P2_0;
		}
	}

}
  • 说明:
    1. 上面代码运行的效果:按下松开, LED 点亮,再次按下松开,LED 熄灭;
    2. 在按下和松开的瞬间各设置一个延时消抖,如果按下没有松开,通过一个 while 循环阻塞,直到松开按键,循环解阻塞;
    3. 当前 LED 的亮灭状态为按键前的取反,即按键前是亮,则按下后是灭,按下前是灭,按下后是亮。

2.3按键控制 LED 以二进制显示

  • 代码演示
#include <REGX52.H>
#include <INTRINS.H>

void Delayxms(unsigned int xms)		//@12.000MHz
{
    unsigned char i, j;
	while(xms)
	{
		i = 2;
		j = 239;
		do
		{
			while (--j);
		} while (--i);
		xms--;
	}
}

void main()
{
	unsigned char LEDNum = 0;
	while(1)
	{
		if(P3_1 == 0)
		{
			Delayxms(20);
			while(P3_1 == 0);
			Delayxms(20);
			LEDNum++;
			P2 = ~LEDNum;
		}
	}

}
  • 说明:
    1. 上面代码的运行效果:每按下一次按键,LED 就以二进制数值递增的方式显示;
    2. 定义一个局部变量,用于存放每个 LED 的高低电平状态,每按键一次,对变量 +1 ;
    3. 因为 LED 模块是共阳极电路,因此给 0 LED 才亮,因此对局部变量按位取反,实现真正的效果。

2.4按键控制 LED 左右移动

  • 代码演示
#include <REGX52.H>
#include <INTRINS.H>

void Delayxms(unsigned int xms)		//@12.000MHz
{
    unsigned char i, j;
	while(xms)
	{
		i = 2;
		j = 239;
		do
		{
			while (--j);
		} while (--i);
		xms--;
	}
}

void main()
{
	unsigned char LEDNum = 0;
	P2=~0x01; // led默认开始在第一个
	while(1)
	{
		// 实现灯号递增移动
		if(P3_1 == 0)
		{
			Delayxms(20);
			while(P3_1 == 0);
			Delayxms(20);
			LEDNum++;
			if(LEDNum >= 8)
				LEDNum = 0;
			P2 = ~(0x01<<LEDNum);
		}
		// 实现灯号递减少移动
		if(P3_0 == 0)
		{
			Delayxms(20);
			while(P3_0 == 0);
			Delayxms(20);
			if(LEDNum == 0)
				LEDNum = 7;
			LEDNum--;
			P2 = ~(0x01<<LEDNum);
		}
	}
}
  • 说明:
    1. 运行结果:点按 K1 按键, LED 从低位向高位,每按键一次,移动一个;
    2. 点按 K2 按键,LED 从高位向低位,每按键一次,移动一个;
    3. 这里设置 LED 默认点亮 D1 号,定义一个变量用于保存下一次按键点亮 LED 的偏移量,通过左移右移实现每按键一次,左移或右移一个 LED ;
    4. 同时判断,移动范围,低位到高位移动,最大偏移量为 7 ,当超过 7 的时候复位到最低位 LED ;同理由高位到低位移动,最低位偏移量为0,先判断为 0,复位到最高位 LED,如此循环实现。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/951745.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

腾讯云AI代码助手编程挑战赛-刑说

作品简介 鉴于当代普法力度不够大&#xff0c;这个刑说可以帮助大家更好的普及法律知识 技术架构 采用了全后端分离的架构&#xff0c;前端使用Vue.js&#xff0c;腾讯云的AI服务处理自然语言理解与生成。 实现过程 开发环境、开发流程 系统&#xff1a;win11 开发工具&…

Elasticsearch:聚合操作

这里写目录标题 一、聚合的概述二、聚合的分类1、指标聚合&#xff08;Metric Aggregation&#xff09;2、桶聚合&#xff08;Bucket Aggregation&#xff09;3、管道聚合&#xff08;Pipeline Aggregation&#xff09; 三、ES聚合分析不精准原因分析四、聚合性能优化1、ES聚合…

升级 Spring Boot 3 配置讲解 —— 为何 SpringBoot3 淘汰了 JDK8?

学会这款 &#x1f525;全新设计的 Java 脚手架 &#xff0c;从此面试不再怕&#xff01; 随着 Spring Boot 3 的发布&#xff0c;许多开发者发现了一个重要的变化&#xff1a;Spring Boot 3 不再支持 JDK 8。这一变化引发了不少讨论&#xff0c;尤其是对于那些仍然在使用 JDK …

rhcsa练习(3)

1 、创建文件命令练习&#xff1a; &#xff08; 1 &#xff09; 在 / 目录下创建一个临时目录 test &#xff1b; mkdir /test &#xff08; 2 &#xff09;在临时目录 test 下创建五个文件&#xff0c;文件名分别为 passwd &#xff0c; group &#xff0c; bashrc &#x…

汽车免拆诊断 | 2007款保时捷Carrera S车行驶中发动机冷却液温度报警灯异常点亮

故障现象 一辆2007款保时捷Carrera S车&#xff0c;搭载3.8 L自然吸气发动机&#xff0c;累计行驶里程约为7.8万km。车主反映&#xff0c;车辆行驶一段距离后&#xff0c;组合仪表上的发动机冷却液温度报警灯异常点亮。为此&#xff0c;在其他维修厂已更换过节温器、发动机冷却…

ffmpeg7.0 aac转pcm

#pragma once #define __STDC_CONSTANT_MACROS #define _CRT_SECURE_NO_WARNINGSextern "C" { #include "libavcodec/avcodec.h" }//缓冲区大小&#xff08;缓存5帧数据&#xff09; #define AUDIO_INBUF_SIZE 40960 /*name depthu8 8s16 …

Clisoft SOS设置Server和Project

Clisoft SOS设置Server和Project 一、关于SOS Servers、Clients、Projects和Work Areas 以下三个图是官方文档中介绍的三种情况 图1&#xff1a;带有两个客户端的SOS服务器 图2&#xff1a;使用本地缓存服务器 图3&#xff1a;远程设计团队的缓存服务器 因为SOS软件需要…

Windows 安装 Docker 和 Docker Compose

&#x1f680; 作者主页&#xff1a; 有来技术 &#x1f525; 开源项目&#xff1a; youlai-mall ︱vue3-element-admin︱youlai-boot︱vue-uniapp-template &#x1f33a; 仓库主页&#xff1a; GitCode︱ Gitee ︱ Github &#x1f496; 欢迎点赞 &#x1f44d; 收藏 ⭐评论 …

深入理解plt和got表

前言 plt表和got表是和链接过程相关的表。我们知道&#xff0c;一个可执行文件的生成过程需要经过预处理&#xff0c;编译&#xff0c;汇编&#xff0c;链接四个过程。链接又分为静态链接和动态链接。静态链接是发生在程序执行之前&#xff0c;动态链接是发生在程序执行中。 …

深入学习RocketMQ

参考&#xff1a;RocketMQ从从入门到精通_rocketmq入门到精通-CSDN博客 1、消息的类型 普通消息 顺序消息 延时消息 批量消息 事务消息 2、在java中使用 2.1、pom.xml中加入依赖 <dependency><groupId>org.apache.rocketmq</groupId><artifactId…

renben-openstack-使用操作

管理员操作 (1)上传一个qcow2格式的centos7镜像 (2)管理员------>云主机类型------>创建云主机类型 名称&#xff1a;Centos7 VCPU数量&#xff1a;1 内存&#xff1a; 1024 根磁盘&#xff1a; 10G 其他的默认 点击创建云主机类型即可 界面会显示如下 创建公网络 (1)创建…

电脑硬盘系统迁移及问题处理

一、系统迁移准备 1、确认你的电脑主板是否支持安装两块硬盘,如电脑主板有多个M2硬盘接口,我们将新硬盘安装到主板上,原来的老硬盘安装在第二个接口上,主板只有一个M2接口的话可以使用移动硬盘盒。 2、新硬盘安装好后,我们进入原来的系统,在 此电脑–右键–管理–磁盘管…

PySide6-UI界面设计

导论&#xff1a; PySide6和PyQt都是Python对Qt框架的绑定&#xff0c;允许开发者使用Qt创建平台的GUI应用程序。如果你正在开发商业项目&#xff0c;或者需要使用最新的QT6特性&#xff0c;PySide6是一个更好的选择。如果你更倾向于一个成熟的社区和丰富的资源&#xff0c;Py…

ExplaineR:集成K-means聚类算法的SHAP可解释性分析 | 可视化混淆矩阵、决策曲线、模型评估与各类SHAP图

集成K-means聚类算法的SHAP可解释性分析 加载数据集并训练机器学习模型 SHAP 分析以提取特征对预测的影响 通过混淆矩阵可视化模型性能 决策曲线分析 模型评估&#xff08;多指标和ROC曲线的目视检查&#xff09; 带注释阈值的 ROC 曲线 加载 SHAP 结果以进行下游分析 与…

Banshee Stealer新变种正借Apple XProtect加密技术躲避杀毒软件

网络安全研究人员发现了一种针对 macOS 的新型信息窃取恶意软件变种&#xff0c;隐蔽性更强&#xff0c;名为Banshee Stealer。 Check Point Research 在2024 年 9 月底检测到了这一新版本&#xff0c;并在最新的分析报告中表示&#xff1a;2024年底该恶意软件源代码泄露后&…

GoLand下载安装教程

一、goland环境配置 1.下载地址 https://golang.google.cn/dl/ 2.下载安装 3.添加环境变量 4.测试环境变量 输出Hello,World! 说明环境配置成功 二、goland安装 1.下载安装 https://www.jetbrains.com/go/download/download-thanks.html 2.激活使用 SFXUSA86FM-eyJsaWNlbnNl…

C语言:枚举类型

一、枚举类型的声明 枚举顾名思义就是一一列举。我们可以把可能的取值一一列举。比如我们现实生活中&#xff1a; 星期一到星期日是有限的7天&#xff0c;可以一一列举 &#xff1b;性别有&#xff1a;男、女、保密&#xff0c;也可以一一列举 &#xff1b;月份有12个月&#x…

宝塔安装mongodb后,写脚本监控运行状态,关闭后自动重启

最近项目用上了mongodb&#xff0c;但是每天晚上 mongodb都回自动关闭&#xff0c;没办法 只能写个监视服务的脚本 在关闭的话就直接重启&#xff0c;创建个计划任务&#xff0c;每三分钟执行一次 # 检查mongo是否还在进程中 countps aux|grep mongo| grep -v grep |wc -l echo…

蓝桥杯嵌入式速通(1)

1.工程准备 创建一文件夹存放自己的代码&#xff0c;并在mdk中include上文件夹地址 把所有自身代码的头文件都放在headfile头文件中&#xff0c;之后只需要在新的文件中引用headfile即可 headfile中先提前可加入 #include "stdio.h" #include "string.h"…

Apache Hop从入门到精通 第一课 揭开Apache Hop神秘面纱

一、Apache Hop是什么&#xff1f; 1、Apache Hop&#xff0c;简称Hop&#xff0c;全称为Hop Orchestration Platform&#xff0c;即Hop 工作编排平台&#xff0c;是一个数据编排和数据工程平台&#xff0c;旨在促进数据和元数据编排的所有方面。Hop让你专注于你想要解决的问题…