一、引言 日常生活中的氛围灯可以变化不同的色彩,利用的就是RGB全色LED灯。 二、功能介绍 RGBLED灯是一种由红色、绿色和蓝色三种基本颜色组成的LED灯,通过混合这三种颜色可以产生多种不同的颜色效果。每个RGBLED灯有三个引脚,分别控制红、绿、蓝三色LED的亮度,通过PWM(脉冲宽度调制)技术可以调节每种颜色的亮度,从而实现丰富的颜色变化。 RGBLED灯具有以下功能特点: 1. 多色显示:通过控制不同颜色LED的亮度和混合,可以创造出丰富多彩的光效。 2. 亮度调节:每个灯光具有255级亮度调节能力,可以通过PWM占空比来实现对亮度的精细控制。 3. 稳定性高:RGBLED灯的光衰较慢,寿命较长,响应时间快,适用于各种动态光照场景。 4. 环保安全:RGBLED灯不含有害金属汞,采用低压电源,更加安全环保。 此外,RGBLED灯还可以通过编程实现更复杂的效果。实现了通过编写代码来控制RGBLED灯的颜色变化、闪烁模式等 三、硬件介绍 系统由EKT043E开发板、T5L芯片、RGB灯驱动、线材等组成。 四、界面设计 基于迪文软件DGUS进行页面开发,设计开屏动画、颜色选择、功能说明等界面
五、代码设计 #include "sys.h" #define T0_PERIOD_1MS 0xFF54 //设置10us的定时周期 void timer0_init(){ TMOD &= 0xFC; TMOD |= 0x01; TH0 = (u8)(T0_PERIOD_1MS >> 8); TL0 = (u8)T0_PERIOD_1MS; ET0 = 1;//使能定时器0中断 EA = 1;//使能总中断 TR0 = 1;//启动定时器0 } u16 r, g, b, count1, count2, count3,MOD,num,temp; sbit RED = P2 ^ 0;//红光控制端,0点亮 sbit GREEN = P2 ^ 1;//绿光控制端,0点亮 sbit BLUE = P2 ^ 2;//蓝光控制端,0点亮 void io_init(){ PORTDRV = 0x02; //输出电流为16mA P2MDOUT |= 0x07; //设置IO口P1.0、P1.1、P1.2为输出 } void RGB(u8 R, u8 G, u8 B){ if (count1 < R) { RED = 1; } else RED = 0; if (count2 < G) { GREEN = 1; } else GREEN = 0; if (count3 < B) { BLUE = 1; } else BLUE = 0; } void fun_read(u16 *r, u16 *g, u16 *b) { sys_read_vp(0x4100, (u8*)r, 1);//读出变量地址上的值赋给RGB()函数,点亮灯 sys_read_vp(0x4200, (u8*)g, 1);// sys_read_vp(0x4300, (u8*)b, 1);// } void fun_write(u16 r, u16 g, u16 b) { sys_write_vp(0x4100, (u8*)&r, 1); sys_write_vp(0x4200, (u8*)&g, 1); sys_write_vp(0x4300, (u8*)&b, 1); } void init() { sys_init();//系统初始化 io_init(); timer0_init(); r = 0; g = 0; b = 0; count1 = 0; count2 = 0; count3 = 0; num = 0; } void set(u16 a1, u16 a2, u16 a3) { r = a1; g = a2; b = a3; } void fun(u16 x) { switch (x){ case 1:set(0x0078, 0x003c, 0x0078); break; case 2:set(0x000c, 0x001e, 0x001a); break; case 3:set(0x0066, 0x0066, 0x0066); break; case 4:set(0x0058, 0x0008, 0x0008); break; case 5:set(0x00f0, 0x003c, 0x001e); break; case 6:set(0x003c, 0x001e, 0x00f0); break; case 7:set(0x001e, 0x003c, 0x00f0); break; case 8:set(0x005a, 0x0078, 0x003c); break; case 9:set(0x00b4, 0x0078, 0x003c); break; case 10:set(0x00b4, 0x0078, 0x001e); break; case 11:set(0x003c, 0x0096, 0x0028); break; case 12:set(0x0096, 0x0064, 0x0032); break; case 13:set(0x0032, 0x0064, 0x00fa); break; case 14:set(0x0064, 0x0032, 0x00fa); break; case 15:set(0x00c8, 0x000a, 0x0032); break; case 16:set(0x000a, 0x00c8, 0x0032); break; default:set(0x0006, 0x0006, 0x0006);break; } } void main(void) { init(); while (1) { sys_read_vp(0x1000, (u8*)&MOD, 1); sys_read_vp(0x2000, (u8*)&num, 1); switch (MOD) { case 5://闪烁 sys_delay_ms(100); break; case 7: fun(num); fun_write(r, g, b); RGB(r,g,b); break; default: break; } fun_read(&r, &g, &b); RGB(r, g, b);} } void timer0_isr() interrupt 1 { TH0 = (u8)(T0_PERIOD_1MS >> 8); TL0 = (u8)T0_PERIOD_1MS; count1++; count2++; count3++; if (count1 == 255)count1 = 0; if (count2 == 255)count2 = 0; if (count3 == 255)count3 = 0; } 六、接口连接 P2.0,P2.1,P2.2三个引脚分别连接R G B,另外一个引脚接地。 七、系统实现与测试 在程序中设定好了几种固定配色,可以通过色盘直接调节,通过软件控制方式实现闪烁及呼吸灯效。通过RGB值改变电压,从而改变红绿蓝三个灯的亮度,进而起到整体改变颜色的效果
|