使用stc15單片機最小系統在萬用板進行焊接 功能
1手機app控制(溫度查詢 報警 語音控制 調節亮度 查詢亮度)
2語音串口控制 可以進行播報語音數據 控制
3檢測人體 可以進行開關操作 或者手機振動 可以進行更改
4eerom保存溫度的上下限
5使用串口連接433模塊進行組網
IMG_20190910_134840.jpg (3.13 MB, 下載次數: 53)
下載附件
2019-9-10 13:51 上傳
IMG_20190910_134842.jpg (2.87 MB, 下載次數: 48)
下載附件
2019-9-10 13:51 上傳
IMG_20190910_134905.jpg (2.38 MB, 下載次數: 47)
下載附件
2019-9-10 13:51 上傳
Screenshot_20190816_150220_com.lanya.jpg (137.32 KB, 下載次數: 54)
下載附件
2019-9-10 13:51 上傳
Screenshot_20190816_150226_com.lanya.jpg (87.14 KB, 下載次數: 45)
下載附件
2019-9-10 13:51 上傳
單片機源程序如下:
- #include "mode.h"
- #include "config.h"
- #include "uart.h"
- #include "new.h"
- #include "pwm.h"
- #include "stdio.h"
- #include<string.h> //運算符函數
- extern xdata u8 uart1_shou[uatr];//串口1 接收的數據
- extern xdata u8 uart2_shou[uatr];
- extern xdata u8 uart3_shou[uatr];//串口1 接收的數據
- extern xdata u8 uart4_shou[uatr];
- extern int mode1;
- extern int mode2;
- extern int mode3;
- extern int mode4;
- extern unsigned char ds_18b20num[]; //用來保存溫度
- extern unsigned char ds_18b20H[]; //用來保存溫度
- extern unsigned char ds_18b20L[]; //用來保存溫度
- extern unsigned char ADC_nume[7];//光照強度 數組
- extern bit run_18b20;//是否啟動溫度報警 標志位默認開啟
- unsigned int rgb_r,rgb_g,rgb_b,reb_num;
- extern bit ET0_run;
- int run=1;//是否啟動語音識別標志位 默認開啟 可以在手機或者上位機軟件中關閉
- void delay_ms(uint ms)
- {
- uint i;
- do{
- i = (uint)(MAIN_Fosc / 13000);
- while(--i) ; //14T per loop
- }while(--ms);
- }
- /*******************************************************************************
- * 函數名 : UART_1
- * 描述 : 串口1 接收到數據進行動作
- * 輸入 :
- * 輸出 :
- * 返回 :
- * 注意 :
- *******************************************************************************/
- void UART_1()
- {
- int ge,shi,bai;
-
- if(mode1!=0)//串口第一個字節不等于0 則表示有數據到來
- {
- ET0 = 0;//串口接收到數據 關閉定時器0的中斷 防止亂碼錯誤
- delay_ms(15);//延時一段時間 確定數據接收完成
-
- if(uart1_shou[0]=='H')//設置溫度上限 上限數據
- {
- strcpy(ds_18b20H,uart1_shou+1);//將輸入的數據 拷貝另外的數組中
- IapEraseSector(IAP_ADDRESS);//刪除扇區數據 將數據全部寫為ff
- delay_ms(15);//延時 確定刪除完成 防止出現錯誤
- IapWrite_n(IAP_ADDRESS,ds_18b20H,5);//向eerom寫入數據
- UART(1,"溫度上限 設置完成");//向窗口發送數據 表示設置完成
- UART(1,ds_18b20H);//并將設置的數據發送到串口1
- }
- else if(uart1_shou[0]=='L')//設置溫度上限 下限數據
- {
- strcpy(ds_18b20L,uart1_shou+1);//與上面同理
- IapEraseSector(IAP_ADDRESS1);//
- delay_ms(15);
- IapWrite_n(IAP_ADDRESS1,ds_18b20L,5);
- UART(1,"溫度下限 設置完成");
- UART(1,ds_18b20L);
- }
- else if(uart1_shou[0]=='R')
- {
- bai=uart1_shou[1]-0x30;
- shi=uart1_shou[2]-0x30;
- ge =uart1_shou[3]-0x30;
- rgb_r=(bai*100)+(shi*10)+ge;
- PWM_NUM(rgb_r,rgb_g,rgb_b);
- UART(1,"RGB顏色 紅色設置完成");
- }
- else if(uart1_shou[0]=='G')
- {
- bai=uart1_shou[1]-0x30;
- shi=uart1_shou[2]-0x30;
- ge =uart1_shou[3]-0x30;
- rgb_g=(bai*100)+(shi*10)+ge;
- PWM_NUM(rgb_r,rgb_g,rgb_b);
- UART(1,"RGB顏色 綠色設置完成");
- }
- else if(uart1_shou[0]=='B')
- {
- bai=uart1_shou[1]-0x30;
- shi=uart1_shou[2]-0x30;
- ge =uart1_shou[3]-0x30;
- rgb_b=(bai*100)+(shi*10)+ge;
- PWM_NUM(rgb_r,rgb_g,rgb_b);
- UART(1,"RGB顏色 藍色設置完成");
- }
- else if(uart1_shou[0]=='M')
- {
- UART(2,"voice,");
- UART2_SendData(uart1_shou[1]);
- UART(2,",$");
-
-
- UART(1,"語音模塊音量設置完成");
- }
-
-
- if(Find(1,"打開呼吸燈"))//串口第一個字節不等于0 則表示有數據到來)//串口第一個字節不等于0 則表示有數據到來
- {
- ET0_run= 1;//串口接收到數據 關閉定時器0的中斷 防止亂碼錯誤
- PWM_NUM(0,0,0);
- UART(1,"呼吸燈已開啟");
- }
- else if(Find(1,"關閉呼吸燈"))//串口第一個字節不等于0 則表示有數據到來)//串口第一個字節不等于0 則表示有數據到來
- {
- ET0_run = 0;//串口接收到數據 關閉定時器0的中斷 防止亂碼錯誤
- PWM_NUM(rgb_r,rgb_g,rgb_b);
- UART(1,"呼吸燈已關閉");
- }
- else if(Find(1,"獲取語音識別指令"))//串口第一個字節不等于0 則表示有數據到來)//串口第一個字節不等于0 則表示有數據到來
- {
- UART2_SendString("all$");
- delay_ms(1000);
- UART1_SendString(uart2_shou);
- }
- else if(Find(1,"打開燈光"))//串口第一個字節不等于0 則表示有數據到來)//串口第一個字節不等于0 則表示有數據到來
- {
- LED=0;
- UART(1,"燈光開啟");
- }
- else if(Find(1,"關閉燈光"))//串口第一個字節不等于0 則表示有數據到來)//串口第一個字節不等于0 則表示有數據到來
- {
- LED=1;
- UART(1,"燈光關閉");
- }
- else if(Find(1,"重啟語音模塊"))//串口第一個字節不等于0 則表示有數據到來)//串口第一個字節不等于0 則表示有數據到來
- {
- UART_shouq(2,"reset$ ","重啟成功!",2000);
- UART(1,"語音模塊重啟完成");
- }
- else if(Find(1,"打開指令觸發"))//串口第一個字節不等于0 則表示有數據到來)//串口第一個字節不等于0 則表示有數據到來
- {
- UART_shouq(2,"PasswordTrigger,1,$","設置成功",2000);
- UART(1,"已設置成指令觸發");
- }
- else if(Find(1,"關閉指令觸發"))//串口第一個字節不等于0 則表示有數據到來)//串口第一個字節不等于0 則表示有數據到來
- {
- UART_shouq(2,"PasswordTrigger,0,$","設置成功",2000);
- UART(1,"已取消指令觸發");
- }
- else if(Find(1,"溫度查詢"))//串口第一個字節不等于0 則表示有數據到來)//串口第一個字節不等于0 則表示有數據到來
- {
- UART(1,ds_18b20num);
- }
- else if(Find(1,"開啟溫度報警"))//串口第一個字節不等于0 則表示有數據到來)//串口第一個字節不等于0 則表示有數據到來
- {
- run_18b20=1;
- UART(1,"溫度報警已開啟");
- }
- else if(Find(1,"關閉溫度報警"))//串口第一個字節不等于0 則表示有數據到來)//串口第一個字節不等于0 則表示有數據到來
- {
- run_18b20=0;
- UART(1,"溫度報警已關閉");
- }
- else if(Find(1,"查詢溫度上限"))//串口第一個字節不等于0 則表示有數據到來)//串口第一個字節不等于0 則表示有數據到來
- { UART(1,"溫度上限為");
- UART(1,ds_18b20H);
- }
- else if(Find(1,"查詢溫度下限"))//串口第一個字節不等于0 則表示有數據到來)//串口第一個字節不等于0 則表示有數據到來
- {
- UART(1,"溫度下限為");
- UART(1,ds_18b20L);
- }
- else if(Find(1,"關閉語音識別"))//串口第一個字節不等于0 則表示有數據到來)//串口第一個字節不等于0 則表示有數據到來
- {
- run=0;
- UART(1,"已關閉語音識別");
- }
- else if(Find(1,"打開語音識別"))//串口第一個字節不等于0 則表示有數據到來)//串口第一個字節不等于0 則表示有數據到來
- {
- run=1;
- UART(1,"已打開語音識別");
- }
- else if(Find(1,"查詢光照強度"))//串口第一個字節不等于0 則表示有數據到來)//串口第一個字節不等于0 則表示有數據到來
- {
- run=1;
- UART(1,"A");
- UART(1,ADC_nume);
- }
- else if(Find(1,"打開紅燈"))//串口第一個字節不等于0 則表示有數據到來)//串口第一個字節不等于0 則表示有數據到來
- {
- pwm3(100);
- UART(1,"紅燈已打開");
- }
- else if(Find(1,"打開綠燈"))//串口第一個字節不等于0 則表示有數據到來)//串口第一個字節不等于0 則表示有數據到來
- {
- pwm4(100);
- UART(1,"綠燈已打開");
- }
- else if(Find(1,"打開藍燈"))//串口第一個字節不等于0 則表示有數據到來)//串口第一個字節不等于0 則表示有數據到來
- {
- pwm5(100);
- UART(1,"藍燈已打開");
- }
-
- else if(Find(1,"關閉紅燈"))//串口第一個字節不等于0 則表示有數據到來)//串口第一個字節不等于0 則表示有數據到來
- {
- pwm3(0);
- UART(1,"紅燈已關閉");
- }
- else if(Find(1,"關閉綠燈"))//串口第一個字節不等于0 則表示有數據到來)//串口第一個字節不等于0 則表示有數據到來
- {
- pwm4(0);
- UART(1,"綠燈已關閉");
- }
- else if(Find(1,"關閉藍燈"))//串口第一個字節不等于0 則表示有數據到來)//串口第一個字節不等于0 則表示有數據到來
- {
- pwm5(0);
- UART(1,"藍燈已關閉");
- }
- ET0 = ET0_run;
- CLR_Buf1(1);//操作完成 清除數組中的數據
- }
- }
- /*******************************************************************************
- * 函數名 : UART_2()
- * 描述 : 串口2接收到數據進行動作
- * 輸入 :
- * 輸出 :
- * 返回 :
- * 注意 :
- *******************************************************************************/
- void UART_2()
- {
-
- if(mode2!=0&&run==1)//串口第一個字節不等于0 則表示有數據到來
- { ET0 = 0;
- delay_ms(15);
- if(uart2_shou[0]==101)//開燈
- {
- LED=0;
- UART(2,"play,051,$");//播放音樂 表示開關燈完成
- } else if(uart2_shou[0]==102)//關燈
- {
- LED=1;
- UART(2,"play,052,$");//播放音樂 表示開關燈完成
- }
- else if(uart2_shou[0]==103)//查詢關鍵詞
- {
- UART_shouq(2,"PasswordTrigger,1,$","設置成功",2000);
- UART(2,"play,053,$");//播放音樂 表示開關燈完成
- }
- else if(uart2_shou[0]==104)//允許指令觸發 、
- {
- UART_shouq(2,"PasswordTrigger,0,$","設置成功",2000);
- UART(2,"play,054,$");//播放音樂 表示開關燈完成
- }
- else if(uart2_shou[0]==105)//打開紅色
- {
- ET0_run=0;
- rgb_r=100;
- PWM_NUM(rgb_r,rgb_g,rgb_b);
- UART(2,"play,055,$");//播放音樂 表示開關燈完成
- }
- else if(uart2_shou[0]==106)//打開綠色
- {
- ET0_run=0;
- rgb_g=100;
- PWM_NUM(rgb_r,rgb_g,rgb_b);
- UART(2,"play,056,$");//播放音樂 表示開關燈完成
- }
- else if(uart2_shou[0]==107)//打開藍色
- {
- ET0_run=0;
- rgb_b=100;
- PWM_NUM(rgb_r,rgb_g,rgb_b);
- UART(2,"play,057,$");//播放音樂 表示開關燈完成
- }
- else if(uart2_shou[0]==108)//關閉紅色
- {
- ET0_run=0;
- rgb_r=0;
- PWM_NUM(rgb_r,rgb_g,rgb_b);
- UART(2,"play,058,$");//播放音樂 表示開關燈完成
- }
- else if(uart2_shou[0]==109)//關閉綠色
- {
- ET0_run=0;
- rgb_g=0;
- PWM_NUM(rgb_r,rgb_g,rgb_b);
- UART(2,"play,059,$");//播放音樂 表示開關燈完成
- }
- else if(uart2_shou[0]==110)//關閉藍色
- {
- ET0_run=0;
- rgb_b=0;
- PWM_NUM(rgb_r,rgb_g,rgb_b);
- UART(2,"play,060,$");//播放音樂 表示開關燈完成
- }
- else if(uart2_shou[0]==111)//打開呼吸燈
- {
- ET0_run=1;
- UART(2,"play,061,$");//播放音樂 表示開關燈完成
- }
- else if(uart2_shou[0]==112)//關閉呼吸燈
- {
- ET0_run=0;
- UART(2,"play,062,$");//播放音樂 表示開關燈完成
- }
- else if(uart2_shou[0]==113)//打開溫度報警
- {
- run_18b20=1;
- UART(2,"play,063,$");//播放音樂 表示開關燈完成
- }
- else if(uart2_shou[0]==114)//關閉溫度報警
- {
- run_18b20=0;
- UART(2,"play,064,$");//播放音樂 表示開關燈完成
- }
- else if(uart2_shou[0]==115)//查詢溫度數據上限
- {
- MOR_DS18B20(2,1);
- }
- else if(uart2_shou[0]==116)//查詢溫度下限
- {
- MOR_DS18B20(1,1);
-
- }
- else if(uart2_shou[0]==117)//查詢溫度數據
- {
- MOR_DS18B20(0,1);
- }
- ET0 = ET0_run;
- CLR_Buf1(2);//操作完成 清除數組中的數據
- }
- }
- /*******************************************************************************
- * 函數名 : UART_3
- * 描述 : 串口3 接收到數據進行動作
- * 輸入 :
- * 輸出 :
- * 返回 :
- * 注意 :
- *******************************************************************************/
- void UART_3()
- {
- if(mode3!=0)//串口第一個字節不等于0 則表示有數據到來
- {
- delay_ms(15);
- UART(3,uart3_shou);
- UART3_SendString("ok");
-
- CLR_Buf1(3);//操作完成 清除數組中的數據
- }
- }
- /*******************************************************************************
- * 函數名 : Find
- * 描述 : 串口2接收到數據進行動作
- * 輸入 :
- * 輸出 :
- * 返回 :
- * 注意 :
- *******************************************************************************/
- void UART_4()
- {
- if(mode4!=0)//串口第一個字節不等于0 則表示有數據到來
- {
- delay_ms(15);
- UART(4,uart4_shou);
- UART4_SendString("ok");
-
- CLR_Buf1(4);//操作完成 清除數組中的數據
- }
- }
- void MOR_DS18B20(uint a,bit run)
- {
- unsigned char MODE_DS18B20[10];//240為 “當前溫度為”
- while(run)
- {
- if(a==0)
- {
- strcpy(MODE_DS18B20,"play,067,$"); //查詢溫度
- }else if(a==1)
- {
- strcpy(MODE_DS18B20,"play,066,$"); //溫度下限
- }else if(a==2)
- {
- strcpy(MODE_DS18B20,"play,065,$"); //溫度上限
- }
- UART(2,MODE_DS18B20);//當播報聲音
- delay_ms(2000);//延時防止語音沖突
- strcpy(MODE_DS18B20,"play,000,$");
- if(a==0)
- {
- if(ds_18b20num[1]!=0)//溫度在兩位數
- {
- MODE_DS18B20[7]=ds_18b20num[1];//播報溫度 十位
- UART(2,MODE_DS18B20);
- delay_ms(800); //延時
- UART(2,"play,010,$");//十
- delay_ms(800); //延時
- MODE_DS18B20[7]=ds_18b20num[2];//播報溫度 個位
- UART(2,MODE_DS18B20);
- delay_ms(800);
- UART(2,"play,068,$");//度
- }
- else//溫度在一位數
- {
- MODE_DS18B20[7]=ds_18b20num[2];
- UART(2,MODE_DS18B20);//當前溫度為
- delay_ms(1000);
- UART(2,"play,068,$");//度
- }
- }else if (a==1)
- {
- if(ds_18b20L[1]!=0)//溫度在兩位數
- {
- MODE_DS18B20[7]=ds_18b20L[1];//播報溫度 十位
- UART(2,MODE_DS18B20);
- delay_ms(800); //延時
- UART(2,"play,010,$");//十
- delay_ms(800); //延時
- MODE_DS18B20[7]=ds_18b20L[2];//播報溫度 個位
- UART(2,MODE_DS18B20);
- delay_ms(800);
- UART(2,"play,068,$");//度
- }
- else//溫度在一位數
- {
- MODE_DS18B20[7]=ds_18b20L[2];
- UART(2,MODE_DS18B20);//當前溫度為
- delay_ms(1000);
- UART(2,"play,068,$");//度
- }
- }else if (a==2)
- {
- if(ds_18b20H[1]!=0)//溫度在兩位數
- {
- MODE_DS18B20[7]=ds_18b20H[1];//播報溫度 十位
- UART(2,MODE_DS18B20);
- delay_ms(800); //延時
- UART(2,"play,010,$");//十
- delay_ms(800); //延時
- MODE_DS18B20[7]=ds_18b20H[2];//播報溫度 個位
- UART(2,MODE_DS18B20);
- delay_ms(800);
- UART(2,"play,068,$");//度
- }
- else//溫度在一位數
- {
- MODE_DS18B20[7]=ds_18b20H[2];
- UART(2,MODE_DS18B20);//當前溫度為
- delay_ms(1000);
- UART(2,"play,068,$");//度
- }
- }
- run=0;
- }
- }
- /*******************************************************************************
- * 函數名 : Find
- * 描述 : 判斷緩存中是否含有指定的字符串
- * 輸入 :
- * 輸出 :
- * 返回 : unsigned char:1 找到指定字符,0 未找到指定字符
- * 注意 :
- *******************************************************************************/
- bit Find(int q,u8 *a)
- {
- if(q==1)
- {
- if(strstr(uart1_shou,a)!=NULL)
- return 1;
- else
- return 0;
- }
- else if(q==1)
- {
- if(strstr(uart2_shou,a)!=NULL)
- return 1;
- else
- return 0;
- }
- else if(q==3)
- {
- if(strstr(uart3_shou,a)!=NULL)
- return 1;
- else
- return 0;
- }
- else if(q==4)
- {
- if(strstr(uart4_shou,a)!=NULL)
- return 1;
- else
- return 0;
- }return 0;
- }
- //清除串口緩存數據
- void CLR_Buf1(int a)
- {
- int k;
- if(a==1)
- {
- for(k=0;k<uatr;k++) //將緩存內容清零
- {
- uart1_shou[k] = 0x00;
- mode1=0;
- }
- }
- else if(a==2)
- {
- for(k=0;k<uatr;k++) //將緩存內容清零
- {
- uart2_shou[k] = 0x00;
- mode2=0;
- }
- } if(a==3)
- {
- for(k=0;k<uatr;k++) //將緩存內容清零
- {
- uart3_shou[k] = 0x00;
- mode3=0;
- }
- }
- else if(a==4)
- {
- for(k=0;k<uatr;k++) //將緩存內容清零
- {
- uart4_shou[k] = 0x00;
- mode4=0;
- }
- }
- }
復制代碼
所有資料51hei提供下載:
斷電保存版本程序.rar
(296.85 KB, 下載次數: 36)
2019-9-10 13:52 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
APP.rar
(6.33 MB, 下載次數: 50)
2019-9-10 13:52 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|