1

【51单片机】点亮LED灯(四种形式)_3月月更_泽En_InfoQ写作平台

 2 years ago
source link: https://xie.infoq.cn/article/ee894a62c4a3080a9a76f67c1
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

​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 拆开来 = 1010^2,那么 473 呢?也是一样 473 = 4710^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 <REGX52.H>int main(void){  P2=0xFE;  //1111 1110  while(1)  {  }}
  1. 双斜杠:其实就是把后面的内容给注释掉,编译器是不会看的是留给我们编程序的人来看的,这个就是单行注释。/* 注释内容 */这个是多行注释。

  2. P2 = 0xFE,P2 当中的 0x:是一个前缀,代表后面的是十六进制数。

  3. FE 就是十六进制我们把 1111 1110 转换成十六进制。

  4. #include <REGX52.H>这个是我们单片机的头文件,在上面代码中如果没有这个头文件的话,我们的程序就无法去识别 P2 口了。

  5. while 循环在这里的作用是:其实就是一直绕着这个圈跑来跑去,这样就不用一直从 main 主函数那里走来走去了。表达式的值为真(1)它就会一直去执行里面是一个逻辑表达式的值也就是判断条件和表达式的值为真还是为假,非 0 即使真。

  6. 那么就是程序下载到 STC 系列的单片机下载软件上去就可以了。

那么如果我们想要控制 LED 灯 亮灭亮灭 亮灭亮灭 怎么办呢?其实很容易。

P2 = 0x55;// 0101 0101        其它保持不变这样就可以了😁

😮程序下载

  1. 选择单片机的型号,现在用的单片机的型号是 STC89C52RC,注意:不要选错了。

  2. 单击"打开程序文件",打开建立工程的那个文件夹,找到 xxx.hex 文件,单击打开。

  3. 选择刚才查到的 COM 入口,波特率使用默认就可以了。

  4. 这里的所有选项都选择默认设置,不要随意更改,有的选项错误可能会导致麻烦。

  5. 因为 STC 单片机要冷启动下载的,就是我们先点击下载,然后你再给你的单片机上电,所以先要关闭板子的电源开关,然后再单击 Download 按钮,等待软件提示你上点后,再按下板子的电源开关,就可以下载到单片机里了。

😏LED 灯闪烁

介绍:点亮 LED 小灯的程序就是让 LED = 0(低电平)。熄灭小灯的程序也是非常容易的,就是 LED = 1(高电平)。这样点亮和熄灭都会了,那么如果在亮和灭之间加个延迟呢,反复不停的点亮和熄灭小灯,那么就可以实现这个 LED 灯闪烁了。

这里解答大家可能会有的疑问:

  1. LED 灯为什么是低电平亮: LED 具有单向导电性,当 LED 的正端接了高电位,负端连接了低电位,且正负端电位差超过 1.8V 以上时,LED 就会亮起来。

  2. 为什么 LED 灯闪烁要加延迟: 因为在单片机当中每次都是以 MHZ(也就是运行上百万次),所以它们就会执行的特别快。那么就会闪烁的特别快,以我们人类的肉眼是根本看不出来的,所以需要延迟函数。

  3. 怎么样才能反复不停的亮和灭: 这个很容易加上 while 循环,循环的表达式的值为真"1"

  4. 延迟函数的程序: 点击软件生成延时器(在 STC-ISP 中)它可以生成代码来帮助我们,延时函数当中的系统频率也就是晶振要注意一下,我的是 12MHZ 的。还有 8051 的指令集也要改一下:SCY-Y1。这个时候我们只需要复制代码、生成代码、即可生成函数。然后在主函数前面右键点击 Paste(ctrl+v)粘贴就可以了。

  5. 这里说下我们提到的晶振:晶振又被称之为晶体震荡器,从这个名字就可以看出来,它注定一声都要不停的振荡它起到的作用是:单片机当中的系统提供的一个基准信号,类似于部队的训练时候喊口号的人,单片机的内部所有的系统都是以这个时钟型号为基准的来进行着工作。实际作用:利用一种能将电能和机械能相互转换的晶体,在公振的状态下工作可以提供一个稳定精确的单频震荡。

#include <REGX52.H>#include <INTRINS.H>    //_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 <REGX52.H>#include <INTRINS.H>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 <REGX52.H>void Delay1ms(unsigned int xms);  //@12.000MHzvoid 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);  }}

About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK