STC15單片機 模塊化程序 關于RGB燈的設計,自己寫了一個手機APP通過藍牙控制RGB燈的顏色變化
pcb下載 電路圖:
PCB.rar
(4.52 MB, 下載次數: 417)
2016-1-11 10:36 上傳
點擊文件名下載附件
stc15單片機完整源程序下載:
彩燈.rar
(109.72 KB, 下載次數: 464)
2016-1-11 10:36 上傳
點擊文件名下載附件
代碼
下面是部分程序預覽:
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=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
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); //發送此幀數據
- }
復制代碼
|