2.5 I/O口控制LED发光二极管应用实例
2.5.1 LED基本结构
(1)LED芯片结构 发光二极管(Light-Emitting Diode,LED)是一种能发光的半导体电子元件。图2-6所示为彩色LED芯片的结构。芯片两端是金属电极(阳极和阴极),底部是衬底材料,在基片上通过外延工艺生长一定厚度的N型层、发光层和P型层。当芯片工作时,P型半导体和N型半导体中的空穴和电子分别注入发光层并发生复合而产生光。图示中的彩色LED芯片结构是一种经简化的抽象的示意图,实际的LED芯片因制造工艺不同,结构也存在一些差别。
图2-6 彩色LED芯片结构示意图
蓝光和紫外光LED芯片需加配YAG荧光粉或三基色荧光粉才能获得白光,也可将红(R)、绿(G)、蓝(B)三色或更多颜色的LED芯片封装在一起,将它们各自发出的光混合来产生白光。
(2)传统LED封装结构 传统发光二极管(LED)一般是用透明环氧树脂将LED芯片与导线架(Lead Frame)包覆封装,封装后的镜片状外形可将芯片产生的光线集中辐射至预期的方向。由于圆柱形状类似于炮弹,因此称之为“炮弹形LED”。这种LED芯片主要由支架、银胶、晶片、金钱和环氧树脂5种物料所组成,如图2-7所示。
图2-7 传统LED结构
2.5.2 硬件设计
LED灯有两种连线方法:当LED灯的阳极限流电阻与板子上的数字I/O口相连,数字口输出高电平时,LED导通,发光二极管发出亮光;数字口输出低电平时,LED截止,发光二极管熄灭。如图2-8所示。
图2-8 LED灯连线方法1
当LED灯的阴极与板子上的数字I/O口相连时,数字口输出高电平,LED截止,发光二极管熄灭;数字口输出低电平,LED灯导通,发光二极管点亮。如图2-9所示。
图2-9 LED灯连线方法2
由于单片机输出电流有限,阳极接法需要单片机给LED提供电流,可能造成单片机运行不稳定,故通常采用阴极接法。
LED与单片机的连接如图2-10和图2-11所示。通常LED的点亮电流为5~10mA,压降为1.7~1.9V。因此,计算5V电源下使用的限流电阻的大小为500Ω左右。图中使用的限流阻排(RP1)阻值为470Ω。
图2-10 流水灯实例电路原理图1
图2-11 流水灯实例电路原理图2
P9为连接插针,当不使用二极管作流水灯实验时,可断开连接释放引脚资源。
2.5.3 程序设计
观察图2-11可知,对单片机的端口PB0~PB7输出1时,8个LED两端电平相同,没有电流流过,此时LED不亮;当PB0~PB7口输出0时,LED电路构成通路,有足够的电流流过LED,此时LED被点亮发光。图中电阻R的作用是防止太强的电流流入I/O线路。
当有电流通过时(此时LED发光),LED有一个正向电压降,表明阴极的电压低于阳极。不同的LED电压降的幅度有所不同,可以通过查找相应的技术手册来获得用户所使用LED的电压降数值。
本程序将实现延时轮流点亮8个LED。
名称:LED.C。
功能:演示流水灯,从上向下流动,而后从下向上流动,如此循环。
时钟频率:内部1MHz。
编译环境:ICC-AVR6.31。
使用硬件:8个LED、阻排。
结果:8LED流水闪烁。
操作要求:插上P9跳帽。
程序清单如下:
(1)头文件部分
# include< iom128v.h> //ATmega128头文件 # include< delay.h> # define LED8 PORTB //LED发光管与 PB口相连接
程序中包含了特定头文件iom128v.h和delay.h。iom128v.h头文件在ICC程序安装文件夹下的include目录中,iom128v.h和用户选择的芯片相对应,如果选择的是ATmega128,则该文件是iom128v.h,此文件中定义了对应芯片的各个硬件地址:delay.h文件中定义了一些延时子程序。通常每一个程序都要包含这些头文件。
(2)延时程序
/****************************************** 函数名:Delay_nms 函数作用:毫秒级的精确延时程序 *******************************************/ void delay_nms(unsigned int nms) { while(nms- - ) delay_lms(); } void delay_ns(unsigned char ns) { while(ns- - ) delay_nms(1000); }
(3)主程序
viod main() { DDRB= 0xff; //设置 PB口为输出 LED8= 0xff; //系统初始化 while(1) { LED8= 0x00; Delay-nms(500); //延时 500ms LED8= 0xff; delay_nms(500); } }
读者在理解以上程序后,可在原硬件基础上,体会如下几个程序(LED2.C~LED4.C)将要实现的功能与上述例子中实现的功能有何不同。
①名称:LED2.C。
功能:实现8个发光二极管轮流点亮。
时钟频率:7.3728MHz。
编译环境:ICC-AVR6.31。
使用硬件:8个LED。
结果:8LED流水闪烁。
程序清单如下:
# include < iom128v.h> # include“delay.h″ Unsigned char LED_table[]= {0Xff,0x00,0xFF,0xFE,0xFD, 0xFB, 0xF7, 0xEF, 0xDF, 0xBF, 0x7F, 0xFF, 0x00, 0xFF, 0x7F, 0xBF, 0xDF, 0xEF, 0xF7, 0xFB, 0xFD, 0xFE, 0xFF, 0x00, 0xFF, 0x7E,0xBD,0xE7,0xFF,0x00,0xE7,0xDB,0xBD,0x7E,0xFF,0x00}; viod main(void) { unsigned char i= 0; PORTB= 0xFF; DDRB= 0xFF; while(10 { if (i= = 36) i= 0; PORTB= LED-table(i+ + ); delay-nms(80); } }
②名称:LED3.C。
功能:实现8个发光二极管轮流点亮。
时钟频率:7.3728MHz。
编译环境:ICC-AVR6.31。
使用硬件:8个LED、阻排。
结果:8LED流水闪烁。
程序清单如下:
# include < iom128v.h> # include“delay.h″ viod main(void) { unsigned char i; PORTB= 0xFF; DDRB= 0xFF; while(1); { for (i= 0;i< 0;i+ + ) { PORTB= - (1< < i); delay-nms(300); } PORTB= 0xFE; } }
③名称:LED4.C。
功能:实现8个发光二极管轮流点亮。
时钟频率:7.3728MHz。
编译环境:ICC-AVR6.31。
使用硬件:8个LED、阻排。
结果:8LED流水闪烁。
程序清单如下:
# include < iom128v.h> # include< stdlib.h> # include“delay.h″ void main(void) { unsigned char i; PORTB= 0xFF; DDRB= 0xFF; srand(10); //种下随机数种子 while(1) { PORTB= rand(); //随机数产生函数 Delay= nms(300); } }
提示:发光二极管是一种电流型器件,虽然在它的两端直接接上3V的电压后能够发光,但容易损坏,在实际使用中一定要串接限流电阻,工作电流根据型号不同一般为1~30mA,另外,由于发光二极管的导通电压一般为1.7V以上,所以,一节1.5V的电池不能点亮发光二极管。同样,一般万用表的R×1挡到R×1kΩ挡均不能测试发光二极管,而R×1kΩ挡由于使用9V的电池,能把有的发光管点亮。