51单片机入门——控制LED灯

发布者:xxoke624最新更新时间:2022-06-15 来源: eefocus关键字:51单片机  入门  LED灯 手机看文章 扫描二维码
随时随地手机看文章

1. LED

1.1.什么是LED?

LED(light-emitting diode),即发光二极管,俗称LED小灯,是一种由磷化镓(GaP)等半导体材料制成的、能直接将电能转变成光能的发光显示件。当LED内部有一 定电流通过时,它就会发光,不同LED能发出不同颜色的光,常见的有红色、黄色等,如图:


在这里插入图片描述

关于LED外形特征主要说明下列几点。

(1)单色LED的外壳颜色表示了它的发光颜色。LED的外壳是透明的。

(2)单色LED只有两根引脚,这两根引脚有正、负极之分。多色的LED为 3 根引脚。

(3)LED外形很有特色,所以可以方便地识别出LED。


1.2.LED的种类

在这里插入图片描述

1.3.LED的主要参数

电参数:

(1)正向工作电流IF。它是指发光二极管正常发光时的正向电流值。发光二极管工作电流一般为 10~20mA。

(2)正向工作电压UF。它是在给定正向电流下的发光二极管两端正向工作电压。一般是在 IF=20mA 时测量,发光二极管正向工作电压为 1.4~3V 。外界温度升高时,发光二极管正向工作电压会下降。

(3)伏 - 安特性。它是指发光二极管电压 与电流之间的关系。


极限参数:

(1)允许功耗 Pm。它是允许加于发光二极管两端正向直流电压与流过它的电流之积的最大值,超过此值时发光二极管发热、损坏。

(2)最大正向直流电流 IFm。它是允许加的最大正向直流电流,超过此值会损坏二极管。

(3)最大反向电压 URm。它是所允许加的最大反向电压,超过此值发光二极管可能被击 穿损坏。

(4)工作环境 topm。它是发光二极管可正常工作的环境温度范围。低于或高于此温度范围,发光二极管将不能正常工作,效率大大降低。


1.4.LED的主要特性

伏 - 安特性

LED与普通二极管的伏 - 安特性相似,只是LED的正向导通电压值较大。 小电流LED的反向击穿电压很小,为 6V 至十几伏,比普通二极管的小。下图所示是LED正向伏 - 安特性曲线。

在这里插入图片描述

下图是LED伏 - 安特性曲线, 它含正向和反向特性。LED具有与一般半导体三极管相似的输入伏 - 安特性曲线。

在这里插入图片描述

关于伏 - 安特性曲线各区段说明如下。

(1)OA 段。这是正向死区。UA 为开启LED发光的电压。

(2)AB 段。这是工作区。在这一区段, 一般是随着电压增加电流也跟着增加, 发光亮度也跟着增大。


在这个区段内要特别注意,如果不加任何保护,当正向电压增加到一定值后, 那么LED的正向电压减小,而正向电流加大。 如果没有保护电路,会因电流增大而烧坏LED。


(3)OC 段。这是反向死区,发光二极管加反向电压是不发光的(不工作),但有反向电流。这个反向电流通常很小,一般在几微安之内。在 1990~1995 年,反向电流定为 10μA; 在 1996~2000 年,反向电流定为 5μA,目前反向电流一般是在 3μA 以下,但是基本上是 0μA。

(4)CD 段。这是反向击穿区,LED的反向电压一 般不要超过10V,最大不得超过 15V。超过这个电压,就会出现反向击穿,导致发光二极管报废。


在这个区段,LED存在较大的反向击穿电流(为几毫安)。这种击穿不是热击穿,不会损坏,一部分交流插座、 交流电源开关上的交流指示灯就是采用LED,在交流电的负半周期间LED就是工作在这一区段。


正向电阻和反向电阻特性

LED正向和反向电阻均比普通二极管的大得多,了解这一点对检测二极管有重要指导意义。


工作电流与发光相对强度关系

下图所示是发光二极管工作电流与发光相对强度关系特性曲线。对于红色LED 而言,正向工作电流增大时发光相对强度也在增大,当工作电流大到一定程度后,曲线趋于平坦(饱和),说明发光相对强度趋于饱和;对于绿色LED而言,工作电流增大,发光相对强度增大,但是没有饱和现象。

在这里插入图片描述

发光强度与环境温度关系

下图所示是发光二极管发光强度与环境温度关系特性曲线。温度愈低,发光强度愈大。 当环境温度升高后,发光强度将明显下降。

在这里插入图片描述

5.最大允许工作电流与环境温度关系

下图所示是最大允许工作电流与环境温度关系特性曲线。当环境温度大到一定程度后, 最大允许工作电流迅速减小,最终为零,说明在环境温度较高场合下,LED更容易损坏,这也是LED怕烫的原因。

在这里插入图片描述

6.其他特性曲线

在这里插入图片描述

1.5.LED引脚极性识别方法

为了不影响LED的正常发光, 在外壳上不标出型号和极性。所以识别LED正、负引脚主要靠外形特征和万用表的检测来进行。


引脚长短识别方法

下图是用引脚长短区别正、负极性引脚的LED,它的两根引脚一长一短, 长的一根是正极,短的为负极。

在这里插入图片描述

突键方式识别方法

下图所示是突键方式表示正极性引脚方法,LED底座上有一个突键,靠 此键最近的一根引脚为正极。

在这里插入图片描述

3 根引脚LED引脚识别方法

下图所示是一种 3 根引脚LED引脚分布规律和内电路示意图。内设两只不同 颜色发光二极管。K 为共同引脚。

在这里插入图片描述

下图是另一种 3 根引脚的变色LED引脚识别方法示意图,它有一个突键,根据它的这一外形特征可以方便地确定各引脚。

在这里插入图片描述

6 根引脚LED引脚识别方法

下图所示是 6 根引脚LED引脚分布规律和内电路示意图。它内有两组 3 根引脚的LED。

在这里插入图片描述

1.6.电压控制型和闪烁型LED

电压控制型LED

LED本身属于电流控制型器件,即有电流流过时它会发光,在使用时需串接适当阻值的限流电阻,为了使用的方便将LED和限流电阻制作为一体,使用时可直接并接在电源两端,这样形成了电压控制型LED。下图所示是电压控制型LED实物图和内电路。 电压控制型LED的发光颜色有红、 黄、绿等,工作电压有 5V、9V、12V、18V、 19V、24V 共 6 种规格,常用的是 BTV 系列。

在这里插入图片描述

闪烁型LED

闪烁型LED是一种由 CMOS 集成电路和LED组成的特殊发光器件。下图所示是闪烁型LED实物图和内电路,它可用于报警指示及欠压、超压指示等。

在这里插入图片描述

下图是闪烁型LED内电路方框图。闪烁型LED在使用时,无须外接其他元器件,只要在其引脚两端加上适当的直流工作电压(5V)即可闪烁发光,常用的闪烁型发光二极管是 BTS 系列。

在这里插入图片描述

2.单片机控制LED

写了那么多的LED介绍,我们对LED应该有了一个清楚的认识,现在我们开始对单片机编写程序来控制LED。


2.1.点亮一个LED

2.1.1程序的编写

首先我们在Proteus 8 Professional中搭建一个如图所示的电路原理图


在这里插入图片描述

图中的R1为限流电阻,防止电流过大导致LED损坏。


然后开始写程序。如果学过c语言的话,应该可以轻松编程,如果没有学过的话也没关系,先照着抄。


#include


sbit LED = P2^3 ;     // 位地址的声明 ,注意:sbit 必须小写 ,P必须大写


void main()  // 任何一个c程序都必须有且仅有一个 main 函数

{  // {} 是成对出现的,在这里表示程序的起始和结束

LED = 0 ;  // 分号表示一条语句结束,"1"表示高电平,"0" 表示低电平

}


先对程序的语法进行分析:

(1)main 是主函数的函数名字,每个c程序都必须有且仅有一个 main 函数。

(2)void 是函数的返回类型,本程序没有返回值,用void 表示。

(3){} 在这里是函数开始和结束的标志,不可省略。

(4)每条c语句以分号(;)结束。

从逻辑上来看,程序这样写就搞定了,但是在实际单片机应用中会存在一个问题。比如程序空间可以容纳1000行代码,但是实际上的程序只用了100行代码,当运行完了100行,在继续运行下去时,第101行的程序不是自己想运行的程序,而是一个未知内容,一旦执行下去程序可能会出错,从而可能导致单片机自动复位,所以通常在程序中加入一个死循环,让程序停留在所希望的这个状态下,不要乱运行,有下列两种方法可以参考:

方法一:


#include


sbit LED = P2^3 ;


void mian()

{

while(1)

{

LED = 0 ;

}

}


方法二:


#include


sbit LED = P2^3 ;


void mian()

{

LED = 0 ;

while(1) ;

}


程序(1)的功能是不断反复的执行"LED = 1"这句语句,程序(2)的功能是在执行完"LED = 1"后停下来等待。


2.1.2程序的编译

程序编写好后,要对程序进行编译,生成.hex文件就可以将程序烧录到单片机里面,在编译之前,需要先勾选一个选项,单击工程(Project)-> 为目标“目标1”设置选项…(Options for Target ‘Target1’…)如图:

在这里插入图片描述

或者直接点击如图所示的框内的快捷图标

在这里插入图片描述

在弹出的对话框中,单击Output选项页,勾选其中的Create HEX File ,然后单击确定(OK)按钮即可,如图:

设置好之后,单击工程(Project)-> 编译(rebuild all target files) ,或单击下图所示的快捷图标即可

编译完成之后,在Keil下方的输出(Output)窗口会出现相应的提示,如图:

data = 9.0,指的是程序使用了单片机内部256字节RAM资源中的9个字节。

code = 18 的意思是使用了8K代码Flash 资源中的18个字节。

当提示“ 0 Error(s) ,Warning(s) ”表示程序没有错误和警告,就会出现“ creating hex file from “LED”… ”,意思是从当前工程中生成了一个HEX文件,要下载到单片机上的就是这个HEX文件。如果出现有错误和警告的提示的话,就是 Error 和 Warning 不是0,那么就要对程序进行检查,找出了问题,解决好了再进行编译产生 HEX 才可以。

到此,程序就编译成功了,之后就是把程序烧录到单片机里面。


2.1.3.程序的烧录

如果没有硬件设备的小伙伴可以使用Proteus 8 Professional来对程序进行模拟仿真。

在Proteus 8 Professional中双击需要烧录程序的单片机,点击文件夹的图标,找到编译的 . hex 文件,点击打开即可,如图:


在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

然后即可开始仿真。


如果有硬件设备的小伙伴,可以使用 STC-ISP ——STC系列单片机下载软件,将程序烧录到开发板中,如图:

注意:因为STC系列单片机需要冷启动下载(就是先点击下载,然后再给单片机供电),所以先关闭开发板上的电源开关,然后单击下载(Download)按钮,再给开发板上电,就可以把程序烧录到单片机里面了。

在这里插入图片描述

上图显示操作成功即表示程序已经烧录到单片机里面了。

在这里插入图片描述

上图为仿真软件中的仿真结果。

至此,点亮一个LED的实验就完成了。


2.2.闪烁灯

在2.1.中点亮一个LED就是令“LED = 0”即可,熄灭一个LED的程序也很简单就令“LED = 1”。现在熄灭和点亮都会了,那么如何让LED闪烁呢?也很简单,在点亮后延迟几秒再熄灭,不断重复即可。


2.2.1.延时函数

实现延时通常有两种方法:一种是硬件延时,要用到定时器/计数器,这种方法可以提高CPU的工作效率,也能做到精确延时;另一种是软件延时,这种方法主要采用循环体进行。在此我们主要研究软件延时。


在很多情况下,定时器/计数器经常被用作其他用途,这时候就只能用软件方法延时。下面介绍几种软件延时的方法。

方法一:

短暂延时:可以在C文件中通过使用带_NOP_( )语句的函数实现,定义一系列不同的延时函数,如Delay10us( )、Delay25us( )、Delay40us( )等存放在一个自定义的C文件中,需要时在主程序中直接调用。如延时10 μs的延时函数可编写如下:


void Delay10us()

{

_NOP_( ) ;

_NOP_( ) ;

_NOP_( ) ;

_NOP_( ) ;

_NOP_( ) ;

_NOP_( ) ;

}


Delay10us( )函数中共用了6个_NOP_( )语句,每个语句执行时间为1 μs。主函数调用Delay10us( )时,先执行一个LCALL指令(2 μs),然后执行6个_NOP_( )语句(6 μs),最后执行了一个RET指令(2 μs),所以执行上述函数时共需要10 μs。

方法二:

循环空语句延时:在程序中编写一个空的循环语句,让单片机在空循环中“发呆”。编写大约1ms的代码如下:


void delay_ms(int n)

{

int i , j ;

for( i = 0 ; i < n ; i ++ )

{

for( j = 0 ; j < 123 ; j ++) ;

}

}


在 n 为1时,该代码大概运行1ms左右。

该延时方法在非精确延时是最常用的方法。

或者两者都使用:


void Delay1ms()//@11.0592MHz 晶振为11.0592MHz

{

unsigned char i, j;


_nop_();

i = 2;

j = 199;

do

{

while (--j);

} while (--i);

}


2.2.2.闪烁灯的实现

我们已经掌握了延时函数的写法,就可以开始写闪烁灯了。

电路原理图和2.1的一样,代码如下:


#include


sbit LED = P2^3;     // 位地址的声明 ,注意:sbit 必须小写 ,P必须大写


void delay_ms(int n)  // 延时函数 大概延时 n ms

{

int i , j ;  // 定义两个整型变量 i,j

for( i = 0 ; i < n ; i ++ )

{

for( j = 0 ; j < 123 ; j ++ ) ; 

}

}


void main()  // 任何一个c程序都必须有且仅有一个 main 函数

{  // {} 是成对出现的,在这里表示程序的起始和结束

while(1)

{

LED = 1 ;  // 分号表示一条语句结束  "1"表示高电平,"0" 表示低电平

delay_ms( 10 ) ;

LED = 0 ;

delay_ms( 10 ) ;

}  


2.3.流水灯

顾名思义,流水灯就是要灯向流水一样逐个点亮,逐个熄灭。

我们先在Proteus 8 Professional中建立如下原理图:

图中所示的LED公共端为GND(低电平),所以程序要使P1口输出高电平,才可以点亮LED。

代码如下:


#include

#define uchar unsigned char   //对数据类型进行声明定义

#define uint unsigned int  //对数据类型进行声明定义


void delay(uint n)// 延时函数,大约延时 n ms

{

uchar i,j;//定义无符号的字符型变量  unsigned char 的数据范围为0~255(2^8 - 1)

for(i = 0 ; i < n ; i ++)

{

for(j = 0 ; j < 123 ; j ++);

}

}


void main()

{

P1 = 0x00; //0000 0000 初始化P1端口,使之输出低电平

while(1)

{

P1 = 0x01 ;   //0000 0001 即P0^0为高电平,其余为低电平

delay(200) ;

   P1 = 0x02 ;  // 0000 0010 即P0^1为高电平,其余为低电平

delay(200) ;

P1 = 0x04 ; // 0000 0100 即P0^2为高电平,其余为低电平

delay(200) ;

   P1 = 0x08 ;  // 0000 1000 即P0^3为高电平,其余为低电平

delay(200) ;

P1 = 0x10 ; // 0001 0000    即P0^4为高电平,其余为低电平

delay(200) ;

   P1 = 0x20 ;  //0010 0000 即P0^5为高电平,其余为低电平

delay(200) ;

P1 = 0x40 ; // 0100 0000 即P0^5为高电平,其余为低电平

delay(200) ;

   P1 = 0x80 ;  // 1000 0000 即P0^6为高电平,其余为低电平

delay(200) ;

}

}


或者使用左移的方式来进行编写


void main()

{

uint i ;     //定义无符号的整型变量  unsigned int 的数据范围为 0~65535(2^16 - 1)

P1 = 0x00; //0000 0000 初始化P1端口,使之输出低电平

while(1)  // 死循环(无限循环下去没有尽头)

{

for( i = 0 ; i < 8 ; i ++ )

{

P1 = ( 0x01 << i ) ;  // i = 1 时向左移动1位;i = 2 时向左移动2位 ... 当 i= 8 时停止循环 for 函数结束 。

delay(200) ;

}

}

}

关键字:51单片机  入门  LED灯 引用地址:51单片机入门——控制LED灯

上一篇:51单片机入门——数码管
下一篇:51单片机入门——Proteus 8 Professional的使用

推荐阅读最新更新时间:2024-11-12 11:36

51单片机蜂鸣器音乐简谱转换工具
相信您在作蜂鸣器发声实验时肯定为复杂的频率与音调之间的转换而伤脑筋,这里向大家介绍一款工具可以大大简化转换操作,只需要输入简谱就能自动生成音乐播放程序代码。 以下此程序的主界面: 程序范例可以点主界面上的 关于 按钮后就能找到,但是代码也不全,需要加入对音乐程序的调用代码,其它范例里也写的很清楚了,只需要调用Play函数就行了,其调用格式如下: Play(乐曲名,调号,升降八度,演奏速度); 经过实践,此函数的的后三个参数分别设为0,2和350时演奏出的音乐比较符合 原味 ,下面给出本站的入门型51实验板结合此工具作的音乐程序: //51单片机播放音乐库文件 /****************************
[单片机]
<font color='red'>51单片机</font>蜂鸣器音乐简谱转换工具
51单片机二进制转换
#include reg51.h #define LongToBin(n) \ (\ ((n 21) & 0x80) | \ ((n 18) & 0x40) | \ ((n 15) & 0x20) | \ ((n 12) & 0x10) | \ ((n 9) & 0x08) | \ ((n 6) & 0x04) | \ ((n 3) & 0x02) | \ ((n ) & 0x01) \ ) #define Bin(n) LongToBin(0x##n##l) void main(void) { unsigned char c; c = Bin(10101001); // c = 0xA9
[单片机]
51单片机子程序调用与返回指令简介及举例
(1)主程序与子程序 在前面的灯的实验中,我们已用到过了子程序,只是我们并没有明确地介绍。子程序是干什么用的,为什么要用子程序技术呢?举个例程,我们数据老师布置了10道算术题,经过观察,每一道题中都包含一个(3*5+2)*3的运算,我们能有两种选择,第一种,每做一道题,都把这个算式算一遍,第二种选择,我们能先把这个结果算出来,也就是51,放在一边,然后要用到这个算式时就将51代进去。这两种办法哪种更好呢?不必多言。设计程序时也是这样,有时一个功能会在程序的不一样地方反复使用,我们就能把这个功能做成一段程序,每次需要用到这个功能时就“调用”一下。  (2)调用及回过程:主程序调用了子程序,子程序执行完之后必须再回到主程序继续执行,不
[单片机]
51单片机学习笔记1.流水灯实现与蜂鸣器
原理图(此次用到的部分) P2中的某个口为1(高电平)时,无电流流过,对应的二极管不会被点亮 代码 #include reg52.h void delay(unsigned int k) { int i,j; while(k--) { for(i = 1000;i 0;--i) for(j = 110;j 0;--j); } } void main() { unsigned char i = 0; P2 = ~0x01; while(1) { if(i==7) i=0; else i+=1; P2 = ~(0x01 i); delay(1); } } #include re
[单片机]
<font color='red'>51单片机</font>学习笔记1.流水灯实现与蜂鸣器
基于大功率LED灯的配光与散热技术研究
1 背景 半导体器件的发光现象从原理上来说可以大致分为三种:光致发光,电致发光,阴极射线发光,其中第一种发光形式是当一定数量的光线照射到半导体上面的时候,半导体本身的电子和空穴吸收了光的能量而发光的现象。第二种发光形式是当在半导体器件上施加正向电压的时候,电子和空穴由于得到了能量而运动,进而激发了发光现象。 阴极射线发光是当某些射线照射到半导体上面的时候,半导体的载流子吸收了能量,进而产生复合发光的发光现象。 LED本身也属于半导体器件,LED的自发性发光是由于电子和空穴之间的复合运动而产生的。它的发光原理是基于电致发光的发光原理,而没有采用与传统光源诸如白炽灯,节能灯等相似的发光原理。LED最重要的部分是P-N结-个由N型半导
[电源管理]
基于大功率<font color='red'>LED灯</font>的配光与散热技术研究
基于AT89C51单片机的频率计的C源程序及频率计实现的主要功能
本文是基于AT89C51单片机的频率计的C源程序。该频率计主要实现的功能有如下几个:   1. 测试功能   它表明数字频率计所具备的全部测试功能,一般包括测频, 周期 ,累计脉冲数,频率比,时间间隔及自较等功能。   2. 测量范围   它说明不同功能的有效测量范围。如测频率时,测量范围是数字频率计处于正常工作条件下,被测信号的 频率范围 ,一般用频率的上,下限值表示,低端大部分从10 Hz 开始;高端因不同的频率计而异。因此高端频率是确定低,中,高速计数器的依据。在测量周期时,测量范围常用周期的最大值,最小值表示。   3. 输入特性   数字频率计一般有2~3个输入通道,测试不同项目时,被测
[单片机]
基于AT89C<font color='red'>51单片机</font>的频率计的C源程序及频率计实现的主要功能
如何编写51单片机超声波测距SR04_lcd1602显示程序
main.c #include reg51.h #include intrins.h #include lcd.h unsigned char code ASCII = {'0','1','2','3','4','5','6','7','8','9','.','-','M'}; static unsigned char DisNum = 0; //显示用指针
[单片机]
如何编写<font color='red'>51单片机</font>超声波测距SR04_lcd1602显示程序
通用型51单片机lcd1602驱动
文件:lcd_1602.h #ifndef _LCD1602_TRAVELER_H_ #define _LCD1602_TRAVELER_H_ /*************************待配置项*******************************/ #define DATA_LCD P0 //液晶与MCU 数据口 sbit RS_LCD = P2^5; // 液晶的RS、RW、E 端在 MCU端的连线 sbit RW_LCD = P2^6; sbit E_LCD = P2^7; /**************************************************
[单片机]
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved