STC_IRC15W207S驱动RGB灯珠,已经实现平滑调色、调亮度,包含多种显示模式。
制作出来的实物图如下:
电路原理图如下:
单片机源程序如下:
//#include "STC15.H"#include "config.h" #include "intrins.h" #include "eeprom.h" #include "UART.h" #include "RGB.h" //P3M1 = 0x80; // 10 000000 全部设置为双向IO口,弱上拉25K // P3M0 = 0x80; // 10 000000 sbit SW2 = P1^0; sbit SW1 = P1^1; sbit LED = P3^2; sbit Key = P3^3; unsigned char Flag_New=0; unsigned char Key_Count=0; #define Key_Count_Max 20 unsigned int idata Tick_Da=0; unsigned int idata Tick_100ms=0; // Red Orange Yellow Green Blue Purple // 绿色、红色、蓝色 unsigned char idata Std_Red[3] = {0 , 255, 0 }; unsigned char idata Std_Orange[3] = {128, 255, 0 }; unsigned char idata Std_Yellow[3] = {255, 255, 0 }; unsigned char idata Std_Green[3] = {255, 0 , 0 }; unsigned char idata Std_Cyan[3] = {255, 0 , 255}; unsigned char idata Std_Blue[3] = {0 , 0 , 255}; unsigned char idata Std_Purple[3] = {0 , 150 , 200}; unsigned char idata Std_Mid[3] = {150, 150, 255}; unsigned char idata Std_Light[3] = {255, 255, 255}; unsigned char idata Std_Dark[3] = {0 , 0, 0}; unsigned char idata Std_Quarter_Light[3] = {65, 65, 65}; unsigned char idata Std_Half_Light[3] = {127, 127, 127}; unsigned char idata Std_Low_Light[3] = {2, 2, 2}; unsigned char idata Std_Low_R[3] = {0, 2, 0}; unsigned char idata Std_Low_G[3] = {2, 0, 0}; unsigned char idata Std_Low_B[3] = {0, 0, 2}; // 13个LED unsigned char LED_[13][3]={0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0}; unsigned char Data_Now[3]= {0,0,0}; unsigned char Data_Bef[3]= {0,0,0}; unsigned char Boom_Now[3]= {0,0,0}; unsigned char Boom_Bef[3]= {0,0,0}; unsigned char Ts =0; void delay_ms(unsigned char ms); void DataInit(void); //======================================================================== // 函数: void delay_ms(unsigned char ms) // 描述: 延时函数。 // 参数: ms,要延时的ms数, 这里只支持1~255ms. 自动适应主时钟. // 返回: none. // 版本: VER1.0 // 日期: 2013-4-1 // 备注: //======================================================================== void delay_ms(unsigned int ms){ unsigned int i; do{ i = 2040 ; while(--i) ; } while(--ms); } // *************************************************************** // ** Function name: DataInit(void) // ** Descriptions: 数据初始化,从EEPROM读取默认值 // ** input parameters: 无 // ** output parameters: 无 // ** Returned value: 无 // *************************************************************** void DataInit(void) { // IapProgramByte(IAP_ADDRESS+EPM_D,0x00); Key_Count=IapReadByte(IAP_ADDRESS+EPM_A); if(Key_Count>=Key_Count_Max){ Key_Count=0; } } /********************************************************************** ** Function name: RGB_Light() ** Descriptions: ** input parameters: 无 ** output parameters: 无 ** Returned value: 无 **********************************************************************/ void Rainbow(unsigned char Tmp_Rd){ unsigned char Tb; unsigned char A0,A1,A2,A3,A4,A5,A6,A7,A8,A9,A10,A11,A12; // ********************************************************** // ** Descriptions: 选择 // ********************************************************** switch( Ts ){ case 0: { A0=0;A1=1;A2=2;A3=3;A4=4;A5=5;A6=6;A7=7;A8=8;A9=9;A10=10;A11=11;A12=12; } break; case 1: { A0=1;A1=2;A2=3;A3=4;A4=5;A5=6;A6=7;A7=8;A8=9;A9=10;A10=11;A11=12;A12=0; } break; case 2: { A0=2;A1=3;A2=4;A3=5;A4=6;A5=7;A6=8;A7=9;A8=10;A9=11;A10=12;A11=0;A12=1; } break; case 3: { A0=3;A1=4;A2=5;A3=6;A4=7;A5=8;A6=9;A7=10;A8=11;A9=12;A10=0;A11=1;A12=2; } break; case 4: { A0=4;A1=5;A2=6;A3=7;A4=8;A5=9;A6=10;A7=11;A8=12;A9=0;A10=1;A11=2;A12=3; } break; case 5: { A0=5;A1=6;A2=7;A3=8;A4=9;A5=10;A6=11;A7=12;A8=0;A9=1;A10=2;A11=3;A12=4; } break; case 6: { A0=6;A1=7;A2=8;A3=9;A4=10;A5=11;A6=12;A7=0;A8=1;A9=2;A10=3;A11=4;A12=5; } break; case 7: { A0=7;A1=8;A2=9;A3=10;A4=11;A5=12;A6=0;A7=1;A8=2;A9=3;A10=4;A11=5;A12=6; } break; default:{ A0=0;A1=1;A2=2;A3=3;A4=4;A5=5;A6=6;A7=7;A8=0;A9=1;A10=2;A11=3;A12=4; } break; } // end of switch LED_[A0][0]=Std_Red[0]; LED_[A0][1]=Std_Red[1]; LED_[A0][2]=Std_Red[2]; LED_[A1][0]=Std_Orange[0];LED_[A1][1]=Std_Orange[1];LED_[A1][2]=Std_Orange[2]; LED_[A2][0]=Std_Yellow[0];LED_[A2][1]=Std_Yellow[1];LED_[A2][2]=Std_Yellow[2]; LED_[A3][0]=Std_Green[0] ;LED_[A3][1]=Std_Green[1] ;LED_[A3][2]=Std_Green[2] ; LED_[A4][0]=Std_Cyan[0] ;LED_[A4][1]=Std_Cyan[1] ;LED_[A4][2]=Std_Cyan[2] ; LED_[A5][0]=Std_Blue[0] ;LED_[A5][1]=Std_Blue[1] ;LED_[A5][2]=Std_Blue[2] ; LED_[A6][0]=Std_Purple[0];LED_[A6][1]=Std_Purple[1];LED_[A6][2]=Std_Purple[2]; LED_[A7][0]=0xF0; LED_[A7][1]=0xF0; LED_[A7][2]=0xF0 ; LED_[A8][0]=Std_Red[0]; LED_[A8][1]=Std_Red[1]; LED_[A8][2]=Std_Red[2]; LED_[A9][0]=Std_Orange[0]; LED_[A9][1]=Std_Orange[1]; LED_[A9][2]=Std_Orange[2]; LED_[A10][0]=Std_Yellow[0]; LED_[A10][1]=Std_Yellow[1]; LED_[A10][2]=Std_Yellow[2]; LED_[A11][0]=Std_Green[0] ; LED_[A11][1]=Std_Green[1] ; LED_[A11][2]=Std_Green[2] ; LED_[A12][0]=Std_Cyan[0] ; LED_[A12][1]=Std_Cyan[1] ; LED_[A12][2]=Std_Cyan[2] ; for(Tb=0;Tb<RGB_Num;Tb++){ RGB_Send_24b(LED_[Tb][0],LED_[Tb][1],LED_[Tb][2]); } RGB_Reset(); if(Tmp_Rd==1){ Ts++; if(Ts>=8) Ts=0; } delay_ms(Time_Rb); delay_ms(Time_Rb); delay_ms(Time_Rb); } /********************************************************************** ** Function name: Boom(unsigned char Tmp_Rd) ** Descriptions: ** input parameters: 无 ** output parameters: 无 ** Returned value: 无 **********************************************************************/ void Boom(unsigned char Tb){ unsigned char Tc; switch( Tb ){ // ********************************************************** // ** Descriptions: Light // ********************************************************** case 0: { if((Boom_Bef[0]==Std_Low_Light[0])&&(Boom_Bef[1]==Std_Low_Light[1])&&(Boom_Bef[2]==Std_Low_Light[2])){ Boom_Now[0]++; Boom_Now[1]++; Boom_Now[2]++; if((Boom_Now[0]==Std_Light[0])&&(Boom_Now[1]==Std_Light[1])&&(Boom_Now[2]==Std_Light[2])){ Boom_Bef[0]=Std_Light[0];Boom_Bef[1]=Std_Light[1];Boom_Bef[2]=Std_Light[2]; delay_ms(Time_Hold_Lt); } delay_ms(Time_Boom_Lt); } else{ if((Boom_Bef[0]==Std_Light[0])&&(Boom_Bef[1]==Std_Light[1])&&(Boom_Bef[2]==Std_Light[2])){ Boom_Now[0]--; Boom_Now[1]--; Boom_Now[2]--; if((Boom_Now[0]==Std_Low_Light[0])&&(Boom_Now[1]==Std_Low_Light[1])&&(Boom_Now[2]==Std_Low_Light[2])){ Boom_Bef[0]=Std_Low_Light[0];Boom_Bef[1]=Std_Low_Light[1];Boom_Bef[2]=Std_Low_Light[2]; delay_ms(Time_Hold_Dk); } delay_ms(Time_Boom_Dk); } else{ Boom_Bef[0]=Std_Low_Light[0];Boom_Bef[1]=Std_Low_Light[1];Boom_Bef[2]=Std_Low_Light[2]; } } } break; // ********************************************************** // ** Descriptions: R Std_Low_R[3] = {0, 2, 0};
复制代码