【51单片机】点亮LED灯(四种形式)
Hello,各位小伙伴们大家好。我是泽En,今天就带大家来学习51单片机的如何点量LED灯。
🤗LED介绍
中文名:发光二极管。
英文名:Light Emitting Diode。
简称:LED。
应用:LED显示屏、交通信号灯、广告灯、液晶屏背光源等。
特点:节能是LED灯最突出的特点、环保、跟其它的灯光源相比之下,LED灯会更加"干净"(干净不是指的是表面,而是这个LED灯它其实是属于一种冷光源)、响应速度快等。

二极管灯在电路图当中所表示的一个符号,在电路图当中左边是正极、右边是负极。
在LED当中只有正极接入正极,负极接入负极它才会有电流流通进去。

这个是二极管实物里面的一些知识点
51开发板用的是普通的贴片发光的二极管,这种二极管通常是正向导通电压1.8~2.2V。
工作电流一般在1~20mA。其中,当电流在1~5mA变化的时候,随着通过LED的电流越大,人们的肉眼会明显的感觉到这个灯越来越亮,而当电流处于5~20mA变化时候,看到的发光二极管的亮度变化就不太明显了。当电流超过20mA时候,LED灯就会有烧坏的危险了。
电流越大,烧坏的速度也就会变快。所以,在使用过程当中应该要特别区注意它的电流参数上面的设计要求,这很重要。
🤔LED原理图

这里的VCC就是电源的正极,左边红色的字其实就是一个网络的一个标号也被称之为网络编号,这里的引脚低电平这个LED灯才是亮的。
那我们可以看下正极出来之后,通过一个电阻(这个电阻其实是④个一体的),那么这上面说电阻是1kΩ的是怎么样看出来的,其实就是我们仔细看单片机开发板上的RP9和RP10上面都有个数字是102。那么其实原理图上写的102就是1000Ω,前面两位数是一个有效数字10,第三位数字就是倍率00。其实102拆开来 = 10
10^2,那么473呢?也是一样473 = 47 10^3 = 47 000 = 47k,1001 = 1000 = 1k。这就是电阻的一个读数的方式包括电容啊以及其它的一些元器件其实一个这样的一个方式来的。那我们继续看到这个图纸经过这个电阻,这个电阻在这里的作用是起到一个限流的作用,从而这个电阻也被称作是:限流电阻。就比如说假设VCC = 5V,LED 直接 5V 的话,由于电流过大会把这个LED灯给烧毁。所以在这里的串联电阻就很好的起到了一个限流的作用。而到达LED已经接入到正极了,那么LED负极在接入的话。此时LED灯就将会点亮了,高低电平的一个应用。高电平就是5V,低电平就是0V,单片机把这种电平叫做TTL电平。P2口决定了你的高低电平,也就是CPU通过配置这些控制的寄存器来控制我们的硬件电路来执行我们想要去完成的一个功能!
😎如何控制IO口输出高低电平
首先要有一个单片机是MCU那么单片机里面就有一个CPU(代码都是在这里面执行的),我们外部都是有引脚都是P2口的引脚。那么CPU是怎么样控制引脚的呢?那么就要说说寄存器里面其实就是存储器以八个为一组的,就比如说是单片机里面就有一个寄存器它是P2口的寄存器,那么它就有八位每一位背后都有一根导线在通过驱动器增大它的电流,然后在连到我们这个IO口的端口上后面其实也都是一样的。这种东西就叫做是驱动器。那么我们的CPU可以通过我们的这个软件直接访问我们的这个寄存器:假设我们给它写①那么我们这个就可以通驱动器就可以给我们的IO口置高电平,那么如果是写零的话那么我们的IO口就是低电平0,同理。给高低电平是不是就是给P2口当中转换的寄存器,我们的硬件电路都是这个样子的。
一句话就是说:CPU通过配置这些控制的寄存器来控制我们的硬件电路,硬件电路来执行我们想要去完成的功能
🤨进制转换
那么如果我们要让第一个LED灯点亮,其余的全是灭的话该怎么办。很简单给第一个LED灯低电平0,其余的LED都给上一个高电平1。这样你的LED灯就可以实现点亮第一个了。
P2 = 1111 1110 这种写法是❌(因为它会默认你是十进制) , P2 = 0xFE 这样才是✔。
所以这里就会遇到一个问题进制的转换,只是需要把二进制转换成十六进制就可以了 。
🤩点亮一个LED代码
#include
int main(void)
{
P2=0xFE; //1111 1110
while(1)
{
}
}
那么如果我们想要控制LED灯 亮灭亮灭 亮灭亮灭 怎么办呢?其实很容易。
P2 = 0x55;// 0101 0101 其它保持不变这样就可以了😁
😮程序下载
😏LED灯闪烁
介绍:点亮LED小灯的程序就是让LED = 0(低电平)。熄灭小灯的程序也是非常容易的,就是LED = 1(高电平)。这样点亮和熄灭都会了,那么如果在亮和灭之间加个延迟呢,反复不停的点亮和熄灭小灯,那么就可以实现这个LED灯闪烁了。
这里解答大家可能会有的疑问:
#include
#include //_nop_();需要的头文件
void Delay500ms() //@12.000MHz
{
unsigned char i, j, k;
_nop_();
i = 4;
j = 205;
k = 187;
do
{
do
{
while (--k);
} while (--j);
} while (--i);
}
int main(void)
{
while(1)
{
P2=0xFE; //1111 1110
Delay500ms(); //调用函数
P2=0xFF; //1111 1111
Delay500ms(); //调用函数
}
}
😁LED流水灯
前面学习了点亮一个LED灯又学了LED小灯闪烁,现在我们就可以进一步的去学习让LED灯依次一个接上一个的开始亮起来,也就是我们常常说的流水灯的实现了。
通过下面的这个程序我们不难看出来,可以通过P2来控制所有的8个LED灯的亮灭状态。从下面的程序当中我们可以看出依次给P2赋值的是:0xFE、0xFD、0xFB、0xF7、0xEF、0xDF、0xBF、0x7F
#include
#include
void Delay500ms() //@12.000MHz
{
unsigned char i, j, k;
_nop_();
i = 4;
j = 205;
k = 187;
do
{
do
{
while (--k);
} while (--j);
} while (--i);
}
int main(void)
{
while(1)
{
P2=0xFE;//1111 1110
Delay500ms();
P2=0xFD;//1111 1101
Delay500ms();
P2=0xFB;//1111 1011
Delay500ms();
P2=0xF7;//1111 0111
Delay500ms();
P2=0xEF;//1110 1111
Delay500ms();
P2=0xDF;//1101 1111
Delay500ms();
P2=0xBF;//1011 1111
Delay500ms();
P2=0x7F;//0111 1111
Delay500ms();
}
}
😃LED流水灯高阶操作
为什么说这个是高阶操作呢?是因为这个程序我们想让流水灯延迟多少行秒就可以延迟多少行秒,注意这个延迟毫秒并不只是改变之前延迟500ms,它是可以在每个延迟函数阶段,分别延迟出不同的速度,上面的这样一开仿佛就单一,而这个是进行变化的。
#include
void Delay1ms(unsigned int xms); //@12.000MHz
void Delay1ms(unsigned int xms) //@12.000MHz
{
unsigned char i, j;
while(xms)
{
i = 2;
j = 239;
do
{
while (--j);
} while (--i);
xms--;
}
}
int main(void)
{
while(1)
{
P2=0xFE;//1111 1110
Delay1ms(1000);
P2=0xFD;//1111 1101
Delay1ms(900);
P2=0xFB;//1111 1011
Delay1ms(800);
P2=0xF7;//1111 0111
Delay1ms(700);
P2=0xEF;//1110 1111
Delay1ms(600);
P2=0xDF;//1101 1111
Delay1ms(500);
P2=0xBF;//1011 1111
Delay1ms(300);
P2=0x7F;//0111 1111
Delay1ms(100);
}
}