本文所用的单片机是普中51A2套件
一、LED介绍
1.1 结构
LED灯,即发光二极管,是一种固态的半导体器件,其核心是一个PN结。LED灯的结构相对简单,主要由PN结芯片、电极和光学系统组成。
1.2 发光原理
LED灯的发光原理基于半导体材料的特性。当给LED的PN结加上正向电压时,由于PN结的内建电场作用,N区的电子会被推向P区,在P区与空穴复合,同时P区的空穴也会被推向N区,在N区与电子复合。这一过程中,电子和空穴的复合会释放出能量,这些能量以光子的形式发出,从而实现了LED的发光。
具体来说,LED的发光过程包括以下几个步骤:
- 载流子注入:在外加电压的作用下,电子从N区注入P区,空穴从P区注入N区。
- 载流子复合:注入的电子和空穴在PN结附近复合,形成电子-空穴对。
- 能量释放:电子-空穴对复合时,会以光子的形式释放出能量,这些光子的波长决定了LED发出的光的颜色。
1.3 封装
LED灯的封装方式多种多样,常见的封装方式包括DIP(双列直插式封装)、SMD(表面贴装式封装)和COB(板上芯片封装)等。这些封装方式各有特点,适用于不同的应用场景。
- DIP封装:DIP封装是最早的LED封装方式之一,其特点是将LED芯片封装在一个具有两个长引脚的塑料或金属外壳中,可以直接插入到电路板的孔洞中。DIP封装的LED灯具有安装方便、成本低廉等优点,但体积较大,不适合高密度集成。
- SMD封装:SMD封装是一种表面贴装式封装方式,其特点是将LED芯片直接封装在一个微小的金属或塑料基板上,并通过引脚或焊盘与电路板连接。SMD封装的LED灯具有体积小、重量轻、亮度高、散热性能好等优点,广泛应用于手机、显示器、照明等领域。
- COB封装:COB封装是一种将多个LED芯片直接封装在一个小型电路板上的封装方式。与DIP和SMD封装相比,COB封装具有更高的发光效率和更好的光均匀性,适用于大功率照明和背光显示等领域。
1.4 使用
下面是LED的电路符号,左边是阳极,右边是阴极。
LED具有单向导电性,阳极接正电压,阴极接负电压或接地时LED点亮。
二、原理图
下图为开发板上LED模块的电路图,如图所示,8个LED灯阳极接入VCC,阴极各接入一个电阻,此处的电阻起到的作用是限流,防止通路上的电流过大而烧毁LED,在电阻的右端,分别连接P20-P27接口。
在原理图的单片机核心部分,我们可以看到上述的P20-P27端,与单片机的P2.0-P2.7连接。
通过分析电路硬件图以及原理图,我们得到相应的操作,要是LED(以D1为例)发亮只要使得阴极处于低电平就能够点亮。那么现在的目标就是使P2.0端口输出低电平即可,将问题转化为控制单片机引脚输出高低电平的问题。
在单片机中,CPU通过控制相关寄存器,寄存器通过驱动器来控制某个端子的高低电平,这也就是说,我们只要配置相应的CPU寄存器(P2寄存器)来实现我们的功能。
P2寄存器是一个八位寄存器,每个位分别控制一个LED灯,当某个位为0时(低电平)相应的LED灯就会发亮。也就是说当P2寄存器为1111 1110时D1点亮。
三、点亮任意一个LED灯
3.1 代码示例
以点亮D1为例,只需使P2寄存器的为1111 1110即可,用十六进制表示为0xfe
#include <REGX52.H>
void main()
{
P2=0xfe;//1111 1110
while(1)
{
}
}
3.2 实验现象
四、LED灯闪烁
4.1 代码示例
使D1亮点一会儿,熄灭一会儿。其中的Delay500ms是通过STC-ISP设置相关参数得来的
#include <REGX52.H>
#include<INTRINS.H>
void Delay500ms(void) //@12.000MHz
{
unsigned char data i, j, k;
_nop_();
i = 4;
j = 205;
k = 187;
do
{
do
{
while (--k);
} while (--j);
} while (--i);
}
void main()
{
while(1)
{
P2=0xfe; //1111 1110
Delay500ms(); //ÑÓʱ500ms
P2=0xff; //1111 1111
Delay500ms();
}
}
4.2 实验现象
<iframe allowfullscreen="true" data-mediaembed="csdn" frameborder="0" id="C1Ca9zOe-1722353772907" src="https://live.csdn.net/v/embed/413847"></iframe>led闪烁
五、流水灯
5.1 for循环实现
实现左到右依次点亮
#include <REGX52.H>
#include<INTRINS.H>
typedef unsigned char u8;
void Delay500ms(void) //@12.000MHz
{
u8 i, j, k;
_nop_();
i = 4;
j = 205;
k = 187;
do
{
do
{
while (--k);
} while (--j);
} while (--i);
}
void main()
{
u8 i=0;
while(1)
{
for(i=0;i<8;i++)
{
P2=~(0x01<<i); //i=0,D1亮
Delay500ms();
}
}
}
其中值得注意的是这行代码P2=~(0x01<<i) 由于<<会使移丢的低位补0,所以采用~,可以自己例举一下就能明白了
<iframe allowfullscreen="true" data-mediaembed="csdn" frameborder="0" id="XfSojJSe-1722353793536" src="https://live.csdn.net/v/embed/413849"></iframe>流水灯1
5.2 左移和右移库函数实现
用左移能够实现从左到右依次点亮,右移函数能从右到左点亮
#include <REGX52.H>
#include <INTRINS.H>
typedef char u8;
void Delay500ms(void) //@12.000MHz
{
u8 i, j, k;
_nop_();
i = 4;
j = 205;
k = 187;
do
{
do
{
while (--k);
} while (--j);
} while (--i);
}
void main()
{
u8 i;
P2=0xfe;
Delay500ms();
while(1)
{
for(i=0;i<7;i++)
{
P2=_crol_(P2,1);
Delay500ms();
}
for(i=0;i<7;i++)
{
P2=_cror_(P2,1);
Delay500ms();
}
}
}
<iframe allowfullscreen="true" data-mediaembed="csdn" frameborder="0" id="kurJz9rL-1722353810164" src="https://live.csdn.net/v/embed/413850"></iframe>
流水灯2
标签:P2,封装,--,void,51,单片机,while,LED From: https://blog.csdn.net/2302_77770138/article/details/140783018