基于红外遥控的LED照明系统设计
摘要:LED (发光二极管)作为一种新型光源,由于具有高效节能、绿色环保、使用寿命长等诸多优点,近年来发展迅速,并成为照明领域研究的热点。本文设计了一种以AT89S51单片机为核心的红外遥控技术实现对LED照明系统,其采用PWM调光方式,并运用红外遥控技术实现对LED光源的多级亮度调节。本文详细给出系统的硬件与软件设计过程。实验证明,该大功率LED照明系统稳定高效,控制便捷,在普通照明应用中具有较好的使用价值。 关键词:红外遥控、PWM调光、LED、单片机
Design of High-power LED Lighting System Based on Infrared Remote Control Technology
Abstract:LED(light emitting diode as the new light source has the merits of energy efficiency,environmental friendly and longer lifespan,which has developed rapidly in recent years and become the study hotspot in the field of lighting.A high-power white LED lighting system based on AT89S51 single chip computer is presented,which adopts infrared remote control technology to achive PWM dimming.The paper also provides the hardware and softerware designing procedures in details.Though
experiment,the high-power LED lighting system is proved to be more efficient and convenient,which has the good practical value in the application field for lighting.
Keywords: infrared remote control;high-power LED;PWM dimming; single chip compute 目录
摘
要·······························································1
Abstract: ·························································1
一、系统方
案 ······················································3
1、方案比较与选
择 ··················································3
2、系统方案描
述 ··················································3
二、理论分析与计
算 ···············································4
1、红外发射电路的设
计···············································4
2、接收电路的设
计 ··················································7
3、单片机主控电路的设
计·············································7
4、恒流驱动电路的设
计················································8
5、PWM调光原
理····················································8
三、电路与程序设
计·················································8
1、电路设
计························································8 2、程序设
计·························································10 四、测试方案与测试结
果·············································10 1、测试条
件: ·····················································10 2、测试方案及主要测试结
果·········································10 3、测试结果分
析·····················································11 五、总
结··························································11 参考文
献··························································12
附录1 主要元器件清
单············································13
附录2 仪器设备清
单··············································13 附录3 程序清
单··················································13 一、系统方案 1、方案比较与选择
仔细分析题目要求,本题包括红外遥控系统、恒流驱动系统、单片机等几个模块。对此,考虑了以下几种方案: (1)红外遥控系统的确定:
方案一:红外线光敏二极管PH检测到由红外线发射二极管LE发出的红外线光信号,并将其转换成电信号。该信号经由IC1A构成有源高通滤波器,滤除外界低频干扰信号;再经IC1B、IC1C两级固定增益放大器的放大、以及IC1D可调增益限幅放大器的放大,进入锁相环单音检测电路。IC2的第③脚。IC2检测到与自身振荡频率相同的信号后,其第⑧脚输出低电平,使继电器DL吸合,触点S1、S2接通,控制其他设备。IC2第⑧脚的最大吸入电流为100mA。IC2第⑤脚输出的方波信号,经C8、R16组成的微分电路和N1、N2驱动电路,使红外线发射二极管发出该频率调制的红外线光信号。微分电路使正方波信号变为低占空比的方波信号。用低占空比方波调制红外线发射管,可提高红外线发射管的工作效率,即其峰值电流很大,而平均工作电流却很小。这样,有利于红外线光敏二极管的接收。整体设计难度大,效果差,故不采用。
方案二:采用一款基于TC9012F芯片的遥控电路作为红外发射单元,其使用普遍,发射码多,可控制实现对LED光源亮度的多级调节;红外接收器由HS0038构成,它是集成有红外接收头、放大、解调和整形电路的一体化部件,可输出让单片机识别的TTL信号。整体而言效果更好,故采用该思路。 (2)软件部分
红外遥控信息处理则由单片机AT89S51实现,其主要完成对遥控电路发出的红外编码进行识别与解码,然后根据解码结果产生遥控发射电路键值所对应的PWM调光信号,从而控制实现LED多级调光功能。
方案一:LED调节亮度采用模拟调光。模拟调光是通过改变流过LED电流的大小来调整光效的,除了亮度会改变以外,也会影响LED的光效质量,即电流变化必然导致LED的色度偏差。
方案二:LED调节亮度采用PWM调光。PWM基本原理是保持LED正向导通电流恒定,而通过控制电流导通和关断的时间比例,可以实现从0到100%范围的亮度调节。PWM调光的优势是LED正向导通的电流一直是恒定的,LED的色度就不会像模拟调光一样会变化;在精确控制LED的亮度的同时,也保证LED发光的色度。 2、系统方案描述 系统方案框图见图2.1 图2.1 系统方案框图
二、理论分析与计算
1、红外发射电路的设计
TC9012是一种专用的红外遥控编码发射。其内部包括振荡器、分频器时序产生器、系统码锁存、数据寄存、键扫描输入、键扫描输出、载波控制及输出单元。其内部设置了8位系统码,可实现256只发射器同时同点操作发射而互不干扰。 TC9012F外形引脚图:
管脚图:管脚说明:
功能说明:
TC9012采用脉冲宽度调制编码格式,以不同的脉宽宽度来实现二进制信息的编码,其发射码格式由引导码、用户码、数据码、数据反码和结束码构成。引导码由4.5ms的高电平和4.5ms的低电平波形所构成,以作为一帧数据的起始位;一帧数据中含有32位码,包含两次8位用户码,8位数据码和8位数据码的反码。用户码用于区分不同类型的红外遥控设备,数据码即代表实际按下的键值信息,数据反码是数据码的各位求反,通过比较数据码与数据反码,可判断接收到的键值数据是否正确;最后发送结束位(SY),作为一帧数据的结束。发射码的格式如图:
用户编码一共有8种,是利用“SEL”脚与“KO0~KO7”中的任一脚相连接来进行选择的。 参考下图:
TC9012共有8位用户码:
键数据码确定
TC9012遥控器设置4个按键输入端KI0~KI3和8个按键输出端KO0~KO7,由此设置了一个4*8的键盘,共32键。键盘矩阵如下表所示:
这里共设置了32个键,所有系统的键值均按同一方式编码。 键数据的编码方式如下:{0,0,0,KO[2:0],KI[1:0]}。
例如:当按下键K13时,其输出键值为K7~K0=00001100,当按下键K24时,其输出键值为K7~K0=00001011,当按下键K22时,其输出键值为K7~K0=00010101,当按下键K31时,其输出键值为K7~K0=00011110。
键一直按着,将一帧码发完后发固定的重复码;当键松开时,等该帧码发完后进入低功耗模式。
用户码和键数据码的发送均是低位在前,高位在后。
2、接收电路的设计
红外接收电路用于接收红外信号并解调遥控器二进制控制脉冲信号。该红外接收电路采用HS0038。HS0038集光电转换、解调和放大于一体,只需少量外接元件就能实现从红外接收到输出与TTL电平兼容的所有工作。HS0038输出高电平,当输入为遥控信号时,HS0038则输出高低电平脉冲。接收的遥控码是由一个低电平与一个高电平构成,不同脉宽高低电平的组合组成不同控制码。当无限外脉冲信号时HS0038的数据输出OUT端输出高电平,当有高脉冲红外信号时OUT端输出为低电平,故其 输出信号电平正好与发射端相反。这一点在软件设计时应予以注意。此设计将解调的信号直接输入单片机的P3.2口,实现脉冲的计数和存储。
3、单片机主控电路的设计
本设计主控系统采用ATMEL公司的高性能单片机AT89S51实现。使用一款基于TC9012芯片的家用电视遥控电路作为系统的红外发射器;单片机P3.2口连接一体化红外接收器HS0038的数据输出OUT端;单片机P1。0口作为PWM信号的输出端,用于实现PWM调光控制。单片机通过对红外遥控器0~9按键以及开关按键红外编码的识别与解码,并根据解码结果产生键值对应的PWM信号,从而驱动LED实现不同亮度调节。系统晶振电路由12MHz晶振与两个30pF电容组成;复位电路则由S1按键、10K电阻与10uF电解电容构成。
4、恒流驱动电路的设计
方案一:采用基于PT4115的大功率恒流驱动系统。PT4115是一款连续电感电流导通模式的降压恒流源芯片,其具有以下特点:(1)6V~30V宽电压范围输入;(2)输出电流可达1.2A;(3)复用DIM引脚进行LED开关、模拟调光、PWM调光;(4)输出电流精度可达5%;(5)转换效率高达97%;(6)LED开路保护;(7)输出可调的恒流控制方法:(8)内部含有抖频特性,极大地改善
EMI。该芯片适合用于各类绿色照明LED灯的驱动电路,应用电路简洁,所需元器件较少且价格低廉。
方案二:方案一较为优化,但因暂时买不到芯片,故采用一个三极管代替。
5、PWM调光原理
在实际应用中,LED调节亮度一般采用两种方法,即模拟调光或PWM调光。模拟调光与PWM调光对比如图。模拟调光是通过改变流过LED电流的大小来调整光效的,除了亮度会改变以外,也会影响LED的光效质量,即电流变化必然导致LED的色度偏差。PWM基本原理是保持LED正向导通电流恒定,而通过控制电流导通和关断的时间比例,可以实现从0到100%范围的亮度调节。PWM调光的优势是LED正向导通的电流一直是恒定的,LED的色度就不会像模拟调光一样会变化;在精确控制LED的亮度的同时,也保证LED发光的色度。
三、电路与程序设计
1、电路设计
红外发射电路:采用TC9012F芯片,电路图见图3.1。
图3.1 红外发射电路
接收电路:采用HS0038,电路见图3.2。
图3.2 接收电路
单片机主控 电路:见图 3.3 恒流驱动电路:见图3.4
图3.3 单片机主控系统电路图 图3.4 恒流驱动电路
2、程序设计
程序流程图见图3.5。
图3.5 系统主程序流程图
四、测试方案与测试结果
1、测试条件:
测试条件:本系统采用(1)输入电压为5V(2)阻碍红外发射的遮挡物。
2、测试方案及主要测试结果
(1)红外发射电路的测试:加5V电源,每按下按键,示波器输出高频波,指示灯亮。
(2)配合单片机,从K1~K8每按下一次按键,LED 亮度逐渐增加,同时液晶显示键值。从 K9~K32每按下一次按键,LED不亮,只是液晶显示键值。如图4.2 (3)红外接收电路的测试:用阻碍红外发射的遮挡物遮挡住红外接收管,发现按键不起作用。
3、测试结果分析
红外发射电路发出的脉冲信号都调制在占空比为1/3,频率为38kHz的载波上再发送出去。因此红外发射电路的测试结果正确。
由于LED最大亮度有限,因此单片机软件设计时K1~K8为LED亮,其他键值时
LED灭。因此总体测试结果正确。
五、总结 系统实现的功能:
1 红外发射 2 三极管开关控制 3 红外接收 4 LED调光功能 5 液晶显示
本文设计的基于红外调控的大功率白光LED照明系统,采用AT89S51单片机为控制核心,运用PWM调光技术以及红外遥控技术实现对LED的多级调光控制。该照明系统具有控制电路简单、亮度调节精确、高效节能、实用便捷等优点,符合现代照明的应用要求。
LED作为一种新型的绿色光源,必然是未来照明技术的发展趋势,21世纪将进入以LED
为代表的新型照明光源时代。
参考文献
[1]康华光,陈大钦,张林 编著,电子技术基础模拟部分,2006年1月第5版, 高等教育出版社.
[2]黎平 LED驱动电源研究[D].重庆:重庆大学硕士学位论文,2007
[3]周志敏,周纪海,纪爱华.LED驱动电路设计与应用[M].北京:人民邮电出版社,2006
[4]杨恒.LED照明驱动器设计[M].北京:中国电力出版社,2010.
[5]聂诗良,李磊民.采用单片机发送并接收红外遥控信号的方法[J].信息技术,2004。2: 22~23.
[6]楼然苗,李光飞.单片机课程设计指导[M]北京:北京航空航天大学出版社,2007. [7] 郑久云,韩志刚,罗胜钦.白光LED的应用与驱动[J].现代显示,2009.8: 43~45.
[8]毛兴武,张艳雯,周建军.新一代绿色光源LED及其应用技术[M].北京:人民邮电出版社,2009.
附录
附录1
部分元器件清单
芯片:TC9012F HS0038 AT89S52
其它器件:贴片电阻、电容若干,肖特基二极管,排针,短路帽,导线若干
附录2
仪器设备清单
电烙铁 万用表 函数信号发生器 示波器
附录 3 部分程序清单
#include \"nokia_5110.h\" #include \"bmp_pixel.h\" #define delay_time 25767 void fun1(void {
LCD_write_english_string(0,0,\"TEST PROG YZL\"; LCD_write_english_string(0,1,\"NOKIA 5110LCD \"; LCD_write_english_string(0,2,\"amy-studio.com\"; LCD_write_english_string(0,3,\" Nokia5110 LCD\"; LCD_write_chinese_string(12,4,12,4,0,5; }
void main(void {
LCD_init(; //初始化液晶 LCD_clear(; while(1 {
//fun1(; delay_nms(500;LCD_clear(;delay_nms(500;
LCD_draw_bmp_pixel(0,0,gImage_bmp1,40,40;delay_nms(500;LCD_clear(; //LCD_draw_bmp_pixel(0,0,AVR_bmp,66,40;//x,y,*pointer,pixx,pixy LCD_write_chinese_string(0,0,12,4,0,0;delay_nms(500;LCD_clear(; } } #include #include #include
#include \"nokia_5110.h\" #define TURE 1 #define FALSE 0
sbit IR=P3^2;//红外接口标志 sbit LEDEN = P0^0;
unsigned char irtime;//红外用全局变量 bit irpro_ok,irok; unsigned char IRcord[4]; unsigned char pwmt,genepwm; unsigned char irdata[33]; void Delay(unsigned char mS; void Ir_work(void;
void Ircordpro(void;
void generatewave(unsigned char a {
if (pwmt<(a+1 LEDEN=1;
else { if (pwmt<10 LEDEN=0; else {pwmt=0;} } pwmt++; }
void tim0_isr (void interrupt 1 using 1//定时器0中断服务函数 { irtime++;
if (genepwm { generatewave(IRcord[2];} }
void ex0_isr (void interrupt 0 using 0//外部中断0服务函数 {
static unsigned char i; static bit startflag; if(startflag {
if(irtime<42&&irtime>=33//引导码 TC9012的头码 i=0;
irdata[i]=irtime;//一次存储32位电平宽度 irtime=0; i++; if(i==33 { irok=1; i=0;
} } else
{irtime=0;startflag=1;} }
void TIM0init(void//定时器0初始化 {
TMOD=0x02;//定时器0工作方式2,TH0是重装值,TL0是初值 TH0=0x00;//reload value TL0=0x00;//initial value ET0=1;//开中断 TR0=1; }
void EX0init(void {
IT0 = 1; // Configure interrupt 0 for falling edge on /INT0 (P3.2 EX0 = 1; // Enable EX0 Interrupt EA = 1; }
/*****************************************************************/ void Ircordpro(void//红外码值处理函数 {
unsigned char i, j, k; unsigned char cord,value; k=1;
for(i=0;i<4;i++//处理4个字节 {
for(j=1;j<=8;j++ //处理1个字节8位 {
cord=irdata[k]; if(cord>7//大于某值为1 {
value=value|0x80; } else {
value=value; } if(j<8 {
value=value>>1; } k++; }
IRcord[i]=value; value=0;
} irpro_ok=1;//处理完毕标志位置1 }
unsigned char i8;
unsigned char i7[4]={1,2,3,4} ; void main(void { LEDEN=0;
LCD_init(; //初始化液晶 LCD_clear(;
EX0init(; // Enable Global Interrupt Flag TIM0init(;//初始化定时器0 while(1//主循环 {
// LEDEN=0; for( i8=0;i8<250;i8++; //LEDEN=1;for( i8=0;i8<250;i8++; if(irok //等待按键 {
Ircordpro(;//码值处理 irok=0; }
if(irpro_ok { LCD_write_english_string(0,0,\"KEY VALUE: \";//wr4char(0,0,IRcord; Ir_work(; wr2hex(64,0,(IRcord[2]+1;
if (IRcord[2]<8 {genepwm=1;} else { genepwm=0;LEDEN=0;} }//码值识别散转 i7 } }
#include \"nokia_5110.h\" #include \"english_6x8_pixel.h\" #include \"write_chinese_string_pixel.h\"
/*----------------------------------------------------------------------- LCD_init : 3310LCD初始化 编写日期 :2004-8-10 最后修改日期 :2004-8-10
-----------------------------------------------------------------------*/ void delay_1us(void //1us延时函数 {
unsigned int i; for(i=0;i<1000;i++; }
void delay_1ms(void //1ms延时函数 {
unsigned int i; for (i=0;i<1140;i++; }
void delay_nms(unsigned int n //N ms延时函数 {
unsigned int i=0; for (i=0;i delay_1ms(; }
void LCD_init(void {
// 产生一个让LCD复位的低电平脉冲 LCD_RST = 0; delay_1us(; LCD_RST = 1; // 关闭LCD LCD_CE = 0; delay_1us(; // 使能LCD LCD_CE = 1; delay_1us(;
LCD_write_byte(0x21, 0; // 使用扩展命令设置LCD模式
LCD_write_byte(0xc8, 0; // 设置偏置电压 LCD_write_byte(0x06, 0; // 温度校正 LCD_write_byte(0x13, 0; // 1:48 LCD_write_byte(0x20, 0; // 使用基本命令 LCD_clear(; // 清屏
LCD_write_byte(0x0c, 0; // 设定显示模式,正常显示 // 关闭LCD LCD_CE = 0; }
/*----------------------------------------------------------------------- LCD_clear : LCD清屏函数 编写日期 :2004-8-10 最后修改日期 :2004-8-10
-----------------------------------------------------------------------*/ void LCD_clear(void {
unsigned int i;
LCD_write_byte(0x0c, 0; LCD_write_byte(0x80, 0; for (i=0; i<504; i++ LCD_write_byte(0, 1; }
/*----------------------------------------------------------------------- LCD_set_XY : 设置LCD坐标函数 输入参数:X :0-83 Y :0-5
编写日期 :2004-8-10 最后修改日期 :2004-8-10
-----------------------------------------------------------------------*/ void LCD_set_XY(unsigned char X, unsigned char Y {
LCD_write_byte(0x40 | Y, 0; // column LCD_write_byte(0x80 | X, 0; // row }
/*----------------------------------------------------------------------- LCD_write_char : 显示英文字符 输入参数:c :显示的字符; 编写日期 :2004-8-10 最后修改日期 :2004-8-10
-----------------------------------------------------------------------*/ void LCD_write_char(unsigned char c {
unsigned char line; c -= 32;
for (line=0; line<6; line++ LCD_write_byte(font6x8[c][line], 1; }
/*----------------------------------------------------------------------- LCD_write_english_String : 英文字符串显示函数 输入参数:*s :英文字符串指针; X、Y : 显示字符串的位置,x 0-83 ,y 0-5 编写日期 :2004-8-10
最后修改日期 :2004-8-10
-----------------------------------------------------------------------*/
void LCD_write_english_string(unsigned char X,unsigned char Y,char *s {
LCD_set_XY(X,Y; while (*s {
LCD_write_char(*s; s++; } }
void wr4char(unsigned char x,unsigned char y,char *s { unsigned char i; LCD_set_XY(x,y;
for (i=0;i<4;i++{ LCD_write_char((*s+0x30;s++; } }
void wr2hex(unsigned char x,unsigned char y,unsigned char v {
unsigned char v1,v2; v1=v/10;v2=v%10; LCD_set_XY(x,y;
LCD_write_char(v1+0x30;LCD_write_char(v2+0x30; }
/*----------------------------------------------------------------------- LCD_write_chinese_string: 在LCD上显示汉字 输入参数:X、Y :显示汉字的起始X、Y坐标; ch_with :汉字点阵的宽度
num :显示汉字的个数; line :汉字点阵数组中的起始行数 row :汉字显示的行间距 编写日期 :2004-8-11 最后修改日期 :2004-8-12 测试:
LCD_write_chi(0,0,12,7,0,0; LCD_write_chi(0,2,12,7,0,0; LCD_write_chi(0,4,12,7,0,0;
-----------------------------------------------------------------------*/ void LCD_write_chinese_string(unsigned char X, unsigned char Y, unsigned char ch_with,unsigned char num, unsigned char line,unsigned char row {
unsigned char i,n;
LCD_set_XY(X,Y; //设置初始位置 for (i=0;i {
for (n=0; n 写一个汉字 {
if (n==ch_with //写汉字的下半部分 {
if (i==0 LCD_set_XY(X,Y+1; else
LCD_set_XY((X+(ch_with+row*i,Y+1; }
LCD_write_byte(write_chinese[line+i][n],1; } i++;
LCD_set_XY((X+(ch_with+row*i,Y; } }
/*----------------------------------------------------------------------- LCD_draw_map : 位图绘制函数
输入参数:X、Y :位图绘制的起始X、Y坐标; *map :位图点阵数据; Pix_x :位图像素(长) Pix_y :位图像素(宽) 编写日期 :2004-8-13 最后修改日期 :2004-8-13
-----------------------------------------------------------------------*/
void LCD_draw_bmp_pixel(unsigned char X,unsigned char Y,unsigned char *map, unsigned char Pix_x,unsigned char Pix_y {
unsigned int i,n; unsigned char row;
if (Pix_y%8==0 row=Pix_y/8; //计算位图所占行数 else
row=Pix_y/8+1; for (n=0;n {
LCD_set_XY(X,Y;
for(i=0; i {
LCD_write_byte(map[i+n*Pix_x], 1; } Y++; //换行 } }
/*----------------------------------------------------------------------- LCD_write_byte : 使用SPI接口写数据到LCD 输入参数:data :写入的数据; command :写数据/命令选择; 编写日期 :2004-8-10 最后修改日期 :2004-8-13
-----------------------------------------------------------------------*/ void LCD_write_byte(unsigned char dat, unsigned char command {
unsigned char i;
//PORTB &= ~LCD_CE ; // 使能LCD LCD_CE = 0; if (command == 0
// PORTB &= ~LCD_DC ; // 传送命令 LCD_DC = 0; else
// PORTB |= LCD_DC ; // 传送数据 LCD_DC = 1; for(i=0;i<8;i++
{ if(dat&0x80 SDIN = 1; else SDIN = 0; SCLK = 0; dat = dat << 1; SCLK = 1; }
// SPDR = data; // 传送数据到SPI寄存器 //while ((SPSR & 0x80 == 0; // 等待数据传送完毕 //PORTB |= LCD_CE ; // 关闭LCD LCD_CE = 1; }
因篇幅问题不能全部显示,请点此查看更多更全内容