51单片机之LED灯模块篇
御风以翔
破浪以飏
🎥个人主页
🔥个人专栏
目录
点亮一盏LED灯
LED的组成原理
LED的硬件模型
点亮一盏LED灯的程序设计
LED灯闪烁
LED流水灯
独立按键控制LED灯亮灭
独立按键的组成原理
独立按键的硬件模型
独立按键控制LED灯状态
按键的抖动
独立按键控制LED灯移位
位移的原理
点亮一盏LED灯
LED的组成原理
<1>LED即发光二极管,是一种有方向性的半导体固体发光器件,在单片机上是贴片形式
<2>LED的 阳极 串联一个电阻,然后连接到电源VCC,而LED的 阴极 连接到单片机的P2口,如果想把LED灯点亮,就把单片机相关的 I/O 口赋为低电平
<3>单片机中,用 0 表示低电频,用 1 表示高电频
LED的硬件模型
我们可以看到LED连上了单片机的管脚。而单片机需要通过CPU控制寄存器的值,进而通过驱动器加大控制力度,由控制电路输出高低电平
CPU访问寄存器为 1 输出高电频,为 0 输出低电频
点亮LED灯的程序就是让 LED = 0 (低电平),熄灭LED灯的程序就是 LED = 1(高电平)
所以我们只要在对应的寄存器上写 0 或 1 ,即可控制LED的亮灭
点亮一盏LED灯的程序设计
根据硬件原理图和寄存器定义,来对操作寄存器地址,实现灯的点亮
因为单片机只能识别十六进制,所以 1111 1110 要写成0xFE
#include <REGX52.H>void main() {while(1){P2 = 0xFE;} }
我们发现这里编译器并没有报任何的错误
于是我们选择生成文件,将代码下载到板子上
我们找到对应板子的型号,然后打开程序文件,点击下载
这样我们就点亮了一盏LED灯啦
LED灯闪烁
<1>通过STC-ISP拷贝延时代码
<2>加入延时,方便观察灯的闪烁
<3>加上while循环,循环的表达式的值为真,LED就会反复不停的亮和灭
#include <REGX52.H> #include <INTRINS.H>void Delay500ms(void) //@12.000MHz {unsigned char data i, j, k;_nop_();i = 4;j = 205;k = 187;do{do{while (--k);} while (--j);} while (--i); }void main() {while(1){P2 = 0xFE;Delay500ms();P2 = 0xFF;Delay500ms();} }单片机闪烁
LED流水灯
我们学习了点亮LED小灯闪烁,现在我们就可以进一步的让LED灯依次亮起来
这就是我们日常中的流水灯
从之前的代码操作可知,我们可以通过对P2的控制来实现8个LED灯的亮灭
我们只要对P2依次赋值就可以啦:
0xFE、0xFD、0xFB、0xF7、0xEF、0xDF、0xBF、0x7F
#include <REGX52.H> #include <INTRINS.H>void Delay500ms(void) //@12.000MHz {unsigned char data 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 1110Delay500ms();P2=0xFD; //1111 1101Delay500ms();P2=0xFB; //1111 1011Delay500ms();P2=0xF7; //1111 0111Delay500ms();P2=0xEF; //1110 1111Delay500ms();P2=0xDF; //1101 1111Delay500ms();P2=0xBF; //1011 1111Delay500ms();P2=0x7F; //0111 1111Delay500ms();} }每次延迟500毫秒太单调了,我们可以让流水灯想延迟多少行秒就可以延迟多少行秒
51单片机的数据类型
我们先将 1毫秒 的代码拷贝到我们的编译器上
然后将代码改成 传参类型
void Delay1ms(unsigned int xms) //@12.000MHz {unsigned char data i, j;while(xms){i = 2;j = 239;do{while (--j);} while (--i);xms--;} }这样我们传多少毫秒就延迟多少毫秒
void main() {while(1){P2=0xFE; //1111 1110Delay1ms(100);P2=0xFD; //1111 1101Delay1ms(200);P2=0xFB; //1111 1011Delay1ms(300);P2=0xF7; //1111 0111Delay1ms(400);P2=0xEF; //1110 1111Delay1ms(400);P2=0xDF; //1101 1111Delay1ms(300);P2=0xBF; //1011 1111Delay1ms(200);P2=0x7F; //0111 1111Delay1ms(100);} }
独立按键控制LED灯亮灭
独立按键的组成原理
独立按键直接用 I/O 口线构成的单个按键电路,其特点是每个按键单独占用一根 I/O 口线,每个按键的工作不会影响其他 I/O 口线的状态
独立按键的硬件模型
<1>独立按键电路构成是由各个按键的一个管脚连接在一起接地,按键其他引脚分别接到单片机 IO 口
<2>单片机的 IO 口既可作为输出也可作为输入使用,当检测按键时用的是它的输入功能,独立按键的一端接地, 另一端与单片机的 I/O 口相连
<3>开始时先给该 IO 口赋一高电频,然后让单片机不断地检测该 I/O 口是否变为低电频,当按键闭合时,即相当于该 I/O 口通过按键与地相连,变成低电频,程序一旦检测到I/O 口变为低电频则说明按键被按下,然后执行相应的指令
当按下k1时,LED小灯D1亮起,松开按键时D1灭掉
#include <REGX52.H>void main() {P2_0 = 1; while(1){if(P3_1 == 0) //检测按键判断是否点亮LED灯{P2_0 = 0; }else{P2_0 = 1; }} }
独立按键控制LED灯状态
按键的抖动
通常按键所用的开关都是机械弹性开关,当机械触点断开、闭合时,由于机械触点的弹性作用,一个按键开关在闭合时不会马上就稳定接通,在断开时也不会一下子彻底断开,而是在闭合和断开的瞬间伴随了一连串的 抖动
按键的效抖
<1>硬件消抖:按键上并联一个电容,利用电容的充放电特性对抖动过程中产生的电压毛刺进行平滑处理,从而实现消抖
<2>软件消抖:通过对按键状态进行两次检测,并引入适当的延时,从而忽略前沿抖动的影响
#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会与地相连 引脚处会被置低电频,D1点亮{Delay(20); //延迟20毫秒while(P3_1 == 0); //当再次按下K1键,引脚处会被置高电频Delay(20);P2_0 =~P2_0; //D1按位取反,回到高电频,D1关闭}} }首先检测按键是否处于按下状态,然后进行一段较短时间的延时,再次检测按键状态。如果确认按键仍然被按下,则执行相应的操作(在示例中为 取反 操作),并延时一段时间来避免连续按下造成的快速闪烁。最后,使用一个 while循环 来等待按键被释放
独立按键控制LED灯移位
通过控制独立按键K1、K2来实现左右移位
位移的原理
#include <REGX52.H>void Delay(unsigned int xms) //1毫秒的延迟函数 {unsigned char i, j;while(xms--){i = 2;j = 239;do{while (--j);} while (--i);} }unsigned char LEDNum; //全局变量初始化为0 void main() {P2 = ~0x01; //给P2按位取反就是点亮D1while(1){if(P3_1 == 0) //检测K1键有没有按下{Delay(20); while(P3_1 == 0); //消抖Delay(20);LEDNum++; //LEDNum自增//随着K1按键按下,LEDNum二进制变大,LED灯也会往右依次亮起if(LEDNum>=8) //处理边界问题LEDNum = 0;P2 = ~(0x01<<LEDNum); //LED的第LEDNum位点亮}if(P3_0 == 0){Delay(20);while(P3_0 == 0);Delay(20);if(LEDNum == 0)LEDNum = 7;elseLEDNum--;P2 = ~(0x01<<LEDNum);}} }
相关文章:
51单片机之LED灯模块篇
御风以翔 破浪以飏 🎥个人主页 🔥个人专栏 目录 点亮一盏LED灯 LED的组成原理 LED的硬件模型 点亮一盏LED灯的程序设计 LED灯闪烁 LED流水灯 独立按键控制LED灯亮灭 独立按键的组成原理 独立按键的硬件模型 独立按键控制LED灯状态 按键的抖动 独立按键…...
springboo冬奥会科普平台源码和论文
随着信息技术和网络技术的飞速发展,人类已进入全新信息化时代,传统管理技术已无法高效,便捷地管理信息。为了迎合时代需求,优化管理效率,各种各样的管理平台应运而生,各行各业相继进入信息管理时代…...
改进神经网络
Improve NN 文章目录 Improve NNtrain/dev/test setBias/Variancebasic recipeRegularizationLogistic RegressionNeural networkother ways optimization problemNormalizing inputsvanishing/exploding gradientsweight initializegradient checkNumerical approximationgrad…...
HarmonyOS 开发学习笔记
HarmonyOS 开发学习笔记 一、开发准备1.1、了解ArkTs语言1.2、TypeScript语法1.2.1、变量声明1.2.2、条件控制1.2.3、函数1.2.4、类和接口1.2.5、模块开发 1.3、快速入门 二、ArkUI组件2.1、Image组件2.2、Text文本显示组件2.3、TextInput文本输入框组件2.4、Button按钮组件2.5…...
maven java 如何打纯源码zip包
一、背景 打纯源码包给第三方进行安全漏洞扫描 二、maven插件 项目中加入下面的maven 插件 <!-- 要将源码放上去,需要加入这个插件 --><plugin><artifactId>maven-source-plugin</artifactId><version>2.4</version><con…...
Altium Designer(AD)原理图库添加阵列管脚图文教程及视频演示
🏡《专栏目录》 目录 视频演示1,概述2,添加方法3,总结视频演示 Altium Designer(AD24)原理图库添加阵列管脚 欢迎点击浏览更多高清视频演示 1,概述...
P3647 题解
文章目录 P3647 题解OverviewDescriptionSolutionLemmaProof Main Code P3647 题解 Overview 很好的题,但是难度较大。 模拟小数据!——【数据删除】 Description 给定一颗树,有边权,已知这棵树是由这两个操作得到的࿱…...
Vivado Tri-MAC IP的例化配置(三速以太网IP)
目录 1 Tri-MAC IP使用RGMII接口的例化配置1.1 Data Rate1.2 interface配置1.3 Shared Logic配置1.4 Features 2 配置完成IP例化视图 1 Tri-MAC IP使用RGMII接口的例化配置 在网络设计中,使用的IP核一般为三速以太网IP核,使用时在大多数场景下为配置为三…...
交友系统---让陌生人变成熟悉人的过程。APP小程序H5三端源码交付,支持二开。
随着社交网络的发展和普及,人们之间的社交模式正在发生着深刻的变革。传统的线下交友方式已经逐渐被线上交友取而代之。而同城交友正是这一趋势的产物,它利用移动互联网的便利性,将同城内的人们连接在一起,打破了时空的限制&#…...
uni-app 经验分享,从入门到离职(三)——关于 uni-app 生命周期快速了解上手
文章目录 📋前言⏬关于专栏 🎯什么是生命周期🧩应用生命周期📌 关于 App.vue/App.uvue 🧩页面生命周期📌关于 onShow 与 onLoad 的区别 🧩组件生命周期 📝最后 📋前言 这…...
PostgreSQL 与 MySQL 相比,优势何在?
我们将通过一张对比表格详细列出 PostgreSQL 与 MySQL 在不同方面的对比: 对比表格 特性/数据库PostgreSQLMySQL数据类型支持支持JSON/JSONB、数组、区间等高级数据类型基本数据类型支持,JSON支持较普通遵循SQL标准更严格遵循,支持复杂查询…...
Linux(三)--文件系统
Linux命令简介 [rootlocalhost ~]# 表示 Linux 系统的命令提示符。 []:这是提示符的分隔符号,没有特殊含义。 root:显示的是当前的登录用户,笔者现在使用的是 root 用户登录。 :分隔符号,没有特殊含义。 l…...
DC-8靶机渗透详细流程
信息收集: 1.存活扫描: arp-scan -I eth0 -l └─# arp-scan -I eth0 -l Interface: eth0, type: EN10MB, MAC: 00:0c:29:dd:ee:6a, IPv4: 192.168.10.129 Starting arp-scan 1.10.0 with 256 hosts (https://github.com/royhills/arp-scan) 192.168.10…...
SolidWorks学习笔记——入门知识2
目录 建出第一个模型 1、建立草图 2、选取中心线 3、草图绘制 4、拉伸 特征的显示与隐藏 改变特征名称 5、外观 6、渲染 建出第一个模型 1、建立草图 图1 建立草图 按需要选择基准面。 2、选取中心线 图2 选取中心线 3、草图绘制 以对称图形举例,先画出…...
Elasticsearch:通过 ingest pipeline 对大型文档进行分块
在我之前的文章 “Elasticsearch:使用 LangChain 文档拆分器进行文档分块” 中,我详述了如何通过 LangChain 对大的文档进行分块。那个分块的动作是通过 LangChain 在 Python 中进行实现的。对于使用版权的开发者来说,我们实际上是可以通过 i…...
数据库管理-第148期 最强Oracle监控EMCC深入使用-05(20240208)
数据库管理148期 2024-02-08 数据库管理-第148期 最强Oracle监控EMCC深入使用-05(20240208)1 性能主页2 ADDM Spotlight3 实时ADDM4 数据库的其他5 主机总结 数据库管理-第148期 最强Oracle监控EMCC深入使用-05(20240208) 作者&am…...
Bug2- Hive元数据启动报错:主机被阻止因连接错误次数过多
错误代码: 在启动Hive元数据时,遇到了以下错误信息: Caused by: java.sql.SQLException: null, message from server: "Host 192.168.252.101 is blocked because of many connection errors, unblock with mysqladmin flush-hosts&qu…...
HarmonyOS 鸿蒙应用开发(十、第三方开源js库移植适配指南)
在前端和nodejs的世界里,有很多开源的js库,通过npm(NodeJS包管理和分发工具)可以安装使用众多的开源软件包。但是由于OpenHarmony开发框架中的API不完全兼容V8运行时的Build-In API,因此三方js库大都需要适配下才能用。 移植前准备 建议在适…...
Docker- chapter 1
note 1: docker 利用 volume 进行 presist data。 eg : compose.yaml: volumes:database: //# named db by self list golbal volumes: docker volume ls # the volumes on the disk inpect someone volume: docker volume inspect m…...
解决IntellIJ Idea内存不足
突然有一天我在IDEA打开两个项目时,发生了报错,说我内存不足,我这电脑内存16G怎么会内存不足。下面是我的解决方案。 IntelliJ IDEA 报告内存不足的原因通常与以下几个因素有关: 项目规模较大:如果您正在开发的项目非…...
智慧医疗能源事业线深度画像分析(上)
引言 医疗行业作为现代社会的关键基础设施,其能源消耗与环境影响正日益受到关注。随着全球"双碳"目标的推进和可持续发展理念的深入,智慧医疗能源事业线应运而生,致力于通过创新技术与管理方案,重构医疗领域的能源使用模式。这一事业线融合了能源管理、可持续发…...
css实现圆环展示百分比,根据值动态展示所占比例
代码如下 <view class""><view class"circle-chart"><view v-if"!!num" class"pie-item" :style"{background: conic-gradient(var(--one-color) 0%,#E9E6F1 ${num}%),}"></view><view v-else …...
基础测试工具使用经验
背景 vtune,perf, nsight system等基础测试工具,都是用过的,但是没有记录,都逐渐忘了。所以写这篇博客总结记录一下,只要以后发现新的用法,就记得来编辑补充一下 perf 比较基础的用法: 先改这…...
【Web 进阶篇】优雅的接口设计:统一响应、全局异常处理与参数校验
系列回顾: 在上一篇中,我们成功地为应用集成了数据库,并使用 Spring Data JPA 实现了基本的 CRUD API。我们的应用现在能“记忆”数据了!但是,如果你仔细审视那些 API,会发现它们还很“粗糙”:有…...
dify打造数据可视化图表
一、概述 在日常工作和学习中,我们经常需要和数据打交道。无论是分析报告、项目展示,还是简单的数据洞察,一个清晰直观的图表,往往能胜过千言万语。 一款能让数据可视化变得超级简单的 MCP Server,由蚂蚁集团 AntV 团队…...
虚拟电厂发展三大趋势:市场化、技术主导、车网互联
市场化:从政策驱动到多元盈利 政策全面赋能 2025年4月,国家发改委、能源局发布《关于加快推进虚拟电厂发展的指导意见》,首次明确虚拟电厂为“独立市场主体”,提出硬性目标:2027年全国调节能力≥2000万千瓦࿰…...
【学习笔记】erase 删除顺序迭代器后迭代器失效的解决方案
目录 使用 erase 返回值继续迭代使用索引进行遍历 我们知道类似 vector 的顺序迭代器被删除后,迭代器会失效,因为顺序迭代器在内存中是连续存储的,元素删除后,后续元素会前移。 但一些场景中,我们又需要在执行删除操作…...
适应性Java用于现代 API:REST、GraphQL 和事件驱动
在快速发展的软件开发领域,REST、GraphQL 和事件驱动架构等新的 API 标准对于构建可扩展、高效的系统至关重要。Java 在现代 API 方面以其在企业应用中的稳定性而闻名,不断适应这些现代范式的需求。随着不断发展的生态系统,Java 在现代 API 方…...
Kubernetes 网络模型深度解析:Pod IP 与 Service 的负载均衡机制,Service到底是什么?
Pod IP 的本质与特性 Pod IP 的定位 纯端点地址:Pod IP 是分配给 Pod 网络命名空间的真实 IP 地址(如 10.244.1.2)无特殊名称:在 Kubernetes 中,它通常被称为 “Pod IP” 或 “容器 IP”生命周期:与 Pod …...
【LeetCode】算法详解#6 ---除自身以外数组的乘积
1.题目介绍 给定一个整数数组 nums,返回 数组 answer ,其中 answer[i] 等于 nums 中除 nums[i] 之外其余各元素的乘积 。 题目数据 保证 数组 nums之中任意元素的全部前缀元素和后缀的乘积都在 32 位 整数范围内。 请 不要使用除法,且在 O…...






















