- 51单片机应用开发案例手册
- 程国钢编著
- 1363字
- 2020-08-27 02:11:00
1.2 I/O引脚驱动LED
LED(发光二极管)是51单片机系统中最常见的一种指示型外部设备,是半导体二极管的一种,可以把电能转化成光能;其主要结构是一个PN结,具有单向导电性,常常用于指示某个开关量的状态。LED的实物如图1.2所示。
图1.2 红色的发光二极管实物
说明:发光二极管有红、黄、绿等多种不同颜色及不同的大小(直径),还有高亮等型号,它们主要的区别是封装、功率和价格。
1.2.1 LED的工作原理
发光二极管LED和普通二极管一样,具有单向导电性,当加在发光二极管两端的电压超过了它的导通电压(一般为1.7~1.9V)时就会导通,当流过它的电流超过一定电流(一般为2~3mA)时则会发光。51单片机系统中发光二极管的典型应用电路如图1.3所示。
图1.3 51单片机系统中LED的典型应用电路图
图1.3中P1端口上的LED驱动方式称为“拉电流”驱动方式,当51单片机I/O引脚输出高电平时,发光二极管导通发光;当51单片机I/O引脚输出低电平时,发光二极管截止。图1.3中P3端口上的LED驱动方式称为“灌电流”驱动方式,当51单片机引脚输出低电平时,发光二极管导通发光;当51单片机引脚输出高电平时,发光二极管截止。
图1.3中的电阻均为限流电阻,当电阻值较小时,电流较大,发光二极管亮度较高;当电阻值较大时,电流较小,发光二极管亮度较低。一般来说该电阻值选择范围为1~10kΩ,具体电阻的选择与该型号单片机的I/O口驱动能力、LED的型号及系统的功耗有关。
说明:P1端口不直接用I/O引脚驱动LED,而是外加了VCC,原因是51单片机I/O口的驱动能力有限;同理,P3中的电阻值不宜过小,因为51单片机I/O口吸收电流的能力也有限,过大的电流容易烧毁单片机。
1.2.2 应用实例——LED闪烁和流水灯
1. LED闪烁实例
LED闪烁实例中使用51单片机控制8个LED间隔亮、灭,形成闪烁效果,这种效果常常用于指示单片机系统的运行状态。
图1.4是LED闪烁实例的电路图,8个LED使用灌电流的驱动方式连接在51单片机的P1端口上,表1.2是实例使用的典型器件说明。
表1.2 LED闪烁实例器件列表
图1.4 LED闪烁实例电路图
在实例中,51单片机通过一个软件延时程序控制P1端口轮流输出高电平和低电平,驱动发光二极管发光和熄灭,【例1.1】是LED闪烁实例的代码。
【例1.1】 代码使用两个嵌套的for循环语句来控制延时,当到达延时之后使P1输出电平翻转。
#include <AT89X52.h> main() { unsigned char i,j; P1 =0x00; //初始化P1 输出,LED全亮 while(1) { for(i=0;i<200;j++) //for循环软件延时 { for(j=0;j<50;j++); } P1 =~P1; //P1 端口输出的电平翻转,形成闪烁 } }
2. 流水灯实例
流水灯实例使用51单片机控制8个LED轮流点亮,常常用于指示单片机系统的工作进程,或者用于构造特殊效果。例如,用红、绿、黄三种颜色来制造舞台效果等。
流水灯实例的电路图和LED闪烁实例相同,如图1.4所示,【例1.2】是流水灯实例的代码。
【例1.2】 与LED闪烁实例类似,51单片机使用两个嵌套的for循环语句来进行软件延时,当延时完成之后使用“<<”移位语句将当前输出高电平的P1端口引脚向高位移动一位,由于“<<”语句不带进位功能(即到达最高位之后不会自动循环到最低位),所以需要用一个判断语句将点亮端口位移动到最低位。
#include <AT89X52.h> main() { unsigned char i,j; unsigned char LED; LED=0x01; //最低位LED点亮 P1 =~LED; //灌电流驱动 while(1) { for(i=0;i<250;i++) //软件延时 { for(j=0;j<250;j++); } if(LED==0x80) //判断是否到最高位,如果流水到头,则折返到最低位点亮 { LED=0x01; } else { LED=LED <<1; //移位,行程流水 } P1 =~LED; } }