本章思维导图:
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}}
}
流水灯实现效果:
流水灯实现效果
制作不易!喜欢的小伙伴给个小赞赞!喜欢我的小伙伴点个关注!有不懂的地方和需要的资源随时问我哟!