我是
靠谱客的博主
过时八宝粥,最近开发中收集的这篇文章主要介绍
单片机+手机APP蓝牙控制RGB灯的颜色变化 程序与pcb,觉得挺不错的,现在分享给大家,希望可以做个参考。
概述
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
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=1rn");//发送读取信息
- delay_ms(1);
- if(S2BUF=='H') //信息有用信息的标记为后面接有用信息
- {
- XinXi = rec_data[rec_num];//把有用的信号给变量XinXi
- }
- clear_rec_data(); 清除接收的字符
- SendString_Uart2("AT+CMGD=1rn");//删除短信以防空间不足
- }
- }
- /********************************************************************
- *函数名: void Send_Sing_Process(void)
- *函数功能: 发送手机信息进程函数
- *输入参数:无
- *返回参数:void
- *函数使用注意事项:接收数据通过中断完成
- *********************************************************************/
- void Send_Sing_Process(void)
- {
- SendString_Uart2("AT+CSCS="GSM"rn");
- delay_s(1);//延时大约1秒
- SendString_Uart2("AT+CMGF=1rn");
- delay_s(1);//延时1秒
- SendString_Uart2("AT+CSCA?rn");
- delay_s(1);//延时1秒
- SendString_Uart2("AT+CSMP=17,167,0,240rn");
- delay_s(1);//延时1秒
- SendString_Uart2("AT+CMGS="13557032914"rn");//此处修改为对方的电话号
- delay_s(1);//延时1秒
- SendString_Uart2("HELLO");//修改短信内容,短信内容可为英文和数字
- SendData_Uart2(0x1a);
- delay_s(15);//延时15秒
- }
-
复制代码
OTHER_FUNCTION.c
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); //发送此帧数据
- }
-
-
复制代码
|
最后
以上就是过时八宝粥为你收集整理的单片机+手机APP蓝牙控制RGB灯的颜色变化 程序与pcb的全部内容,希望文章能够帮你解决单片机+手机APP蓝牙控制RGB灯的颜色变化 程序与pcb所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复