51单片机-驱动LED模块教程

本章思维导图:

51单片机驱动LED灯模块

LED灯元器件简介

        LED(Light Emitting Diode,发光二极管) 是一种固态半导体器件,通过P-N结中电子与空穴复合直接将电能转化为光能。其核心结构由P型半导体(空穴主导)和N型半导体(电子主导)组成,当施加正向电压时,电子与空穴在PN结处复合,以光子形式释放能量,光的颜色由半导体材料决定(如GaN基材料发蓝光,掺杂荧光粉后可得白光)。实物图如下:

LED灯结构与原理:

        PN结:由P型半导体(空穴主导)和N型半导体(电子主导)组成,电子与空穴复合时释放光子。

        分类:贴片式(0603、0805等)、直插式(3mm、5mm等)、高压LED、COB(芯片级封装)。

区分LED的正负:

        1. 引脚长度:长引脚为正极(阳极),短引脚为负极(阴极)。

        2. 引脚粗细:正极引脚通常较粗,负极较细(部分型号适用)。原因:正极需承载更大电流,设计上可能更粗以增强导电性。    

        3. 封装标识:内部结构:观察LED内部,较小金属片(或焊盘)连接正极,较大金属片连接负极。

        4. 外部标记:某些LED在塑料外壳上印有“+”或“-”符号。扁平封装LED(如贴片式)可能有绿色或白色标记的一端为负极。

        5. 灯头形状(适用于某些特殊LED):部分LED灯头设计为“平边”或“缺口”侧为负极,另一侧为正极(需参考具体型号说明书)。


硬件电路原理分析

观察电路图:可分析出有8个LED灯分别为D1~D8;LED灯左侧连接高电平VCC,LED灯右侧连接排阻在连接51单片机的P20~P27编号引脚;51单片机P20~P27编号引脚分别对应51芯片P2.0引脚~P2.7引脚;所以要得LED灯点亮电路中51单片机P2.0引脚~P2.7引脚输出低电平形成电势差;

排阻在电路中起到的作用是:限制电流,防止LED因过流而损坏,同时确保其正常工作。

总结:驱动LED灯51单片机P2.0引脚~P2.7引脚输出低电平,不驱动LED灯51单片机P2.0引脚~P2.7引脚输出高电平;


sbit关键字和sft关键字

在讲解软件编程设计前,我想给小伙伴们讲解sbit关键字和sft关键字。因为这与我们51单片机软件编程息息相关;

sbit关键字

sbit关键字的作用:声明一个特殊功能寄存器中的某一位的地址,允许单独操作该位(置1、清0或读取状态)。

sbit关键字的语法:

sbit 位名 = 寄存器名^位置; // 方式1:通过sfr变量声明 
sbit 位名 = 地址; // 方式2:直接通过绝对地址声明(不常用)

示例代码:

sfr P0 = 0x80; // 先声明P0寄存器 
sbit P0_0 = P0^0; // 声明P0端口的第0位(最低位) 
sbit P0_1 = 0x80^1; // 直接通过地址声明P0的第1位(等效写法)

sbit关键字的注意细节:

        sbit 必须基于已声明的 sfr 或绝对地址(0x80~0xFF)。

        位位置是 0~7(0表示最低位,7表示最高位)。

        常用于控制单个引脚或标志位(如中断标志、定时器控制位等)。


sfr关键字

sfr关键字作用:声明一个8位特殊功能寄存器的地址,使其可以通过变量名直接访问。

sfr关键字的语法:

sfr 寄存器名 = 地址;

示例代码:

sfr P0 = 0x80; // 声明P0端口寄存器,地址为0x80
通过 P0 可以直接读写整个8位寄存器,例如:P0 = 0xFF; // 将P0端口所有引脚置高电平

sfr关键字的注意细节:

        51单片机的SFR地址范围是 0x80~0xFF(128~255)。

        编译器会将 sfr 声明的变量直接映射到对应的硬件地址,操作效率高。


驱动LED灯软件编程设计

接下来为小伙伴们展示LED灯点亮代码

#include "reg52.h"
sbit P2_0=P2^0;	 //sbit 是Keil C51特有的关键字,用于声明单个引脚变量。
sbit P2_1=P2^1;
sbit P2_2=P2^2;
sbit P2_3=P2^3;
sbit P2_4=P2^4;
sbit P2_5=P2^5;
sbit P2_6=P2^6;
sbit P2_7=P2^7;
int main()
{while(1){//第一种方法:直接对每一个引脚进行输出低电平操作,前提大家要使用sbit关键字先对P2寄存器的每个位进行声明P2_0=0;P2_1=0;P2_2=0;P2_3=0;P2_4=0;P2_5=0;P2_6=0;P2_7=0;//第二种方法:直接对寄存器进行赋值操作P2=0x00;}
}

效果展示图:     


配置LED灯流水灯函数

要实现流水灯效果函数我们首先实现简单延时函数,原理就是使MCU芯片跑空循环任务,消耗时间。

延时函数代码示例:延时函数的形参为填入的要延时的时间,例如填入1延时时间为10微秒

void Delay_10us(u16 us)//当传入形参us=1时,时间大概为10us
{while(us--);
}

实现流水灯函数:有三个实现方法小伙伴们可以参考啦

方法一:直接对P2寄存器进行整体赋值操作

#include "reg52.h"
typedef unsigned int u16;
typedef	unsigned int u8; 
void Delay_10us(u16 us)//当传入形参us=1时,时间大概为10us
{while(us--);
}
int main()
{u8 i=0;while(1){for(i=0;i<8;i++){P2=~(0x01<<i);//点亮一个LED灯Delay_10us(500000);//延时时间为480msP2=0xff;//关闭全部LED灯Delay_10us(500000);//延时时间为480ms}}
}

方法二:对单个引脚一个一个赋值操作

#include "reg52.h"
sbit P2_0=P2^0;	 //sbit 是Keil C51特有的关键字,用于声明单个引脚变量。
sbit P2_1=P2^1;
sbit P2_2=P2^2;
sbit P2_3=P2^3;
sbit P2_4=P2^4;
sbit P2_5=P2^5;
sbit P2_6=P2^6;
sbit P2_7=P2^7;
typedef unsigned int u16;
void Delay_10us(u16 us)//当传入形参us=1时,时间大概为10us
{while(us--);
}
int main()
{P2=0xff;//对LED灯初始化关闭LED灯while(1){P2_0=0;//点亮第一个LED灯Delay_10us(500000);//延时时间480usP2_0=1;//关闭第一个LED灯,后面由此类推P2_1=0;Delay_10us(500000);//延时时间480usP2_1=1;P2_2=0;Delay_10us(500000);//延时时间480usP2_2=1;P2_3=0;Delay_10us(500000);//延时时间480usP2_3=1;P2_4=0;Delay_10us(500000);//延时时间480usP2_4=1;P2_5=0;Delay_10us(500000);//延时时间480usP2_5=1;P2_6=0;Delay_10us(500000);//延时时间480usP2_6=1;P2_7=0;Delay_10us(500000);//延时时间480usP2_7=1;}
}

方法三:使用C51自带库文件" intrins.h"文件中的_crol_循环左移函数和_cror_循环右移

函数介绍:_crol_循环左移函数:

形参:value为要移位的无符号字符(8位)shift为移位位数

返回值:循环左移后的结果(unsigned char)。

unsigned char _crol_(unsigned char value, unsigned char shift);

函数介绍:_cror_循环右移函数:

形参:value为要移位的无符号字符(8位)shift为移位位数

返回值:循环右移后的结果(unsigned char)。

unsigned char _cror_(unsigned char value, unsigned char shift);

代码示例:

#include "reg52.h"
#include "intrins.h"
typedef unsigned int u16;
typedef unsigned char u8; 
void Delay_10us(u16 us)//延时函数,形参输入1,延时时间10us
{while(us--);
}
int main()
{u8 i=0;P2=~(0x01);//OLED模块初始化点亮第一个灯while(1){for(i=0;i<7;i++){P2=_crol_(P2,1);//使用左移循环函数Delay_10us(50000);//延时480ms}}
}

流水灯实现效果:

流水灯实现效果


制作不易!喜欢的小伙伴给个小赞赞!喜欢我的小伙伴点个关注!有不懂的地方和需要的资源随时问我哟!

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

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

相关文章

Git 完全手册:从入门到团队协作实战(2)

Hello大家好&#xff01;很高兴我们又见面啦&#xff01;给生活添点passion&#xff0c;开始今天的编程之路&#xff01; 我的博客&#xff1a;<但凡. 我的专栏&#xff1a;《编程之路》、《数据结构与算法之美》、《C修炼之路》、《Linux修炼&#xff1a;终端之内 洞悉真理…

c语言中堆和栈的区别

1.栈区(stack):由编译器自动分配释放&#xff0c;栈主要用于存储局部变量、函数参数、函数调用和返回信息等。其操作方式类似于数据结构中的栈。 2.堆区(heap):一般由程序员分配释放&#xff0c;若程序员不释放&#xff0c;则可能会引起内存泄漏。注堆和数据结构中的堆栈不一样…

华为实验WLAN 基础配置随练

业务vlan 20 192.168.20.x管理vlan 100 192.168.100.x步骤① 网络互通Core sw:vlan batch 20 100 dhcp enable int vlanif 20IP add 192.168.20.1 24dhcp select interfaceinterface GigabitEthernet0/0/1/2port link-type trunkport trunk pvid vlan 100port trunk allow-pas…

CMake 如何查找 Python2和Python3

问题 在一个CMakeLists.txt文件里面看到了下面的这句话 find_package(Python2 COMPONENTS Interpreter Development NumPy)这个好有趣啊&#xff0c;Python2也是一个C的库吗&#xff0c;也有Python2Config.cmake或者FindPython2.cmake? 回答 find_package(Python2 COMPONENTS …

心灵笔记:刻意练习

心灵笔记&#xff1a;刻意练习提要 所有人都以为“杰出”源于“天赋”&#xff0c;而“天才”却说&#xff1a;我的成就源于“正确的练习”&#xff01; 定义&#xff1a;刻意练习是一种有目的、有方法、能带来能力持续提升的结构化训练方式&#xff0c;它并非简单的重复劳动&a…

langchain入门笔记03:使用fastapi部署本地大模型后端接口,优化局域网内的问答响应速度

文章目录前言一、fastapi的简单入门1&#xff1a;安装必要的包&#xff08;python3.11&#xff09;&#xff1a;2&#xff1a;快速搭建一个fastapi&#xff1a;二、提升问答的响应速度1. fastapi部署后端接口&#xff0c;在局域网内访问的方法2. 局域网内的测试&#xff1a;“未…

【CDA 新一级】学习笔记第1篇:数据分析的时代背景

作者&#xff1a;CDA持证人 张九领我们要学习数据分析&#xff0c;就要从当前时代的数据特点&#xff0c;找到在时代特点下企业需要数据分析的痛点&#xff0c;然后理解数据分析在企业中的作用。当前时代&#xff0c;数据分析的特征是哪些呢&#xff1f;我们用VUCA来概括数据分…

Vite 为什么比 Webpack 快?原理深度分析

Hi&#xff0c;我是布兰妮甜 &#xff01;在现代前端开发中&#xff0c;构建工具的性能直接影响开发体验和生产力。Webpack 作为传统打包工具的代表&#xff0c;长期以来主导着前端构建领域&#xff0c;而 Vite 作为新一代的前端构建工具&#xff0c;凭借其出色的开发服务器启动…

数字电路上的通讯速度是越快越好还是越慢越好?

昨天我突发奇想&#xff0c;修改了一下MCU和INA226以及DAC8551的通讯速率。之前的INA226用的是I2C通讯&#xff0c;之前设置的速率是100Kbps&#xff0c;DAC8551是SPI通讯&#xff0c;速率是10Mbps&#xff0c;昨天修改之前输出位置的测试结果如图&#xff1a;可以看到&#xf…

Google Gemini 的深度研究终于进入 API 阶段

Google Gemini 最强大的功能之一是深度研究&#xff0c;但到目前为止&#xff0c;它一直严格限制在 Gemini 界面上。这种情况可能很快就会改变。 通过 Gemini 中的深度研究&#xff0c;您可以搜索几乎任何内容&#xff0c;包括学者、现有研究论文等。 谷歌将深度研究描述为一…

通过beeware制作安卓apk用于获取cpolar网址

我们都知道&#xff0c;没有付费的cpolar用户&#xff0c;要不时更新cpolar网址。每次都要自己登录去获取远程的cpolar个人网址比较麻烦&#xff0c;好在可以用python去自动获取。这里说的是&#xff0c;比如用手机装termux软件&#xff0c;再在termux中装cpolar&#xff0c;然…

Swift 实战:用链表和哈希表写出高性能的贪吃蛇引擎(LeetCode 353)

文章目录摘要描述解决方案解析问题与解决方案关键细节逐条讲示例与运行结果时间复杂度空间复杂度总结摘要 这题的目标是设计一个“贪吃蛇”核心引擎&#xff1a;给定棋盘大小和一串食物位置&#xff0c;支持不断调用 move(direction) 推进游戏&#xff0c;返回当前分数&#x…

2025-08-15:按对角线进行矩阵排序。用go语言,给你一个 n × n 的整数矩阵,要求返回一个按下面规则调整后的矩阵: - 将每一条与主对角线平行的斜线视为一个序列。对于位于主对角线及其下方的

2025-08-15&#xff1a;按对角线进行矩阵排序。用go语言&#xff0c;给你一个 n n 的整数矩阵&#xff0c;要求返回一个按下面规则调整后的矩阵&#xff1a;将每一条与主对角线平行的斜线视为一个序列。对于位于主对角线及其下方的那些斜线&#xff08;即所在位置的行索引 ≥ …

MySQL相关概念和易错知识点(5)(索引、事务、MVCC)

目录1.索引&#xff08;1&#xff09;局部性原理a.局部性原理在计算机中的地位b.pagec.池化技术&#xff08;Buffer Pool&#xff09;&#xff08;2&#xff09;如何理解索引&#xff08;3&#xff09;索引的原理a.page的构成b.多层目录c.基于B树的索引①B树的特性在索引中的作…

SQLite 子查询

SQLite 子查询 SQLite 是一个轻量级的数据库管理系统&#xff0c;广泛应用于移动设备、嵌入式系统和桌面应用。在处理复杂的查询时&#xff0c;子查询&#xff08;Subquery&#xff09;是SQLite数据库查询语言中的一个强大工具。本文将详细介绍SQLite子查询的概念、用法及其在数…

区块链系统审计方法论:全面指南与Python实践

目录 区块链系统审计方法论:全面指南与Python实践 1. 引言 2. 区块链审计框架 3. 智能合约审计关键技术 3.1 静态代码分析 3.2 符号执行(Symbolic Execution) 4. 共识机制审计 4.1 PoW共识验证 4.2 PBFT共识模拟 5. 数据完整性审计 5.1 Merkle树验证 6. 完整审计系统实现 7.…

分布式锁—Redisson的公平锁

1.Redisson公平锁RedissonFairLock概述 (1)非公平和公平的可重入锁 一.非公平可重入锁 锁被释放后&#xff0c;排队获取锁的线程会重新无序获取锁&#xff0c;没有任何顺序性可言。 二.公平可重入锁 锁被释放后&#xff0c;排队获取锁的线程会按照请求获取锁时候的顺序去获取…

上网行为安全概述和组网方案

一、上网行为安全概述1. 背景与需求互联网的双刃剑特性&#xff1a;网络普及改变工作生活方式&#xff0c;业务向互联网迁移。缺乏管理导致风险&#xff1a;带宽滥用、监管困难、信息泄露、网络违法、安全威胁。核心问题&#xff1a;带宽滥用&#xff1a;P2P/流媒体占用70%带宽…

某处卖600的【独角仙】尾盘十分钟短线 尾盘短线思路 手机电脑通用无未来函数

通达信指标【独角仙】尾盘十分钟套装-主图-副图-选古指标&#xff0c;支持手机电脑使用。在股市收盘的前十分钟第二天冲高卖出&#xff0c;信号可以盘中预警也可以尾盘选股&#xff0c;如果要保证信号固定建议是尾盘选股即可&#xff0c;当天信号固定后&#xff0c;不会产生漂移…

日志数据链路的 “搬运工”:Flume 分布式采集的组件分工与原理

flume详解&#xff1a;分布式日志采集的核心原理与组件解析 在大数据体系中&#xff0c;日志采集是数据处理的第一步。Flume 作为 Apache 旗下的分布式日志采集工具&#xff0c;以高可用、高可靠、易扩展的特性&#xff0c;成为处理海量日志数据的首选方案。本文将从 Flume 的…