您的位置:首页 > 移动开发

单片机+手机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); //发送此帧数据

}

复制代码

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: