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);}}
}

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

机器学习本科课程 实验3 决策树处理分类任务

实验3.1 决策树处理分类任务 使用sklearn.tree.DecisionTreeClassifier完成肿瘤分类&#xff08;breast-cancer&#xff09;计算最大深度为10时&#xff0c;十折交叉验证的精度(accuracy)&#xff0c;查准率(precision)&#xff0c;查全率(recall)&#xff0c;F1值绘制最大深度…

Haas 开发板连接阿里云上传温湿度和电池电压

目录 一、在阿里云上创建一个产品 二、开发环境的介绍 三、创建wifi示例 四、编写SI7006和ADC驱动 五、wifi配网 六、主要源码 七、查看实现结果 一、在阿里云上创建一个产品 登录自己的阿里云账号&#xff0c; 应该支付宝&#xff0c;淘宝账号都是可以的。 接着根据需求…

设置 相关

记录使用过程中做的设置相关事宜。方便后续查询 vscode如何自动生成html格式&#xff1a; vscode快速生成html模板 --两种方法&#xff0c;亲测有用_vscode自动生成html模板-CSDN博客 使用第二个方式。存储html格式后缀。输入&#xff01;&#xff0c;vscode自动补全。 安装…

ywtool login guard命令

一.登录防护功能介绍 登录防护功能主要检查系统日志/var/log/secure&#xff0c;查看系统有没有被暴力登录。登录防护默认是检测3分钟内登录系统失败15次(次数可修改)后,视其为有攻击性,拉黑此IP(centos7通过系统文件阻止IP,centos8/9通过防火墙阻止IP)。此脚本只针对SSH访问,…

platform tree架构下i2c应用实例(HS3003)

目录 概述 1 探究platform tree下的i2c 1.1 platform tree下的i2c驱动 1.2 查看i2c总线下的设备 1.3 使用命令读写设备寄存器 2 认识HS3003 2.1 HS3003特性 2.2 HS3003寄存器 2.2.1 温湿度数据寄存器 2.2.2 参数寄存器 2.2.3 一个参数配置Demo 2.3 温湿度值转换 2.…

在工业制造方面,如何更好地实现数字化转型?

实现工业制造的数字化转型涉及利用数字技术来增强流程、提高效率并推动创新。以下是工业制造领域更好实现数字化转型的几个关键步骤&#xff1a; 1.定义明确的目标&#xff1a; 清楚地概述您的数字化转型目标。确定需要改进的领域&#xff0c;例如运营效率、产品质量或供应链…

Camunda流程引擎数据库架构

&#x1f496;专栏简介 ✔️本专栏将从Camunda(卡蒙达) 7中的关键概念到实现中国式工作流相关功能。 ✔️文章中只包含演示核心代码及测试数据&#xff0c;完整代码可查看作者的开源项目snail-camunda ✔️请给snail-camunda 点颗星吧&#x1f618; &#x1f496;数据库架构…

回归预测 | Matlab实现OOA-CNN-LSTM-Attention鱼鹰算法优化卷积长短期记忆网络注意力多变量回归预测(SE注意力机制)

回归预测 | Matlab实现OOA-CNN-LSTM-Attention鱼鹰算法优化卷积长短期记忆网络注意力多变量回归预测&#xff08;SE注意力机制&#xff09; 目录 回归预测 | Matlab实现OOA-CNN-LSTM-Attention鱼鹰算法优化卷积长短期记忆网络注意力多变量回归预测&#xff08;SE注意力机制&…

C#通过文件头判断flv文件

目录 效果 代码 效果 代码 private void button1_Click(object sender, EventArgs e) { string path Application.StartupPath "\\test.flv"; //3byte 总是FLV&#xff08;0x46 0x4C 0x56&#xff09; byte[] Type new byte[3]; using (FileStre…

探索微服务治理:从发展到实践构建高效稳定的系统| 微服务的度量

随着软件行业的不断发展&#xff0c;微服务架构凭借其高度的灵活性、可扩展性和可维护性&#xff0c;逐渐成为企业应用的主流架构风格。然后微服务架构的复杂性也带来了一系列的挑战&#xff0c;其中之一就是如何有效地管理和治理微服务。本文灸哥给你详细介绍和服务治理相关的…

SQL 表信息 | 统计 | 脚本

介绍 统计多个 SQL Server 实例上多个数据库的表大小、最后修改时间和行数&#xff0c;可以使用以下的 SQL 查询来获取这些信息。 脚本 示例脚本&#xff1a; DECLARE Query NVARCHAR(MAX)-- 创建一个临时表用于存储结果 CREATE TABLE #TableSizes (DatabaseName NVARCHAR…

2024 AI 前端:回首展望,光芒未至,破晓之前!

前言 回望 2023 年&#xff0c;ChatGPT 的突然爆火&#xff0c;让 AI 无疑成为最为值得注目的新兴领域之一&#xff0c;我们也一起见证了生成式 AI 的寒武纪大爆发。这一年来&#xff0c;国内外的生成式 AI 、大模型和相关产品以令人眼花缭乱的速度更新迭代&#xff0c;新的创业…

服务器性能监控管理方法及工具

服务器是组织数据中心的主干&#xff0c;无论是优化的用户体验&#xff0c;还是管理良好的资源&#xff0c;服务器都能为您完成所有工作&#xff0c;保持服务器随时可用和可访问对于面向业务的应用程序和服务以最佳水平运行至关重要。 理想的服务器性能需要主动监控物理和虚拟…

LeetCode 133:克隆图(图的深度优先遍历DFS和广度优先遍历BFS)

回顾 图的Node数据结构 图的数据结构&#xff0c;以下两种都可以&#xff0c;dfs和bfs的板子是不变的。 class Node {public int val;public List<Node> neighbors;public Node() {val 0;neighbors new ArrayList<Node>();}public Node(int _val) {val _val;…

windows10 利用DDNS-GO解析IPV6 IPV4 阿里云 腾讯云 华为云

这里写目录标题 [工具包DDNS-GO Windows 版](https://github.com/jeessy2/ddns-go/releases)创建ddns-go windows服务打开浏览器 输入127.0.0.1:9876 就可以使用ddns-go解析ipv4 或者 IPV6 了创建的服务已经在windows的服务管理里面自动启动了 工具包DDNS-GO Windows 版 创建dd…

Java中的main方法和可变参数

目录 分析main方法形参为String[] 那么实参到底是什么&#xff1f;可变参数实例 分析main方法 在Java中&#xff0c;main方法是程序的入口点。当你运行一个Java程序时&#xff0c;JVM&#xff08;Java虚拟机&#xff09;会寻找一个名为main的方法&#xff0c;并从这里开始执行…

html2canvas 截图功能使用 VUE

html2canvas 是一个 JavaScript 库&#xff0c;可以将网页内容转换为 Canvas 元素&#xff0c;并生成图像或 PDF 文件。使用 html2canvas&#xff0c;你可以在客户端将网页的内容截图&#xff0c;并将其作为图像或 PDF 文件保存或分享。 以下是一些 html2canvas 库的特点和用途…

【NTN 卫星通信】基于NTN的多3GPP连接应用场景

1 概述 同时聚合两条3GPP接入链路&#xff0c;其中一条为非地面网络&#xff0c;可以提供以下5G业务使能&#xff0c;尤其适用于带宽有限或接入链路不可靠的服务不足地区:   -扩展流动宽频   -超可靠的服务通信 如技术报告38.821所述&#xff0c;若干服务场景(例如在偏远地…

缓存组件Caffeine的使用

caffeine是一个高性能的缓存组件&#xff0c;在需要缓存数据&#xff0c;但数据量不算太大&#xff0c;不想引入redis的时候&#xff0c;caffeine就是一个不错的选择。可以把caffeine理解为一个简单的redis。 1、导入依赖 <!-- https://mvnrepository.com/artifact/com.git…

STM32F407 CAN参数配置 500Kbps

本篇CAN参数适用 芯片型号&#xff1a;STM32F407xx系统时钟&#xff1a;168MHz&#xff0c;CAN挂载总线APB1为42M波 特 率 &#xff1a;500Kpbs引脚使用&#xff1a;TX_PB9&#xff0c;RX_PB8&#xff1b;修改为PA11PA12后&#xff0c;参数不变。 步骤一、打勾开启CAN&#xf…