单片机+手机APP蓝牙控制RGB灯的颜色变化 程序与pcb
2016-12-05 09:05
627 查看
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 /******************************************************************** * *文件名:ANJIAN.c *文件描述:按键控制LED的颜色变化 *创建作者:庞登辉 *创建日期:2015/11/28 *创建版本号:V1.0 *******************************************************************/ #include"ANJIAN.h" /******************************************************************** *函数名: void AnJan_Kong(void) *函数功能: 手机按键控制RGB灯的颜色 *输入参数:无 *返回参数:void *函数使用注意事项:初始化 *********************************************************************/ void AnJan_Kong(void) { if(biaozhi==1) { if(SBUF=='e') //红色 { CCAP0H = CCAP0L = 255; //绿色PWM(三极管电路设计时PWM大导通小亮度弱) CCAP1H = CCAP1L = 0; //红色PWM CCAP2H = CCAP2L = 255; //蓝色PWM rgb[1] = 0; //绿色PWM(三极管电路设计时PWM大导通小亮度弱) rgb[0] = 255; //红色PWM rgb[2] = 0; //蓝色PWM } if(SBUF=='f') //绿色 { CCAP0H = CCAP0L = 0; //绿色PWM(三极管电路设计时PWM大导通小亮度弱) CCAP1H = CCAP1L = 255; //红色PWM CCAP2H = CCAP2L = 255; //蓝色PWM rgb[1] = 255; //绿色PWM(三极管电路设计时PWM大导通小亮度弱) rgb[0] = 0; //红色PWM rgb[2] = 0; //蓝色PWM } if(SBUF=='g') //蓝色 { CCAP0H = CCAP0L = 255; //绿色PWM(三极管电路设计时PWM大导通小亮度弱) CCAP1H = CCAP1L = 255; //红色PWM CCAP2H = CCAP2L = 0; //蓝色PWM rgb[1] = 0; //绿色PWM(三极管电路设计时PWM大导通小亮度弱) rgb[0] = 0; //红色PWM rgb[2] = 255; //蓝色PWM } if(SBUF=='h') //半红色 { CCAP0H = CCAP0L = 255; //绿色PWM(三极管电路设计时PWM大导通小亮度弱) CCAP1H = CCAP1L = 128; //红色PWM CCAP2H = CCAP2L = 255; //蓝色PWM rgb[1] = 0; //绿色PWM(三极管电路设计时PWM大导通小亮度弱) rgb[0] = 127; //红色PWM rgb[2] = 0; //蓝色PWM } if(SBUF=='i') //半绿色 { CCAP0H = CCAP0L = 128; //绿色PWM(三极管电路设计时PWM大导通小亮度弱) CCAP1H = CCAP1L = 255; //红色PWM CCAP2H = CCAP2L = 255; //蓝色PWM rgb[1] = 127; //绿色PWM(三极管电路设计时PWM大导通小亮度弱) rgb[0] = 0; //红色PWM rgb[2] = 0; //蓝色PWM } if(SBUF=='j') //半蓝色 { CCAP0H = CCAP0L = 255; //绿色PWM(三极管电路设计时PWM大导通小亮度弱) CCAP1H = CCAP1L = 255; //红色PWM CCAP2H = CCAP2L = 128; //蓝色PWM rgb[1] = 0; //绿色PWM(三极管电路设计时PWM大导通小亮度弱) rgb[0] = 0; //红色PWM rgb[2] = 127; //蓝色PWM } if(SBUF=='k') //黄色 { CCAP0H = CCAP0L = 0; //绿色PWM(三极管电路设计时PWM大导通小亮度弱) CCAP1H = CCAP1L = 0; //红色PWM CCAP2H = CCAP2L = 255; //蓝色PWM rgb[1] = 255; //绿色PWM(三极管电路设计时PWM大导通小亮度弱) rgb[0] = 255; //红色PWM rgb[2] = 0; //蓝色PWM } if(SBUF=='l') //蓝绿色 { CCAP0H = CCAP0L = 0; //绿色PWM(三极管电路设计时PWM大导通小亮度弱) CCAP1H = CCAP1L = 255; //红色PWM CCAP2H = CCAP2L = 0; //蓝色PWM rgb[1] = 255; //绿色PWM(三极管电路设计时PWM大导通小亮度弱) rgb[0] = 0; //红色PWM rgb[2] = 255; //蓝色PWM } if(SBUF=='p') //白色 { CCAP0H = CCAP0L = 0; //绿色PWM(三极管电路设计时PWM大导通小亮度弱) CCAP1H = CCAP1L = 0; //红色PWM CCAP2H = CCAP2L = 0; //蓝色PWM rgb[1] = 255; //绿色PWM(三极管电路设计时PWM大导通小亮度弱) rgb[0] = 255; //红色PWM rgb[2] = 255; //蓝色PWM } if(SBUF=='o') //粉红色 { CCAP0H = CCAP0L = 255; //绿色PWM(三极管电路设计时PWM大导通小亮度弱) CCAP1H = CCAP1L = 0; //红色PWM CCAP2H = CCAP2L = 0; //蓝色PWM rgb[1] = 0; //绿色PWM(三极管电路设计时PWM大导通小亮度弱) rgb[0] = 255; //红色PWM rgb[2] = 255; //蓝色PWM } if(SBUF=='n') //天蓝色 { CCAP0H = CCAP0L = 128; //绿色PWM(三极管电路设计时PWM大导通小亮度弱) CCAP1H = CCAP1L = 255; //红色PWM CCAP2H = CCAP2L = 0; //蓝色PWM rgb[1] = 127; //绿色PWM(三极管电路设计时PWM大导通小亮度弱) rgb[0] = 0; //红色PWM rgb[2] = 255; //蓝色PWM } if(SBUF=='m') //紫色 { CCAP0H = CCAP0L = 250; //绿色PWM(三极管电路设计时PWM大导通小亮度弱) CCAP1H = CCAP1L = 133; //红色PWM CCAP2H = CCAP2L = 148; //蓝色PWM rgb[1] = 0; //绿色PWM(三极管电路设计时PWM大导通小亮度弱) rgb[0] = 117; //红色PWM rgb[2] = 102; //蓝色PWM } } } /******************************************************************** *函数名: void RGB_Led_Process(void) *函数功能: 手机按键控制RGB灯的颜色的进程函数 *输入参数:无 *返回参数:void *函数使用注意事项:初始化 *********************************************************************/ void RGB_Led_Process(void) { CCAP0H = CCAP0L = 255-rgb[1]; //绿色PWM(三极管电路设计时PWM大导通小亮度弱) CCAP1H = CCAP1L = 255-rgb[0]; //红色PWM CCAP2H = CCAP2L = 255-rgb[2]; //蓝色PWM AnJan_Kong(); SendData_Uart1(re[2]); } 复制代码 gsm.c /******************************************************************** * *文件名:GSM.c *文件描述:STC15串口外设函数 *创建作者:庞登辉 *创建日期:2015/11/28 *创建版本号:V1.0 *******************************************************************/ #include "GSM.h" #include <string.H> #include <intrins.h> uchar XinXi = 0; /******************************************************************** *函数名: uchar hand(uchar *ptr) *函数功能: 检测接收字符串 *输入参数: *ptr 要检测的字符串 *返回参数:uchar *函数使用注意事项:接收数据通过中断完成 *********************************************************************/ uchar hand(uchar *ptr) { if(strstr(rec_data,ptr)!=NULL)//strstr(char *str1, char *str2);找出str2字符串在 //str1字符串中第一次出现的位置(不包括str2的串结束符)。 //返回值:返回该位置的指针,如找不到,返回空指针。 return 1; else return 0; } /******************************************************************** *函数名: void clear_rec_data(void) *函数功能: 清除接收的字符串 *输入参数:无 *返回参数:void *函数使用注意事项:接收数据通过中断完成 *********************************************************************/ void clear_rec_data(void) { uchar i; for(i=0;i<strlen(rec_data);i++) { rec_data[i] = '0'; } rec_num = 0; } /******************************************************************** *函数名: void JieShou_Sing_Process(void) *函数功能: 接收手机信息进程函数 *输入参数:无 *返回参数:void *函数使用注意事项:接收数据通过中断完成 *********************************************************************/ void JieShou_Sing_Process(void) { if(hand("+GMTI"))//如果有短信发来就为1 { clear_rec_data(); //清除接收的字符 SendString_Uart2("AT+CMGR=1\r\n");//发送读取信息 delay_ms(1); if(S2BUF=='H') //信息有用信息的标记为后面接有用信息 { XinXi = rec_data[rec_num];//把有用的信号给变量XinXi } clear_rec_data(); ////清除接收的字符 SendString_Uart2("AT+CMGD=1\r\n");//删除短信以防空间不足 } } /******************************************************************** *函数名: void Send_Sing_Process(void) *函数功能: 发送手机信息进程函数 *输入参数:无 *返回参数:void *函数使用注意事项:接收数据通过中断完成 *********************************************************************/ void Send_Sing_Process(void) { SendString_Uart2("AT+CSCS=\"GSM\"\r\n"); delay_s(1);//延时大约1秒 SendString_Uart2("AT+CMGF=1\r\n"); delay_s(1);//延时1秒 SendString_Uart2("AT+CSCA?\r\n"); delay_s(1);//延时1秒 SendString_Uart2("AT+CSMP=17,167,0,240\r\n"); delay_s(1);//延时1秒 SendString_Uart2("AT+CMGS=\"13557032914\"\r\n");//此处修改为对方的电话号 delay_s(1);//延时1秒 SendString_Uart2("HELLO");//修改短信内容,短信内容可为英文和数字 SendData_Uart2(0x1a); delay_s(15);//延时15秒 } 复制代码 OTHER_FUNCTION.c /******************************************************************** * *文件名:OTHER_FUNCTION.c *文件描述:STC15串口外设函数 *创建作者:庞登辉 *创建日期:2015/11/28 *创建版本号:V1.0 *******************************************************************/ #include "OTHER_FUNCTION.h" uchar biaozhi = 0; /******************************************************************** *函数名: void Other_Led(void) *函数功能: 手机控制其它灯的颜色 *输入参数:无 *返回参数:void *函数使用注意事项:初始化 *********************************************************************/ void Other_Led(void) { if(biaozhi==1) { if(SBUF=='A')//开台灯 { TDLed = 0; } if(SBUF=='C')//开浴室灯 { YSLed = 0; } if(SBUF=='Z')//开卧室灯 { WSLed = 0; } if(SBUF=='M')//开大厅灯 { DTLed = 0; } if(SBUF=='F')//关台灯 { TDLed = 1; } if(SBUF=='G')//关浴室灯 { YSLed = 1; } if(SBUF=='H')//关卧室灯 { WSLed = 1; } if(SBUF=='N')//关大厅灯 { DTLed = 1; } } } /******************************************************************** *函数名: void Music_Out(void) *函数功能: 手机控制播放音乐函数 *输入参数:无 *返回参数:void *函数使用注意事项:初始化 *********************************************************************/ void Music_Out(void) { if(biaozhi==1) { if(SBUF=='B') { Uart_SendCMD(0x0d , 0 , 0x00) ;//播放 delay_ms(100) ;//延时大概100MS } if(SBUF=='T') { Uart_SendCMD(0x0e , 0 , 0x00) ;//暂停 delay_ms(100) ;//延时大概100MS } if(SBUF=='S') { Uart_SendCMD(0x02 , 0 , 0x00) ;//上一曲 delay_ms(100) ;//延时大概100MS } if(SBUF=='X') { Uart_SendCMD(0x01 , 0 , 0x00) ;//下一曲 delay_ms(100) ;//延时大概100MS } } } /******************************************************************** *函数名: void Music_Out(void) *函数功能: 手机控制播放音乐函数 *输入参数:无 *返回参数:void *函数使用注意事项:初始化 *********************************************************************/ void HongWai_BJ(void) { if(HWBZ==0) { while(!HWBZ); Send_Sing_Process(); HWBZ = 1; } } /******************************************************************** *函数名: void Music_Out(void) *函数功能: 手机控制其它所有应用进程函数 *输入参数:无 *返回参数:void *函数使用注意事项:初始化 *********************************************************************/ void Other_All_Process(void) { Music_Out(); //播放音乐 Other_Led(); //控制其他等 HongWai_BJ();//红外报警,发短信给手机 } 复制代码 STC15_UART.c /******************************************************************** * *文件名:STC15_UART.c *文件描述:STC15串口外设函数 *创建作者:庞登辉 *创建日期:2015/11/28 *创建版本号:V1.0 *******************************************************************/ #include "STC15_UART.h" #include "process.h" #define uint unsigned int #define uchar unsigned char static INT8U Send_buf[10] = {0} ; static INT8U Recv_buf[10] = {0} ; bit busy_uart1; #define S2_S0 0x01 //P_SW2.0 //中断控制寄存器2 bit busy_uart2; uchar re[4]={0}; uchar rgb[3]={255,255,255}; uchar count=1;// uchar rec_data[50] = {0}; //以下是GSM模块返回数据 uchar rec_num=0; //串口2收到数据的个数 /******************************************************************** *函数名: void UART1_Init(void) *函数功能: 串口1初始化 *输入参数:无 *返回参数:void *函数使用注意事项:初始化 *********************************************************************/ void UART1_Init(void){ #if(PARITYBIT == NONE_PARITY) SCON = 0x50; #elif(PARITYBIT == ODD_PARITY) || (PARITYBIT == EVEN_PARITY) || (PARITYBIT == MARK_PARITY) SCON = 0xda; #elif(PARITYBIT == SPACE_PARITY) SCON = 0xd2; #endif AUXR &= 0xFF; AUXR |= 0x54; TMOD = 0x00; TL1 = (65536-(MAIN_Fosc/4/BAUD_UART1)); TH1 = (65536-(MAIN_Fosc/4/BAUD_UART1))>>8; TR1 = 1; ES = 1; EA = 1; } /******************************************************************** *函数名: void SendData_Uart1(uchar dat) *函数功能: 串口发送数据 *输入参数:dat *返回参数:void *函数使用注意事项:单个数据 *********************************************************************/ void SendData_Uart1(uchar dat) { while(busy_uart1); //等待之前数据发送完成 ACC = dat; if (P) //根据P来设置校验位 { #if (PARITYBIT == ODD_PARITY) TB8 = 0; //设置校验位为0 #elif (PARITYBIT == EVEN_PARITY) TB8 = 1; //设置校验位为1 #endif } else { #if (PARITYBIT == ODD_PARITY) TB8 = 1; //设置校验位为1 #elif (PARITYBIT == EVEN_PARITY) TB8 = 0; //设置校验位为0 #endif //计算偶校检位 P } busy_uart1 = 1; //忙标志位置 1 SBUF = ACC; //发送数据到串口缓冲区 } /******************************************************************** *函数名: void Uart_Isr()interrupt 4 *函数功能: 串口中断服务函数 *输入参数:无 *返回参数:void *函数使用注意事项:接收数据通过中断完成 *********************************************************************/ void Uart_Isr()interrupt 4 using 1 { if(RI) { RI = 0; //清除接收中断标志 } if(TI) { TI = 0; //清除传输中断标志 busy_uart1 = 0; //清除传输忙标志 if(count==1&&(SBUF=='a'||SBUF=='b'||SBUF=='c'))//蓝牙发送字符判断RGB的标志 { re[count] = SBUF; } else { if(SBUF == 'd') //发送有效数据完毕标志 { count = 0; } else { re[2] = SBUF; //用来接收有用的数据 if(re[1]=='a') //字符为a就给rgb[0]发送数据(rgb[0]为红色的PWM) { rgb[0] = re[2]; } if(re[1]=='b') //字符为a就给rgb[1]发送数据(rgb[1]为绿色的PWM) { rgb[1] = re[2]; } if(re[1]=='c') //字符为a就给rgb[2]发送数据(rgb[2]为蓝色的PWM) { rgb[2] = re[2]; } } } count++; } } /******************************************************************** *函数名: void UART2_Init(void) *函数功能: 串口2初始化 *输入参数:无 *返回参数:void *函数使用注意事项:初始化 *********************************************************************/ void UART2_Init(void) //初始化串口2 { // P_SW2 &= ~S2_S0; //S2_S0=0 (P1.0/RxD2, P1.1/TxD2) P_SW2 |= S2_S0; //S2_S0=1 (P4.6/RxD2_2, P4.7/TxD2_2) #if (PARITYBIT == NONE_PARITY) S2CON = 0x50; //8位可变波特率 #elif (PARITYBIT == ODD_PARITY) || (PARITYBIT == EVEN_PARITY) || (PARITYBIT == MARK_PARITY) S2CON = 0xda; //9位可变波特率,校验位初始为1 #elif (PARITYBIT == SPACE_PARITY) S2CON = 0xd2; //9位可变波特率,校验位初始为0 #endif T2L = (65536 - (MAIN_Fosc/4/BAUD_UART2)); //设置波特率重装值 T2H = (65536 - (MAIN_Fosc/4/BAUD_UART2))>>8; AUXR &= 0xFF; AUXR |= 0x14; //T2为1T模式, 并启动定时器2 IE2 = 0x01; //使能串口2中断 EA = 1; } /*---------------------------- UART2 中断服务程序 -----------------------------*/ void Uart2() interrupt 8 using 1 { uchar temp; if (S2CON & S2RI) { S2CON &= ~S2RI; //清除S2RI位 /*接收短信*/ temp = S2BUF; rec_data[rec_num++]=temp; if(rec_num>=50) rec_num=0; } if (S2CON & S2TI) { S2CON &= ~S2TI; //清除S2TI位 busy_uart2 = 0; //清忙标志 } } /*---------------------------- 发送串口2数据 ----------------------------*/ void SendData_Uart2(BYTE dat) { while (busy_uart2); //等待前面的数据发送完成 ACC = dat; //获取校验位P (PSW.0) if (P) //根据P来设置校验位 { #if (PARITYBIT == ODD_PARITY) S2CON &= ~S2TB8; //设置校验位为0 #elif (PARITYBIT == EVEN_PARITY) S2CON |= S2TB8; //设置校验位为1 #endif } else { #if (PARITYBIT == ODD_PARITY) S2CON |= S2TB8; //设置校验位为1 #elif (PARITYBIT == EVEN_PARITY) S2CON &= ~S2TB8; //设置校验位为0 #endif } busy_uart2 = 1; S2BUF = ACC; //写数据到UART2数据寄存器 } /******************************************************************** *函数名: void SendString_Uart1(char *s) *函数功能: 发送字符串函数 *输入参数:无 *返回参数:void *函数使用注意事项: *********************************************************************/ void SendString_Uart2(char *s) { while(*s) { SendData_Uart2(*s++); } } /***************************************************************************************************** - 功能描述: 串口发送一帧数据(MP3播放音乐(串口方式(用串口1))) - 隶属模块: 内部 - 参数说明: - 返回说明: - 注:无 *****************************************************************************************************/ void SendCmd(INT8U len) { INT8U i = 0 ; delay_us(100); SendData_Uart1(0x7E); //起始 for(i=0; i<len; i++)//数据 { SendData_Uart1(Send_buf[i]) ; delay_us(100); } SendData_Uart1(0xEF) ;//结束 delay_us(100); } /******************************************************************************************** - 功能描述:求和校验 - 隶属模块: - 参数说明: - 返回说明: - 注: 和校验的思路如下 发送的指令,去掉起始和结束。将中间的6个字节进行累加,最后取反码 接收端就将接收到的一帧数据,去掉起始和结束。将中间的数据累加,再加上接收到的校验 字节。刚好为0.这样就代表接收到的数据完全正确。 ********************************************************************************************/ void DoSum( INT8U *Str, INT8U len) { INT16U xorsum = 0; INT8U i; for(i=0; i<len; i++) { xorsum = xorsum + Str[i]; } xorsum = 0 -xorsum; *(Str+i) = (INT8U)(xorsum >>8); *(Str+i+1) = (INT8U)(xorsum & 0x00ff); } /******************************************************************************************** - 功能描述: 串口向外发送命令[包括控制和查询] - 隶属模块: 外部 - 参数说明: CMD:表示控制指令,请查阅指令表,还包括查询的相关指令 feedback:是否需要应答[0:不需要应答,1:需要应答] data:传送的参数 - 返回说明: - 注: ********************************************************************************************/ void Uart_SendCMD(INT8U CMD ,INT8U feedback , INT16U dat) { Send_buf[0] = 0xff; //保留字节 Send_buf[1] = 0x06; //长度 Send_buf[2] = CMD; //控制指令 Send_buf[3] = feedback;//是否需要反馈 Send_buf[4] = (INT8U)(dat >> 8);//datah Send_buf[5] = (INT8U)(dat); //datal DoSum(&Send_buf[0],6); //校验 SendCmd(8); //发送此帧数据 } 复制代码 |
相关文章推荐
- 微信小程序与图像算法应用(improving)
- Android Dialog 大合集
- android-解决EditText的inputType为Password时, 字体不一致的问题
- Could not open ServletContext resource [/WEB-INF/applicationContext.xml]
- Android 反编译初探 应用是如何被注入广告的
- PHP开发小技巧⑥—判断是否是移动端访问
- Android拍照识别车牌号SDK
- 有关移动端IM通信协议的坑
- Android软键盘遮挡的四种解决方案
- Android滑动菜单特效实现,侧滑菜单实现
- Android动画之Drawable Animation
- Android RenderScript实现LowPoly效果
- [置顶] 在线看Android系统源码,那些相见恨晚的几种方案
- 在线看Android系统源码,那些相见恨晚的几种方案
- Android ContentProvider 完全解析及简单DEMO
- 第三期 Android Kernel 下载和编译 《手机就是开发板》
- 关于Fragment嵌套Fragment并且使用tablayout的错误
- Jenkins Android自动打包平台配置
- Android Code Style
- 微信最新内测版发布了,你更新了吗?