51单片机入门——LED灯

目录

  • 1. LED
    • 1.1.什么是LED?
    • 1.2.LED的种类
    • 1.3.LED的主要参数
    • 1.4.LED的主要特性
    • 1.5.LED引脚极性识别方法
    • 1.6.电压控制型和闪烁型LED
  • 2.单片机控制LED
    • 2.1.点亮一个LED
      • 2.1.1程序的编写
      • 2.1.2程序的编译
      • 2.1.3.程序的烧录
    • 2.2.闪烁灯
      • 2.2.1.延时函数
      • 2.2.2.闪烁灯的实现
    • 2.3.流水灯

1. LED

1.1.什么是LED?

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

关于LED外形特征主要说明下列几点。
(1)单色LED的外壳颜色表示了它的发光颜色。LED的外壳是透明的。
(2)单色LED只有两根引脚,这两根引脚有正、负极之分。多色的LED为 3 根引脚。
(3)LED外形很有特色,所以可以方便地识别出LED。

1.2.LED的种类

51单片机入门——LED灯_第2张图片

1.3.LED的主要参数

  1. 电参数
    (1)正向工作电流IF。它是指发光二极管正常发光时的正向电流值。发光二极管工作电流一般为 10~20mA。
    (2)正向工作电压UF。它是在给定正向电流下的发光二极管两端正向工作电压。一般是在 IF=20mA 时测量,发光二极管正向工作电压为 1.4~3V 。外界温度升高时,发光二极管正向工作电压会下降。
    (3)伏 - 安特性。它是指发光二极管电压 与电流之间的关系。

  2. 极限参数
    (1)允许功耗 Pm。它是允许加于发光二极管两端正向直流电压与流过它的电流之积的最大值,超过此值时发光二极管发热、损坏。
    (2)最大正向直流电流 IFm。它是允许加的最大正向直流电流,超过此值会损坏二极管。
    (3)最大反向电压 URm。它是所允许加的最大反向电压,超过此值发光二极管可能被击 穿损坏。
    (4)工作环境 topm。它是发光二极管可正常工作的环境温度范围。低于或高于此温度范围,发光二极管将不能正常工作,效率大大降低。

1.4.LED的主要特性

  1. 伏 - 安特性
    LED与普通二极管的伏 - 安特性相似,只是LED的正向导通电压值较大。 小电流LED的反向击穿电压很小,为 6V 至十几伏,比普通二极管的小。下图所示是LED正向伏 - 安特性曲线。
    51单片机入门——LED灯_第3张图片

下图是LED伏 - 安特性曲线, 它含正向和反向特性。LED具有与一般半导体三极管相似的输入伏 - 安特性曲线。
51单片机入门——LED灯_第4张图片
关于伏 - 安特性曲线各区段说明如下。
(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就是工作在这一区段。

  1. 正向电阻和反向电阻特性
    LED正向和反向电阻均比普通二极管的大得多,了解这一点对检测二极管有重要指导意义。
  2. 工作电流与发光相对强度关系
    下图所示是发光二极管工作电流与发光相对强度关系特性曲线。对于红色LED 而言,正向工作电流增大时发光相对强度也在增大,当工作电流大到一定程度后,曲线趋于平坦(饱和),说明发光相对强度趋于饱和;对于绿色LED而言,工作电流增大,发光相对强度增大,但是没有饱和现象。
    51单片机入门——LED灯_第5张图片
  3. 发光强度与环境温度关系
    下图所示是发光二极管发光强度与环境温度关系特性曲线。温度愈低,发光强度愈大。 当环境温度升高后,发光强度将明显下降。
    51单片机入门——LED灯_第6张图片
    5.最大允许工作电流与环境温度关系
    下图所示是最大允许工作电流与环境温度关系特性曲线。当环境温度大到一定程度后, 最大允许工作电流迅速减小,最终为零,说明在环境温度较高场合下,LED更容易损坏,这也是LED怕烫的原因。
    51单片机入门——LED灯_第7张图片
    6.其他特性曲线

51单片机入门——LED灯_第8张图片

1.5.LED引脚极性识别方法

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

  1. 引脚长短识别方法
    下图是用引脚长短区别正、负极性引脚的LED,它的两根引脚一长一短, 长的一根是正极,短的为负极。
    51单片机入门——LED灯_第9张图片
  2. 突键方式识别方法
    下图所示是突键方式表示正极性引脚方法,LED底座上有一个突键,靠 此键最近的一根引脚为正极。51单片机入门——LED灯_第10张图片
  3. 3 根引脚LED引脚识别方法
    下图所示是一种 3 根引脚LED引脚分布规律和内电路示意图。内设两只不同 颜色发光二极管。K 为共同引脚。51单片机入门——LED灯_第11张图片
    下图是另一种 3 根引脚的变色LED引脚识别方法示意图,它有一个突键,根据它的这一外形特征可以方便地确定各引脚。
    51单片机入门——LED灯_第12张图片
  4. 6 根引脚LED引脚识别方法
    下图所示是 6 根引脚LED引脚分布规律和内电路示意图。它内有两组 3 根引脚的LED。
    51单片机入门——LED灯_第13张图片

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

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

  2. 闪烁型LED
    闪烁型LED是一种由 CMOS 集成电路和LED组成的特殊发光器件。下图所示是闪烁型LED实物图和内电路,它可用于报警指示及欠压、超压指示等。
    51单片机入门——LED灯_第15张图片
    下图是闪烁型LED内电路方框图。闪烁型LED在使用时,无须外接其他元器件,只要在其引脚两端加上适当的直流工作电压(5V)即可闪烁发光,常用的闪烁型发光二极管是 BTS 系列。51单片机入门——LED灯_第16张图片

2.单片机控制LED

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

2.1.点亮一个LED

2.1.1程序的编写

首先我们在Proteus 8 Professional中搭建一个如图所示的电路原理图
51单片机入门——LED灯_第17张图片

图中的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’…)如图:
51单片机入门——LED灯_第18张图片
或者直接点击如图所示的框内的快捷图标
51单片机入门——LED灯_第19张图片
在弹出的对话框中,单击Output选项页,勾选其中的Create HEX File ,然后单击确定(OK)按钮即可,如图:
51单片机入门——LED灯_第20张图片
设置好之后,单击工程(Project)-> 编译(rebuild all target files) ,或单击下图所示的快捷图标即可在这里插入图片描述
编译完成之后,在Keil下方的输出(Output)窗口会出现相应的提示,如图:51单片机入门——LED灯_第21张图片
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 文件,点击打开即可,如图:51单片机入门——LED灯_第22张图片
51单片机入门——LED灯_第23张图片
51单片机入门——LED灯_第24张图片
然后即可开始仿真。

如果有硬件设备的小伙伴,可以使用 STC-ISP ——STC系列单片机下载软件,将程序烧录到开发板中,如图:51单片机入门——LED灯_第25张图片
注意:因为STC系列单片机需要冷启动下载(就是先点击下载,然后再给单片机供电),所以先关闭开发板上的电源开关,然后单击下载(Download)按钮,再给开发板上电,就可以把程序烧录到单片机里面了。51单片机入门——LED灯_第26张图片
上图显示操作成功即表示程序已经烧录到单片机里面了。
51单片机入门——LED灯_第27张图片

上图为仿真软件中的仿真结果。
至此,点亮一个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中建立如下原理图:
51单片机入门——LED灯_第28张图片
图中所示的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) ;
		}
	}
}

上述程序的仿真视频链接

这里是引用程序的左移右移是指变量的8位二进制数依次向左移一位,或向右移一位然后在高位或低位补0。比如,取8位数,让0000 0001循环左移一位,就是0000 0010。

你可能感兴趣的:(51单片机入门,单片机,stm32)