当前位置: 首页 > 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.dtcms.com/a/331319.html

相关文章:

  • 【C#】Region、Exclude的用法
  • 无需公钥的无损加密解密
  • 深入详解C语言数组:承上启下——从C语言数组基础到数据结构衔接
  • 码上爬第八题【协程+ob混淆】
  • 【Java虚拟机】JVM相关面试题
  • 2025天府杯数学建模C题
  • 2025天府杯数学建模A题分析
  • 智能门锁:安全与便捷的现代家居入口
  • 第1节 从函数到神经网络:AI思路的逆袭之路
  • Mybatis学习笔记(八)
  • VS2022 C++生成和调用DLL动态链接库
  • 小杰python高级(six day)——pandas库
  • 自由学习记录(84)
  • nnDetection在windows系统下使用教程
  • 4.Ansible部署文件到主机
  • Torch -- 卷积学习day2 -- 卷积扩展、数据集、模型
  • Linux软件编程(四)多任务与多进程管理
  • 机械硬盘模块逻辑与工作原理
  • 某处卖600的【独角仙】尾盘十分钟短线 尾盘短线思路 手机电脑通用无未来函数
  • uniapp对接极光消息推送
  • 【CLR via C#(第3版)阅读笔记】类型基础
  • [特殊字符]走进华为,解锁商业传奇密码
  • K8s学习----Namespace:资源隔离与环境管理的核心机制
  • 渲染 opentype 多个字符的文本,并设置文本的渲染开始位置
  • Warm-Flow 1.8.0 重大更新
  • Lua 脚本在 Redis 中的应用
  • vivo Pulsar 万亿级消息处理实践(4)-Ansible运维部署
  • 河南萌新联赛2025第(五)场:信息工程大学补题
  • 飞书文档定时自动同步至百炼知识库
  • ESP32 I2S音频总线学习笔记(六):DIY蓝牙音箱教程