当前位置: 首页 > 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.lryc.cn/news/621021.html

相关文章:

  • 广义矩估计随机近似中公式(2d)的推导
  • Linux入门DAY24
  • Python中的函数入门二
  • 小白做亚马逊广告,空烧成本不出单怎么办
  • 20道JavaScript进阶相关前端面试题及答案
  • DataHub IoT Gateway:工业现场设备与云端平台安全互联的高效解决方案
  • Git 中切换到指定 tag
  • 电子电路学习日记
  • 嵌入式Linux学习-编译内核源码
  • 17 ABP Framework 项目模板
  • 微信公众号推送文字消息与模板消息
  • ActionChains 鼠标操作笔记
  • 恐鬼症 单机+联机(Phasmophobia)免安装中文版
  • SQL181 第二快/慢用时之差大于试卷时长一半的试卷
  • 【昇腾】VirtualBox虚拟机下搭建Ubuntu 22.04环境给TF卡制卡报读写IO错误的问题处理_20250814
  • 自动化测试|持续集成Git使用详解
  • elasticsearch冷热数据读写分离!
  • 快速搭建python HTTP Server测试环境
  • gitlab的ci/cd变量如何批量添加
  • STL算法【常用的算数生成算法】
  • 分享10个ai生成ppt网站(附ai生成ppt入口)
  • 力扣top100(day03-02)--图论
  • 回流(Reflow)与重绘(Repaint):浏览器渲染性能优化核心
  • SpringMVC请求与响应
  • 【Linux】库制作与原理
  • PyTorch回忆(三)U-net
  • java 学习 贪心 + 若依 + 一些任务工作
  • FTP服务器搭建(Linux)
  • opencv:傅里叶变换有什么用?怎么写傅里叶变换?
  • 软件著作权产生与登记关键点