单片机rgb调色程序_单片机 rgb 程序 - CSDN
  • STC15单片机 模块化程序 关于RGB灯的设计,自己写了一个手机APP通过蓝牙控制RGB灯的颜色变化   pcb下载 电路图: PCB.rar (4.52 MB, 下载次数: 92)  stc15单片机完整源程序下载: 彩灯.rar (109.72 ...

    http://www.51hei.com/bbs/dpj-42269-1.html

    STC15单片机 模块化程序 关于RGB灯的设计,自己写了一个手机APP通过蓝牙控制RGB灯的颜色变化
     


    pcb下载 电路图:  PCB.rar (4.52 MB, 下载次数: 92) 
    stc15单片机完整源程序下载:  彩灯.rar (109.72 KB, 下载次数: 115) 


    下面是部分程序预览:
    anjian.c
    1. /********************************************************************                                                                                                  *
    2. *文件名:ANJIAN.c
    3. *文件描述:按键控制LED的颜色变化
    4. *创建作者:庞登辉
    5. *创建日期:2015/11/28
    6. *创建版本号:V1.0
    7. *******************************************************************/
    8. #include"ANJIAN.h"
    9. /********************************************************************
    10. *函数名: void AnJan_Kong(void)
    11. *函数功能:        手机按键控制RGB灯的颜色
    12. *输入参数:无
    13. *返回参数:void
    14. *函数使用注意事项:初始化
    15. *********************************************************************/
    16. void AnJan_Kong(void)
    17. {        if(biaozhi==1)
    18. {
    19.         if(SBUF=='e') //红色
    20.         {
    21.                 CCAP0H = CCAP0L = 255; //绿色PWM(三极管电路设计时PWM大导通小亮度弱)
    22.                 CCAP1H = CCAP1L = 0; //红色PWM
    23.                 CCAP2H = CCAP2L = 255; //蓝色PWM
    24.                 rgb[1] = 0; //绿色PWM(三极管电路设计时PWM大导通小亮度弱)
    25.                 rgb[0] = 255; //红色PWM
    26.                 rgb[2] = 0; //蓝色PWM
    27.         }
    28.         if(SBUF=='f') //绿色
    29.         {
    30.                 CCAP0H = CCAP0L = 0; //绿色PWM(三极管电路设计时PWM大导通小亮度弱)
    31.                 CCAP1H = CCAP1L = 255; //红色PWM
    32.                 CCAP2H = CCAP2L = 255; //蓝色PWM
    33.                 rgb[1] = 255; //绿色PWM(三极管电路设计时PWM大导通小亮度弱)
    34.                 rgb[0] = 0; //红色PWM
    35.                 rgb[2] = 0; //蓝色PWM
    36.         }
    37.         if(SBUF=='g') //蓝色
    38.         {
    39.                 CCAP0H = CCAP0L = 255; //绿色PWM(三极管电路设计时PWM大导通小亮度弱)
    40.                 CCAP1H = CCAP1L = 255; //红色PWM
    41.                 CCAP2H = CCAP2L = 0; //蓝色PWM
    42.                 rgb[1] = 0; //绿色PWM(三极管电路设计时PWM大导通小亮度弱)
    43.                 rgb[0] = 0; //红色PWM
    44.                 rgb[2] = 255; //蓝色PWM
    45.         }
    46.         if(SBUF=='h') //半红色
    47.         {
    48.                 CCAP0H = CCAP0L = 255; //绿色PWM(三极管电路设计时PWM大导通小亮度弱)
    49.                 CCAP1H = CCAP1L = 128; //红色PWM
    50.                 CCAP2H = CCAP2L = 255; //蓝色PWM
    51.                 rgb[1] = 0; //绿色PWM(三极管电路设计时PWM大导通小亮度弱)
    52.                 rgb[0] = 127; //红色PWM
    53.                 rgb[2] = 0; //蓝色PWM
    54.         }
    55.         if(SBUF=='i') //半绿色
    56.         {
    57.                 CCAP0H = CCAP0L = 128; //绿色PWM(三极管电路设计时PWM大导通小亮度弱)
    58.                 CCAP1H = CCAP1L = 255; //红色PWM
    59.                 CCAP2H = CCAP2L = 255; //蓝色PWM
    60.                 rgb[1] = 127; //绿色PWM(三极管电路设计时PWM大导通小亮度弱)
    61.                 rgb[0] = 0; //红色PWM
    62.                 rgb[2] = 0; //蓝色PWM
    63.         }
    64.         if(SBUF=='j') //半蓝色
    65.         {
    66.                 CCAP0H = CCAP0L = 255; //绿色PWM(三极管电路设计时PWM大导通小亮度弱)
    67.                 CCAP1H = CCAP1L = 255; //红色PWM
    68.                 CCAP2H = CCAP2L = 128; //蓝色PWM
    69.                 rgb[1] = 0; //绿色PWM(三极管电路设计时PWM大导通小亮度弱)
    70.                 rgb[0] = 0; //红色PWM
    71.                 rgb[2] = 127; //蓝色PWM
    72.         }
    73.         if(SBUF=='k') //黄色
    74.         {
    75.                 CCAP0H = CCAP0L = 0; //绿色PWM(三极管电路设计时PWM大导通小亮度弱)
    76.                 CCAP1H = CCAP1L = 0; //红色PWM
    77.                 CCAP2H = CCAP2L = 255; //蓝色PWM
    78.                 rgb[1] = 255; //绿色PWM(三极管电路设计时PWM大导通小亮度弱)
    79.                 rgb[0] = 255; //红色PWM
    80.                 rgb[2] = 0; //蓝色PWM
    81.         }
    82.         if(SBUF=='l') //蓝绿色
    83.         {
    84.                 CCAP0H = CCAP0L = 0; //绿色PWM(三极管电路设计时PWM大导通小亮度弱)
    85.                 CCAP1H = CCAP1L = 255; //红色PWM
    86.                 CCAP2H = CCAP2L = 0; //蓝色PWM
    87.                 rgb[1] = 255; //绿色PWM(三极管电路设计时PWM大导通小亮度弱)
    88.                 rgb[0] = 0; //红色PWM
    89.                 rgb[2] = 255; //蓝色PWM
    90.         }
    91.         if(SBUF=='p') //白色
    92.         {
    93.                 CCAP0H = CCAP0L = 0; //绿色PWM(三极管电路设计时PWM大导通小亮度弱)
    94.                 CCAP1H = CCAP1L = 0; //红色PWM
    95.                 CCAP2H = CCAP2L = 0; //蓝色PWM
    96.                 rgb[1] = 255; //绿色PWM(三极管电路设计时PWM大导通小亮度弱)
    97.                 rgb[0] = 255; //红色PWM
    98.                 rgb[2] = 255; //蓝色PWM
    99.         }
    100.         if(SBUF=='o') //粉红色
    101.         {
    102.                 CCAP0H = CCAP0L = 255; //绿色PWM(三极管电路设计时PWM大导通小亮度弱)
    103.                 CCAP1H = CCAP1L = 0; //红色PWM
    104.                 CCAP2H = CCAP2L = 0; //蓝色PWM
    105.                 rgb[1] = 0; //绿色PWM(三极管电路设计时PWM大导通小亮度弱)
    106.                 rgb[0] = 255; //红色PWM
    107.                 rgb[2] = 255; //蓝色PWM
    108.         }        
    109.         if(SBUF=='n') //天蓝色
    110.         {
    111.                 CCAP0H = CCAP0L = 128; //绿色PWM(三极管电路设计时PWM大导通小亮度弱)
    112.                 CCAP1H = CCAP1L = 255; //红色PWM
    113.                 CCAP2H = CCAP2L = 0; //蓝色PWM
    114.                 rgb[1] = 127; //绿色PWM(三极管电路设计时PWM大导通小亮度弱)
    115.                 rgb[0] = 0; //红色PWM
    116.                 rgb[2] = 255; //蓝色PWM
    117.         }
    118.         if(SBUF=='m') //紫色
    119.         {
    120.                 CCAP0H = CCAP0L = 250; //绿色PWM(三极管电路设计时PWM大导通小亮度弱)
    121.                 CCAP1H = CCAP1L = 133; //红色PWM
    122.                 CCAP2H = CCAP2L = 148; //蓝色PWM
    123.                 rgb[1] = 0; //绿色PWM(三极管电路设计时PWM大导通小亮度弱)
    124.                 rgb[0] = 117; //红色PWM
    125.                 rgb[2] = 102; //蓝色PWM
    126.         }
    127.         }
    128. }
    129. /********************************************************************
    130. *函数名: void RGB_Led_Process(void)
    131. *函数功能:        手机按键控制RGB灯的颜色的进程函数
    132. *输入参数:无
    133. *返回参数:void
    134. *函数使用注意事项:初始化
    135. *********************************************************************/
    136. void RGB_Led_Process(void)
    137. {
    138.         CCAP0H = CCAP0L = 255-rgb[1]; //绿色PWM(三极管电路设计时PWM大导通小亮度弱)
    139.         CCAP1H = CCAP1L = 255-rgb[0]; //红色PWM
    140.         CCAP2H = CCAP2L = 255-rgb[2]; //蓝色PWM
    141.         AnJan_Kong();
    142.         SendData_Uart1(re[2]);

    143. }
    复制代码

    gsm.c
    1. /********************************************************************                                                                                                  *
    2. *文件名:GSM.c
    3. *文件描述:STC15串口外设函数
    4. *创建作者:庞登辉
    5. *创建日期:2015/11/28
    6. *创建版本号:V1.0
    7. *******************************************************************/
    8. #include "GSM.h"
    9. #include <string.H>
    10. #include <intrins.h>
    11. uchar XinXi = 0;


    12. /********************************************************************
    13. *函数名: uchar hand(uchar *ptr)
    14. *函数功能:        检测接收字符串
    15. *输入参数:        *ptr 要检测的字符串
    16. *返回参数:uchar
    17. *函数使用注意事项:接收数据通过中断完成
    18. *********************************************************************/
    19. uchar hand(uchar *ptr)
    20. {
    21.         if(strstr(rec_data,ptr)!=NULL)//strstr(char *str1, char *str2);找出str2字符串在
    22.                                                                 //str1字符串中第一次出现的位置(不包括str2的串结束符)。
    23.                                                                 //返回值:返回该位置的指针,如找不到,返回空指针。
    24.                 return 1;
    25.         else
    26.                 return 0;
    27. }

    28. /********************************************************************
    29. *函数名: void clear_rec_data(void)
    30. *函数功能:        清除接收的字符串
    31. *输入参数:无
    32. *返回参数:void
    33. *函数使用注意事项:接收数据通过中断完成
    34. *********************************************************************/
    35. void clear_rec_data(void)
    36. {
    37.         uchar i;
    38.         for(i=0;i<strlen(rec_data);i++)
    39.         {
    40.                 rec_data[i] = '0';
    41.         }
    42.         rec_num = 0;
    43. }
    44. /********************************************************************
    45. *函数名: void JieShou_Sing_Process(void)
    46. *函数功能:        接收手机信息进程函数
    47. *输入参数:无
    48. *返回参数:void
    49. *函数使用注意事项:接收数据通过中断完成
    50. *********************************************************************/
    51. void JieShou_Sing_Process(void)
    52. {
    53.         if(hand("+GMTI"))//如果有短信发来就为1
    54.         {
    55.                 clear_rec_data(); //清除接收的字符
    56.                 SendString_Uart2("AT+CMGR=1\r\n");//发送读取信息
    57.                 delay_ms(1);        
    58.                 if(S2BUF=='H') //信息有用信息的标记为后面接有用信息
    59.                 {
    60.                         XinXi = rec_data[rec_num];//把有用的信号给变量XinXi                
    61.                 }
    62.                 clear_rec_data(); 清除接收的字符
    63.                    SendString_Uart2("AT+CMGD=1\r\n");//删除短信以防空间不足
    64.         }
    65. }
    66. /********************************************************************
    67. *函数名: void Send_Sing_Process(void)
    68. *函数功能:        发送手机信息进程函数
    69. *输入参数:无
    70. *返回参数:void
    71. *函数使用注意事项:接收数据通过中断完成
    72. *********************************************************************/
    73. void Send_Sing_Process(void)
    74. {
    75.          SendString_Uart2("AT+CSCS=\"GSM\"\r\n");
    76.     delay_s(1);//延时大约1秒
    77.     SendString_Uart2("AT+CMGF=1\r\n");
    78.     delay_s(1);//延时1秒
    79.         SendString_Uart2("AT+CSCA?\r\n");
    80.     delay_s(1);//延时1秒
    81.         SendString_Uart2("AT+CSMP=17,167,0,240\r\n");
    82.     delay_s(1);//延时1秒
    83.     SendString_Uart2("AT+CMGS=\"13557032914\"\r\n");//此处修改为对方的电话号
    84.     delay_s(1);//延时1秒
    85.     SendString_Uart2("HELLO");//修改短信内容,短信内容可为英文和数字
    86.     SendData_Uart2(0x1a);
    87.     delay_s(15);//延时15秒
    88. }
    复制代码

    OTHER_FUNCTION.c
    1. /********************************************************************                                                                                                  *
    2. *文件名:OTHER_FUNCTION.c
    3. *文件描述:STC15串口外设函数
    4. *创建作者:庞登辉
    5. *创建日期:2015/11/28
    6. *创建版本号:V1.0
    7. *******************************************************************/
    8. #include "OTHER_FUNCTION.h"
    9. uchar biaozhi = 0;
    10. /********************************************************************
    11. *函数名: void Other_Led(void)
    12. *函数功能:        手机控制其它灯的颜色
    13. *输入参数:无
    14. *返回参数:void
    15. *函数使用注意事项:初始化
    16. *********************************************************************/
    17. void Other_Led(void)
    18. {
    19.         if(biaozhi==1)
    20.         {
    21.                 if(SBUF=='A')//开台灯
    22.                 {
    23.                         TDLed = 0;
    24.                 }
    25.                 if(SBUF=='C')//开浴室灯
    26.                 {
    27.                         YSLed = 0;
    28.                 }
    29.                 if(SBUF=='Z')//开卧室灯
    30.                 {
    31.                         WSLed = 0;
    32.                 }
    33.                 if(SBUF=='M')//开大厅灯
    34.                 {
    35.                         DTLed = 0;
    36.                 }
    37.                 if(SBUF=='F')//关台灯
    38.                 {
    39.                         TDLed = 1;
    40.                 }
    41.                 if(SBUF=='G')//关浴室灯
    42.                 {
    43.                         YSLed = 1;
    44.                 }
    45.                 if(SBUF=='H')//关卧室灯
    46.                 {
    47.                         WSLed = 1;
    48.                 }
    49.                 if(SBUF=='N')//关大厅灯
    50.                 {
    51.                         DTLed = 1;
    52.                 }
    53.         }                
    54. }
    55. /********************************************************************
    56. *函数名: void Music_Out(void)
    57. *函数功能:        手机控制播放音乐函数
    58. *输入参数:无
    59. *返回参数:void
    60. *函数使用注意事项:初始化
    61. *********************************************************************/
    62. void Music_Out(void)
    63. {
    64.         if(biaozhi==1)
    65.         {
    66.                 if(SBUF=='B')
    67.                 {
    68.                         Uart_SendCMD(0x0d , 0 , 0x00) ;//播放
    69.                         delay_ms(100) ;//延时大概100MS
    70.                 }
    71.                 if(SBUF=='T')
    72.                 {
    73.                         Uart_SendCMD(0x0e , 0 , 0x00) ;//暂停
    74.                         delay_ms(100) ;//延时大概100MS        
    75.                 }
    76.                 if(SBUF=='S')
    77.                 {
    78.                         Uart_SendCMD(0x02 , 0 , 0x00) ;//上一曲
    79.                         delay_ms(100) ;//延时大概100MS
    80.                 }
    81.                 if(SBUF=='X')
    82.                 {
    83.                         Uart_SendCMD(0x01 , 0 , 0x00) ;//下一曲
    84.                         delay_ms(100) ;//延时大概100MS        
    85.                 }
    86.         }
    87. }
    88. /********************************************************************
    89. *函数名: void Music_Out(void)
    90. *函数功能:        手机控制播放音乐函数
    91. *输入参数:无
    92. *返回参数:void
    93. *函数使用注意事项:初始化
    94. *********************************************************************/
    95. void HongWai_BJ(void)
    96. {
    97.         if(HWBZ==0)
    98.         {
    99.                 while(!HWBZ);
    100.                 Send_Sing_Process();
    101.                 HWBZ = 1;
    102.         }
    103. }
    104. /********************************************************************
    105. *函数名: void Music_Out(void)
    106. *函数功能:        手机控制其它所有应用进程函数
    107. *输入参数:无
    108. *返回参数:void
    109. *函数使用注意事项:初始化
    110. *********************************************************************/
    111. void Other_All_Process(void)
    112. {
    113.         Music_Out(); //播放音乐
    114.         Other_Led(); //控制其他等
    115.         HongWai_BJ();//红外报警,发短信给手机        
    116. }
    复制代码

    STC15_UART.c
    1. /********************************************************************                                                                                                  *
    2. *文件名:STC15_UART.c
    3. *文件描述:STC15串口外设函数
    4. *创建作者:庞登辉
    5. *创建日期:2015/11/28
    6. *创建版本号:V1.0
    7. *******************************************************************/
    8. #include "STC15_UART.h"
    9. #include "process.h"
    10. #define uint unsigned int
    11. #define uchar unsigned char
    12. static INT8U Send_buf[10] = {0} ;
    13. static INT8U Recv_buf[10] = {0} ;
    14. bit busy_uart1;

    15. #define S2_S0 0x01              //P_SW2.0               //中断控制寄存器2
    16. bit busy_uart2;
    17. uchar  re[4]={0};
    18. uchar  rgb[3]={255,255,255};
    19. uchar count=1;//

    20. uchar rec_data[50] = {0};        //以下是GSM模块返回数据
    21. uchar rec_num=0;        //串口2收到数据的个数
    22.         

    23. /********************************************************************
    24. *函数名: void UART1_Init(void)
    25. *函数功能:        串口1初始化
    26. *输入参数:无
    27. *返回参数:void
    28. *函数使用注意事项:初始化
    29. *********************************************************************/
    30. void UART1_Init(void){

    31.     #if(PARITYBIT == NONE_PARITY)
    32.             SCON = 0x50;
    33.         #elif(PARITYBIT == ODD_PARITY) || (PARITYBIT == EVEN_PARITY) || (PARITYBIT == MARK_PARITY)
    34.             SCON = 0xda;
    35.         #elif(PARITYBIT == SPACE_PARITY)
    36.             SCON = 0xd2;
    37.     #endif
    38.         AUXR &= 0xFF;
    39.         AUXR |= 0x54;
    40.         TMOD = 0x00;
    41.         TL1 = (65536-(MAIN_Fosc/4/BAUD_UART1));
    42.         TH1 = (65536-(MAIN_Fosc/4/BAUD_UART1))>>8;

    43.         TR1 = 1;
    44.         ES = 1;
    45.         EA = 1;
    46. }
    47. /********************************************************************
    48. *函数名: void SendData_Uart1(uchar dat)
    49. *函数功能:        串口发送数据
    50. *输入参数:dat
    51. *返回参数:void
    52. *函数使用注意事项:单个数据
    53. *********************************************************************/
    54. void SendData_Uart1(uchar dat)
    55. {

    56.         while(busy_uart1);                 //等待之前数据发送完成
    57.         ACC = dat;        
    58.         
    59.         if (P)                      //根据P来设置校验位
    60.     {
    61.                 #if (PARITYBIT == ODD_PARITY)
    62.                        TB8 = 0;                //设置校验位为0
    63.                 #elif (PARITYBIT == EVEN_PARITY)
    64.                 TB8 = 1;                //设置校验位为1
    65.                 #endif
    66.             }
    67.             else
    68.             {
    69.                 #if (PARITYBIT == ODD_PARITY)
    70.                 TB8 = 1;                //设置校验位为1
    71.                 #elif (PARITYBIT == EVEN_PARITY)
    72.                 TB8 = 0;                //设置校验位为0
    73.                 #endif                         //计算偶校检位 P
    74.          }
    75.         busy_uart1 = 1;                          //忙标志位置 1
    76.         SBUF = ACC;                                  //发送数据到串口缓冲区
    77. }

    78. /********************************************************************
    79. *函数名: void Uart_Isr()interrupt 4
    80. *函数功能:        串口中断服务函数
    81. *输入参数:无
    82. *返回参数:void
    83. *函数使用注意事项:接收数据通过中断完成
    84. *********************************************************************/
    85. void Uart_Isr()interrupt 4 using 1
    86. {
    87.         if(RI)
    88.         {
    89.                 RI = 0;                                //清除接收中断标志
    90.         }
    91.         if(TI)
    92.         {
    93.                 TI = 0;                           //清除传输中断标志
    94.                 busy_uart1 = 0;           //清除传输忙标志
    95.                 if(count==1&&(SBUF=='a'||SBUF=='b'||SBUF=='c'))//蓝牙发送字符判断RGB的标志 
    96.                 {
    97.                         re[count] = SBUF; 
    98.                 }
    99.                 else 
    100.                 {
    101.                         if(SBUF == 'd') //发送有效数据完毕标志
    102.                         {
    103.                                 count = 0;        
    104.                         }
    105.                         else
    106.                         {
    107.                                 re[2] = SBUF;  //用来接收有用的数据
    108.                                 if(re[1]=='a') //字符为a就给rgb[0]发送数据(rgb[0]为红色的PWM)
    109.                                 {
    110.                                         rgb[0] = re[2];
    111.                                 } 
    112.                                 if(re[1]=='b') //字符为a就给rgb[1]发送数据(rgb[1]为绿色的PWM)
    113.                                 {
    114.                                         rgb[1] = re[2];
    115.                                 }
    116.                                 if(re[1]=='c')        //字符为a就给rgb[2]发送数据(rgb[2]为蓝色的PWM)
    117.                                 {
    118.                                         rgb[2] = re[2];
    119.                                 }
    120.                         }
    121.                 }
    122.                 count++;        
    123.         }
    124. }


    125. /********************************************************************
    126. *函数名: void UART2_Init(void)
    127. *函数功能:        串口2初始化
    128. *输入参数:无
    129. *返回参数:void
    130. *函数使用注意事项:初始化
    131. *********************************************************************/
    132. void UART2_Init(void) //初始化串口2
    133. {

    134. //    P_SW2 &= ~S2_S0;            //S2_S0=0 (P1.0/RxD2, P1.1/TxD2)
    135.           P_SW2 |= S2_S0;                //S2_S0=1 (P4.6/RxD2_2, P4.7/TxD2_2)
    136.                                                    

    137. #if (PARITYBIT == NONE_PARITY)
    138.     S2CON = 0x50;               //8位可变波特率
    139. #elif (PARITYBIT == ODD_PARITY) || (PARITYBIT == EVEN_PARITY) || (PARITYBIT == MARK_PARITY)
    140.     S2CON = 0xda;               //9位可变波特率,校验位初始为1
    141. #elif (PARITYBIT == SPACE_PARITY)
    142.     S2CON = 0xd2;               //9位可变波特率,校验位初始为0
    143. #endif

    144.     T2L = (65536 - (MAIN_Fosc/4/BAUD_UART2));   //设置波特率重装值
    145.     T2H = (65536 - (MAIN_Fosc/4/BAUD_UART2))>>8;
    146.         AUXR &= 0xFF;
    147.         AUXR |= 0x14;               //T2为1T模式, 并启动定时器2
    148.     IE2 = 0x01;                 //使能串口2中断
    149.     EA = 1;
    150. }

    151. /*----------------------------
    152. UART2 中断服务程序
    153. -----------------------------*/
    154. void Uart2() interrupt 8 using 1
    155. {  
    156.         uchar temp;
    157.     if (S2CON & S2RI)
    158.     {
    159.         S2CON &= ~S2RI;         //清除S2RI位
    160.                 /*接收短信*/
    161.                 temp = S2BUF;
    162.                 rec_data[rec_num++]=temp;
    163.                 if(rec_num>=50)
    164.                 rec_num=0;        
    165.     }
    166.     if (S2CON & S2TI)
    167.     {
    168.         S2CON &= ~S2TI;         //清除S2TI位
    169.         busy_uart2 = 0;               //清忙标志
    170.     }
    171. }

    172. /*----------------------------
    173. 发送串口2数据
    174. ----------------------------*/
    175. void SendData_Uart2(BYTE dat)
    176. {
    177.     while (busy_uart2);               //等待前面的数据发送完成
    178.     ACC = dat;                  //获取校验位P (PSW.0)
    179.     if (P)                      //根据P来设置校验位
    180.     {
    181. #if (PARITYBIT == ODD_PARITY)
    182.         S2CON &= ~S2TB8;        //设置校验位为0
    183. #elif (PARITYBIT == EVEN_PARITY)
    184.         S2CON |= S2TB8;         //设置校验位为1
    185. #endif
    186.     }
    187.     else
    188.     {
    189. #if (PARITYBIT == ODD_PARITY)
    190.         S2CON |= S2TB8;         //设置校验位为1
    191. #elif (PARITYBIT == EVEN_PARITY)
    192.         S2CON &= ~S2TB8;        //设置校验位为0
    193. #endif
    194.     }
    195.     busy_uart2 = 1;
    196.     S2BUF = ACC;                //写数据到UART2数据寄存器
    197. }
    198. /********************************************************************
    199. *函数名: void SendString_Uart1(char *s)
    200. *函数功能:        发送字符串函数
    201. *输入参数:无
    202. *返回参数:void
    203. *函数使用注意事项:
    204. *********************************************************************/
    205. void SendString_Uart2(char *s)
    206. {
    207.         while(*s)
    208.         {
    209.                 SendData_Uart2(*s++);        
    210.         }
    211. }
    212. /*****************************************************************************************************
    213. - 功能描述: 串口发送一帧数据(MP3播放音乐(串口方式(用串口1)))
    214. - 隶属模块: 内部 
    215. - 参数说明: 
    216. - 返回说明: 
    217. - 注:无     
    218. *****************************************************************************************************/
    219. void SendCmd(INT8U len)
    220. {
    221.     INT8U i = 0 ;
    222.         delay_us(100);
    223.     SendData_Uart1(0x7E); //起始
    224.     for(i=0; i<len; i++)//数据
    225.     {
    226.                 SendData_Uart1(Send_buf[i]) ;
    227.                 delay_us(100);
    228.     }
    229.     SendData_Uart1(0xEF) ;//结束
    230.         delay_us(100);
    231. }
    232. /********************************************************************************************
    233. - 功能描述:求和校验
    234. - 隶属模块:
    235. - 参数说明:
    236. - 返回说明:
    237. - 注:      和校验的思路如下
    238.              发送的指令,去掉起始和结束。将中间的6个字节进行累加,最后取反码
    239.              接收端就将接收到的一帧数据,去掉起始和结束。将中间的数据累加,再加上接收到的校验
    240.              字节。刚好为0.这样就代表接收到的数据完全正确。
    241. ********************************************************************************************/
    242. void DoSum( INT8U *Str, INT8U len)
    243. {
    244.     INT16U xorsum = 0;
    245.     INT8U i;

    246.     for(i=0; i<len; i++)
    247.     {
    248.         xorsum  = xorsum + Str[i];
    249.     }
    250.         xorsum     = 0 -xorsum;
    251.         *(Str+i)   = (INT8U)(xorsum >>8);
    252.         *(Str+i+1) = (INT8U)(xorsum & 0x00ff);
    253. }


    254. /********************************************************************************************
    255. - 功能描述: 串口向外发送命令[包括控制和查询]
    256. - 隶属模块: 外部
    257. - 参数说明: CMD:表示控制指令,请查阅指令表,还包括查询的相关指令
    258.               feedback:是否需要应答[0:不需要应答,1:需要应答]
    259.               data:传送的参数
    260. - 返回说明:
    261. - 注:       
    262. ********************************************************************************************/
    263. void Uart_SendCMD(INT8U CMD ,INT8U feedback , INT16U dat)
    264. {
    265.     Send_buf[0] = 0xff;    //保留字节 
    266.     Send_buf[1] = 0x06;    //长度
    267.     Send_buf[2] = CMD;     //控制指令
    268.     Send_buf[3] = feedback;//是否需要反馈
    269.     Send_buf[4] = (INT8U)(dat >> 8);//datah
    270.     Send_buf[5] = (INT8U)(dat);     //datal
    271.     DoSum(&Send_buf[0],6);        //校验
    272.     SendCmd(8);       //发送此帧数据
    273. }

    复制代码


    展开全文
  • //------------------------------------------------------------------------------------ // Main.c //------------------------------------------------------------------------------------ ...

    //------------------------------------------------------------------------------------
    // Main.c
    //------------------------------------------------------------------------------------
    // Copyright (C) 2013 Shenyang JYXD.
    //  WEN BO RUI
    // Tool chain: KEIL Full  'c'
    //
    //#pragma CD OE DB SB       // Compilation directives
    #include<reg2051.h>
    #include<intrins.h>
    #define uchar unsigned char
    #define uint  unsigned int
    uint  Period;                 //Period刷新周期
    uint  PWM;
    uint  Pulse;         //脉冲个数
    uchar Speed;         //速度变量
    uchar count;
    uint excount;
    bit Gra;          //渐变/跳变总控制位
    bit Gra7;          //七彩渐亮渐灭控制位
    bit Gra3;          //红绿蓝渐亮渐灭控制位
    bit BP;           //亮到暗,暗到亮转换位
    bit LEDdelay ;                                //LED定时到标志位 
    sbit key1 = P3^1;           //花样组合键1  
    sbit key2 = P3^0;             //花样组合键2 
    sbit key3 = P3^5;             //速度组合键1
    sbit key4 = P3^4;        //速度组合键2
    uchar led1[12]={0x10,0x030,0x20,0x60,0x40,0x50,0x70,0x50,0x40,0x60,0x20,0x30};//红、黄、绿、青、蓝、粉、白、粉、蓝、青、绿、黄
    uchar led2[24]={0x10,0x00,0x30,0x00,0x20,0x00,0x60,0x00,0x40,0x00,0x50,0x00,
        0x70,0x00,0x50,0x00,0x40,0x00,0x60,0x00,0x20,0x00,0x30,0x00};
    uchar led3[3]={0x10,0x20,0x40};     //红、绿、蓝
    uchar ledcount,ledcount1;
    //***********************************************************
    //以下定义函数
    // 1毫秒延时函数delayms();花样及速度扫描函数keyscan();
    //***********************************************************
    /*void delayms(unsigned int ms)
    {
        unsigned char i ;
        while(ms--)
         {
            for(i = 0 ; i < 120 ; i++) ;
         }
    }*/
    void Pattern1();             //花样1函数--------->跳变无灭灯过程
    void Pattern2();             //花样2函数--------->跳变有灭灯过程
    void Pattern34();
    void keyscan()
    {
     if((key4==1)&&(key3==1))  {Speed   = 20;Period = 25;}   //预设4种速度200MS
     if((key4==0)&&(key3==1))  {Speed   = 50;Period = 50;}    //500MS
     if((key4==1)&&(key3==0))  {Speed   = 100;Period = 100;}    //1S 
     if((key4==0)&&(key3==0))  {Speed   = 150;Period = 200;}    //1.5S
     if((key2==1)&&(key1==1))  {ledcount1 = 0;Pattern1();}   //预设4种花样
        if((key2==0)&&(key1==1))  {ledcount1 = 0;Pattern2();}
     if((key2==1)&&(key1==0))  {ledcount = 0;Gra3 = 1;Pattern34();}
     if((key2==0)&&(key1==0))  {ledcount = 0;Gra7 = 1;Pattern34();}
    }
    void value()
    {
     if(Speed == 20) PWM = Pulse*8;
     if(Speed == 50) PWM = Pulse*4;         //脉冲个数
     if(Speed == 100)PWM = Pulse*2;
     if(Speed == 150)PWM = Pulse;
    }
    void Reset(void)

     unsigned char code rst[ ]={0xe4,0xc0,0xe0,0xc0,0xe0,0x32};
     (*((void (*)(void))(rst)))();
    }
    void main()
    {
     _nop_ ();
     _nop_ ();
     _nop_ ();
     P1 = 0;
     TMOD = 0x11;             //11.0592M晶振的10ms定时初值(100分之一秒) 
     TH0  = 0x0db;
     TL0  = 0x0ff;
     TH1  = 0x0ff;             //0.05ms(20000分之一秒)
     TL1  = 0x0D1;
     EA = 1;                       //开启总中断允许
     ET0 = 1;                     //允许T0定时器中断
     ET1 = 1;                     //允许T1定时器中断
     TR0 = 1;                    //开启T0定时器
     EX0=1;               //开外部中断0
      IT0=1;               //下降沿触发
     while(1)
     {
      
      keyscan();
     }
    }
    //*************************************************************************
    //Pattern1() 花样函数1-------------跳变无灭灯过程
    //*************************************************************************
    void Pattern1()
    {
     //keyscan();
     Gra = 0;              //跳变位=0
     if(LEDdelay)
      {
       LEDdelay = 0;
       P1 = led1[ledcount];
       ledcount++;
       if(ledcount>11)
        {
         ledcount = 0;
        }
      }
    }
    //***********************************************************************
    //Pattern2() 花样函数2-------------跳变有灭灯过程
    //***********************************************************************
    void Pattern2()
    {
     //keyscan();
     Gra = 0;
     if(LEDdelay)
      {
       LEDdelay = 0;
       P1 = led2[ledcount];
       ledcount++;
       if(ledcount>23)
        {
         ledcount = 0;
        }
      }   
    }
    //***********************************************************************
    //Pattern3() 花样函数3-------------3彩渐变
    //***********************************************************************
    /*void Pattern3()
    {
     keyscan();
     if(Speed == 20) Period = 25;
     if(Speed == 50) Period = 50;
     if(Speed == 100)Period = 100;   
     if(Speed == 150)Period = 200;
     Gra = 1;
     Gra3 = 1;
    }*/
    //***********************************************************************
    //Pattern4() 花样函数4-------------7彩渐变
    //***********************************************************************
    void Pattern34()
    {
     Gra = 1;             //渐变位 = 1
    }
    /*********************************************************/
    // 定时器0中断服务程序
    /*********************************************************/
    void time0(void) interrupt 1
    {
     TR1 =0;
     TF0 =0;
     TH0=0xdb;           //重新写入初值
     TL0=0xff;  
        if(!Gra)           //执行跳变程序
      {
       count ++;
       if(count > Speed)
        {
         LEDdelay = 1;
         count = 0;
        }
      }
     if(Gra)
      {
       TR1 = 1;         //开启TR1;
       if(!BP)             //       
        {
          if(Gra7)
          {
           P1 = led1[ledcount1];  //10ms到,亮相应的LED
          }
         if(Gra3)
          {
           P1 = led3[ledcount1];  //10ms到,亮相应的LED
          }
         Pulse++;
         value();
         if(Pulse >= Period)
          {
           Pulse = Period;
           BP = 1;      //一个周期完成转换模式
          }
        }
       if(BP)
        {
         if(Gra7)
          {
           P1 = led1[ledcount1];  //10ms到,亮相应的LED
          }
         if(Gra3)
          {
           P1 = led3[ledcount1];  //10ms到,亮相应的LED
          }
         value();     
         Pulse--;       //脉冲个数
         if(Pulse == 0)
          {
           Pulse = 0;
           BP = 0;      //一个周期完成转换模式
           ledcount1++;
           if(Gra7)
           {
            if(ledcount1 > 11)
             {
              ledcount1 = 0;
             }
             Gra7 = 0;
              }
           if(Gra3)
           {
            if(ledcount1 > 2)
             {
              ledcount1 = 0;
             }
             Gra3 = 0;
              }
          }
        }
      }
    }
    /*********************************************************/
    // 定时器1中断服务程序
    /*********************************************************/
    void timer1() interrupt 3
    {
     PWM --;
     TH1  = 0xff;         //0.05ms(20000分之一秒)
     TL1  = 0xD1;
     if(PWM == 0)
      {
       P1 = 0;
       TR1 = 0;
      }
    }
    /*********************************************************/
    // 外部中断0中断服务程序 下降沿触发
    /*********************************************************/
    void extern0(void) interrupt 0
    {
     IE0 = 0;    // 清标志位 
     excount++;
     if(excount>50)      // 50大约3秒 
      {
       EA = 0;
       //P1_5 = 1;
       excount = 0;
       Reset();
      }
    }

     

    展开全文
  • 51单片机+PWM控制渐变七彩灯C51程序

    千次阅读 2017-03-30 15:05:28
     (采用5050LED 2W) RGB三色LED控制引脚分别为单片机P1.2 、 P1.1 、 P1.0。LED正极接主电源(24V)正极,负极接驱动3颗三极管的集电极,单片机控制脚分别接3颗NPN三极管,三极管发射极接地,而单片机的供电是...

    一、硬件介绍:

     (采用5050LED 2W) RGB三色LED控制引脚分别为单片机P1.2 、 P1.1  、 P1.0。LED正极接主电源(24V)正极,负极接驱动3颗三极管的集电极,单片机控制脚分别接3颗NPN三极管,三极管发射极接地,而单片机的供电是来自三端稳压器7805,祥细原理如下:
    点击浏览下一页


     

    二、实物图片:

    点击浏览下一页

     

    三、软件部分:

    1、/*原理:
     
    先亮红灯(保持一会儿)----红绿过度(绿加1、红减1循环240次)------
    绿灯亮起(保持一会儿)----绿兰过度(兰加1、绿减1循环240次)
    -----兰灯亮起(保持)-----兰白过度(绿加1、红加1循环240次、兰不变)
    ---白红过度,技术支持网站:
    http://www.51hei.com/ 
    全部程序源代码:点此下载*/

    2、具体程序如下:
    #include<reg52.h>//MCU头文件
    #define uchar unsigned char//字浮型宏定义
    #define uint unsigned int//整型宏定义
    #define shudu 30//LED渐变速度调整
    #define dengji 1//LED变化等级调整
    sbit B1=P1^0;//红色灯控制IO口
    sbit G1=P1^1;//绿色灯控制IO口
    sbit R1=P1^2;//兰色灯控制IO口
    uchar Rout,Bout,Gout;//红绿兰3个变量
    /***************************************************/
    /**********************延时子程序*******************/
    /***************************************************/
    void delay(uint z)
    {
     uint x,y;//局部变量定义
     for(x=0;x<5;x++)//延时外循环
     for(y=0;y<z;y++);//延时内循环
    }
    /**********************************************/
    /**********PWM控制红绿兰3种灯亮灭时间**********/
    /**********************************************/
    void RGBpwm(uchar Rou,uchar Gou,uchar Bou)//3个局部变量,些部分为带参数函数
    {
     if(Rou!=0)//如果红灯变量不等于0就亮红灯
     {
      R1=1;//红灯亮
      delay(Rou);//红灯亮起时间
      R1=0;//红灯灭
     }
     if(Gou!=0)//如果红灯变量不等于0就亮红灯
     {
      G1=1;//绿灯亮
      delay(Gou);//绿灯亮起的时间 
      G1=0;//绿灯灭
     }
     if(Bou!=0)//如果红灯变量不等于0就亮红灯
     {
      B1=1;//兰灯亮
      delay(Bou);//兰灯亮起的时间
      B1=0;//兰灯灭
     } 
    }
      
    /***********************************************/
    /********************主程序*********************/
    /***********************************************/
    void main()
    {
     TMOD=0x01;//选择定时器在方式1下工作
     EA=1;//打开总中断
     ET0=1;//打开定时器中断
     TR0=1;//打开定时器
     R1=0;//开机将红灯关闭
     G1=0;//开机将绿灯关闭
     B1=0;//开机将兰灯关闭
     TH0=(65536-256)/256;//给定时器高8位赋值
     TL0=(65536-256)%256;//给定时器低8位赋值
     while(1)//程序主循环
     {
      RGBpwm(Rout,Gout,Bout);//调用RGBpwm子程序
     }
    }
    /*************************************************/
    /*中断服务子程序(控制LED红绿兰亮灭时间占空比例)*/
    /*************************************************/
    void zhong() interrupt 1//中断向量位为1
    {
     uint num;//定时器计数变量
     uint ji;//亮度等级控制变量
     TH0=(65536-256)/256;//给定时器高8位赋值
     TL0=(65536-256)%256;//给定时器低8位赋值
     num++;//将定时计数变自动增加1
     if(num==shudu)//如果速度变量等于定时计数器变量就执行下面大括号语句
     {
      num=0;//将计数器清0
      ji++;//将亮度等级控制变量加1
      if((ji>0)&&(ji<100))//如果亮度等级控制变量ji小于100,红灯亮起时间变量为240
      {
       Rout=240;//红灯亮起变量为240
       Gout=0;//绿灯亮起变量为0
       Bout=0;//兰灯亮起变量为0
      }
      if((ji>100)&&(ji<340))/*如果亮度等级控制变量ji大于100小于340(刚好240个等级),
      红灯亮起时间变量由原来的240,慢慢减小到0,同时绿灯由原来的0慢慢增到240,形成
      红灯到绿灯的渐变过程*/
      {
       Rout-=dengji;//将红灯变量减1。因为dengji为亮度变化等级(本程序变化等级为1),
       Gout+=dengji;//将绿灯变量加1
       Bout=0;//兰灯不变
      }
      if((ji>340)&&(ji<440))/*亮度等级控制变量ji大于340小于440时,让绿灯变量停一段时间
      这样就形成了当红灯过度到绿灯时,绿灯会停一会儿的效果。*/
      {
       Rout=0;//红灯灭
       Gout=240;//绿灯亮
       Bout=0;//兰灯灭
      }
      if((ji>440)&&(ji<680))//同理:亮度等级控制变量ji大于440小于680时,由绿灯到兰灯过度
      {
       Rout=0;//红灯变量不变
       Gout-=dengji;//将绿灯变量减1
       Bout+=dengji;//将兰灯变量加1
      }
      if((ji>680)&&(ji<780))//亮度等级控制变量ji大于680小于780时,让兰灯变量停一段时间
      {
       Rout=0;//红灯灭
       Gout=0;//绿灯灭
       Bout=240;//兰灯亮一会儿
      }
      if((ji>780)&&(ji<1020))//亮度等级控制变量ji大于780小于1020时,由兰灯到白灯过度
      {
       Rout+=dengji;//将红灯变量加1
       Gout+=dengji;//绿灯变量加1
       Bout=240;//兰灯不变
      }
      if((ji>1020)&&(ji<1025))//亮度等级控制变量ji大于1020小于1025时,由兰灯到白灯过度
      {
       Rout=240;//将红灯变量加1
       Gout=240;//绿灯变量加1
       Bout=240;//兰灯不变
      }
      if((ji>1025)&&(ji<1265))//亮度等级控制变量ji大于1025小于1265时,由白光到红光过度
      {
       Rout=240;//红灯变量不变
       Gout-=dengji;//绿灯变量自动减1
       Bout-=dengji;//兰灯变量自动减1
      }
      if(ji>1265)//当亮度等级控制变量ji大于1210时,就将它清0
      ji=0;//将亮度控制等级清0
     }
    }

    展开全文
  • 单片机调色

    2020-07-28 23:31:01
    单片机调光程序,可以实现变色,亮度调节,幻彩显示等。
  • 使用P9823控制器芯片通过51单片机实现RGB灯级联控制,附P9823控制器数据手册
  • STM32F413单片机直接驱动16位的RGB显示屏,通过DMA+FSMC的方式进行驱动,且占用很低的资源,在F1上也可以用,不过需要进行一些函数的移植,亲测可用
  • 用于单片机控制的RGB565颜色显示工具
  • HSV转RGB C51 code

    2018-11-16 09:36:52
    #define RGB_LIMIT 255 void LED_HSV_Control(uint16_t h, uint16_t s, uint16_t v) { // R,G,B from 0-255, H from 0-360, S,V from 0-1000 int i,difs; unsigned char r,g,b; long RGB_min, RGB_max,RGB_Adj...

    #define RGB_LIMIT 255
    void LED_HSV_Control(uint16_t h, uint16_t s, uint16_t v)
    {
    // R,G,B from 0-255, H from 0-360, S,V from 0-1000
    int i,difs;
    unsigned char r,g,b;
    long RGB_min, RGB_max,RGB_Adj;

    RGB_max = v*RGB_LIMIT/1000;    //(v*RGB_LIMIT)/1000  //此处有1000倍
    RGB_min = RGB_max *(1000 - s)/1000;
    
    i = h / 60;
    difs = h % 60; // factorial part of h
    
    				   // RGB adjustment amount by hue 
    RGB_Adj = (RGB_max - RGB_min)*difs / 60;
    
    switch (i) {
    case 0:
    	r = RGB_max;    //(v*255)/1000
    	g = RGB_min + RGB_Adj;
    	b = RGB_min;
    	break;
    case 1:
    	r = (RGB_max - RGB_Adj);
    	g = RGB_max;
    	b = RGB_min;
    	break;
    case 2:
    	r = RGB_min;
    	g = RGB_max;
    	b = RGB_min + RGB_Adj;
    	break;
    case 3:
    	r = RGB_min;
    	g = RGB_max - RGB_Adj;
    	b = RGB_max/1000;
    	break;
    case 4:
    	r = RGB_min + RGB_Adj;
    	g = RGB_min;
    	b = RGB_max;
    	break;
    default:		// case 5:
    	r = RGB_max;
    	g = RGB_min;
    	b = RGB_max - RGB_Adj;
    	break;
    }
    DEBUG_INT("\r\n H %u",h);
    DEBUG_INT("\r\n S %u",s);
    DEBUG_INT("\r\n V %u",v);
    DEBUG_INT("\r\nLED_R %bu",r);
    DEBUG_INT("\r\nLED_G %bu",g);
    DEBUG_INT("\r\nLED_B %bu\r\n",b);
    LED_RGB_Control(r,g,b);
    

    }

    展开全文
  • 51单片机控制RGBWS2812B 200个灯珠
  • 内含5050 PCB控制灯条PCB设计及原理,RGB三色灯条,用于闪灯控制
  • 简单PWM调光,RGB颜色渐变.利用51单片机定时器产生方波输出,通过改变占空比实现对RGB三种颜色的灯调光,混合出各种颜色
  • 其实简单开发RGB_LED时,51系列单片机就足以。但是在网上搜了一下,包括开源电子网内,都没有比较完整的,比较好的源码资料。 详细介绍,请转到:http://www.openedv.com/thread-279507-1-1.html
  • 七彩LED渐变程序

    2020-07-30 23:30:44
    LED七彩渐变程序,C语言!对单片机初学者有帮助!
  • 经过几天的努力,实现了在stm32单片机RGB565图像简单处理,识别橘黄色乒乓球,同时单片机通过串口向上位机输出,乒乓球的重心坐标,和与图像中心线的夹角,在者可以输出的RGB565数据,通过c++读取输出的数据,转化...
  • RGB全彩拖尾流水灯采用29个全彩发光二极管做的,用廷时来实现拖尾显示,用PWM控制效果会更好,但刚学不久还不会,只能做成这样给大家欣赏一下吧! 先上几张效果图:         ...
  • 题目:基于51单片机RGB三色LED灯点阵(8*8)要求: 1、主控:必须是51单片机 2、RGB三色LED灯: 必须是三色的LED彩灯(即一个灯四个引脚,很重要!!!), 共阴共阳无所谓 3、驱动芯片:驱动三色LED点阵必须用专门的驱动芯片,...
  • 程序可实现全彩灯1600万色的变化及自定义色彩的呼吸效果
  • 单片机RGB五彩灯笔记

    2019-01-19 15:57:40
    一、HSV 和 RGB 使用 1,概念:  HSV:空间颜色,这个模型中颜色的参数分别是:色调(H),饱和度(S),明度(V)。  RGB:光的三基色 R:红色 G:绿色 B:蓝色 2,RGB和HSV 之间联系 (1)每一种颜色可以...
  • BMP转RGB工具v1.0绿色版

    2020-05-29 23:32:23
    BMP转RGB工具是单片机图片取模软件,小巧、绿色、免安装,它支持将BMP图片转换成RGB的软件,可以实现8bit 12bit 16bit 18bit,转化BMP到RGB,BMP的位图为4或8。
  • 四引脚控制,一个IO口控制LED灯的颜色,不要贴片的,需要直插的,原理图如下![图片说明](https://img-ask.csdn.net/upload/202002/09/1581226364_645862.png) VCC为5V,直径大小约为2--8MM。
1 2 3 4 5 ... 20
收藏数 1,792
精华内容 716
关键字:

单片机rgb调色程序