当前位置: 首页 > news >正文

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.xdnf.cn/news/1296523.html

相关文章:

  • 机器视觉之图像处理篇
  • 相较于传统AR作战环境虚拟仿真系统,其优势体现在哪些方面?
  • Flutter 顶部导航标签组件Tab + TabBar + TabController
  • 读From GPT-2 to gpt-oss: Analyzing the Architectural Advances
  • 线上故障定位:从报警到根因的实战指南
  • 计算机如何进行“卷积”操作:从图像到矩阵的奥秘
  • 设计模式笔记_行为型_责任链模式
  • [机器学习]08-基于逻辑回归模型的鸢尾花数据集分类
  • 高分辨率PDF压缩技巧:保留可读性的最小体积方案
  • 通过网页调用身份证阅读器http websocket方法-华视电子————仙盟创梦IDE
  • 【数据结构初阶】--排序(一):直接插入排序,希尔排序
  • MySQL的索引(索引的创建和设计原则):
  • 并发编程 - 读写锁(ReentrantReadWriteLock)的探究
  • JVM的逃逸分析深入学习
  • T05_卷积神经网络
  • 消费级显卡分布式智能体协同:构建高性价比医疗AI互动智能体的理论与实践路径
  • TypeScript 中,! 是 非空断言操作符
  • 上网行为安全概述和组网方案
  • EN 61010电子电气设备安全要求标准
  • 抗辐照CANFD通信芯片在高安全领域国产化替代的研究
  • 从根源到生态:Apache Doris 与 StarRocks 的深度对比 —— 论开源基因与长期价值的优越性
  • Gemma 3 多模态推理 通过vllm运行Gemma-3-27B-IT模型的推理服务
  • NineData云原生智能数据管理平台新功能发布|2025年7月版
  • 基于U-NET遥感影像语义分割任务快速上手
  • git upstream
  • 流式数据服务端怎么传给前端,前端怎么接收?
  • 入门概述(面试常问)
  • vercel部署上线
  • 【数据分享】351个地级市农业相关数据(2013-2022)-有缺失值
  • 数智先锋 | 告别运维黑盒!豪鹏科技×Bonree ONE构建全栈智能可观测体系