STC_IRC15W207S驱动RGB灯珠,已经实现平滑调色、调亮度,包含多种显示模式。
制作出来的实物图如下:
1.jpg

电路原理图如下:
2.png

单片机源程序如下:

//#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};
  • 复制代码