前幾天逛那個寶看到一個433模塊,就買回來研究,經過測試,范圍在200米以內(測試地點在公司宿舍 ,附近有很多干擾源),數據傳輸沒有問題,然后之前閑著的時候做了一個小玩意,手機app通過手機藍牙(可以用8266做wiif,公司宿舍沒有WiFi就用了藍牙),控制rgb彩燈,讀取溫度(18b20),光敏,電路中增加了人體檢測,紅外開關(類似循跡小車那種 ),還有一個語音識別,播報的模塊,用來進行控制交互。
單片機使用15單片機,使用eerom保存溫度上下限,實現rgb彩燈的呼吸燈,打算在此基礎增加433模塊,然后進行一個范圍組網,上面說的這個為主機,可以放在有WiFi的地方,然后從機使用433模塊與主機進行通訊,手機app通過藍牙/wiif控制主機,主機在進行從機的控制,有興趣的可以聊下,現在主機程序已經完成,從機程序簡單,打算過幾天去打幾個板子,有興趣的可以找我qq150-61-75-1-15
另外附上主機的程序電路下次附上
單片機源程序如下:
- #include"stdio.h" //c語言 自帶函數 (printf 函數)
- #include"DS18b20.h" //溫度檢測函數頭文件
- #include"uart.h" //串口頭文件
- #include"mode.h" //運算符函數
- #include"new.h" //eeerom頭文件/
- #include"adc.h"
- #include"pwm.h"
- #include<intrins.h> //左移右移函數
- #include<string.h> //字符操作函數
- #define u8 unsigned char
- //串口接收數據緩存數組
- extern xdata u8 uart1_shou[uatr];//串口1 接收的數據
- extern xdata u8 uart2_shou[uatr];//串口2 接受的數據
- extern xdata u8 uart3_shou[uatr];//串口1 接收的數據
- extern xdata u8 uart4_shou[uatr];//串口2 接受的數據
- extern int mode1;
- extern int mode2;
- extern int mode3;
- extern int mode4;
- //溫度讀取 變量
- uint temp1=0; // 18b202溫度數據
- bit run_18b20=1;//溫度報警啟動標志位 1啟動報警
- bit shou_18b20=1;//測試 只發送一次報警
- unsigned char ds_18b20num[]={"D00.0"}; //用來保存溫度
- unsigned char ds_18b20H[]={"D30.5"}; //語音報警上限
- unsigned char ds_18b20L[]={"D20.5"}; //語音報警下限
- extern unsigned char ADC_nume[7];//光敏數據保存
- bit ET0_run=0;
- bit cbs=0;//超聲波檢測 檢測人體
- //函數聲明
- void key();//按鍵控制函數
- void ds18b20_num();///溫度讀取轉換成字符函數
- void eerom();//eerom上電初始化函數
- void main(void)
- {
- //串口初始化
-
- io_init();//io引腳初始化
- Uart1Init();//串口1 初始化
- Uart2Init();//串口2 初始化
- Uart3Init();//串口3 初始化
- Uart4Init();//串口4 初始化
- Timer0Init();
- eerom();//EEROM操作函數
- pwminit();//pwm控制rgb彩燈初始化
- PWM_NUM(0,0,0);//RGB彩燈關閉
- delay_ms(2000);//延時1秒鐘 防止電腦上位機反應不過來
- while(1)
- {
- UART_1();//藍牙接口 以及上位機通訊使用
- UART_2();//語音模塊播報使用
- UART_3();//備用 可以外接串口
- UART_4();
- ds18b20_num();//溫度讀取轉換成字符數據
- ADC_shou();//檢測光敏數據
- key();//板載按鈕控制
- }
- }
- void ds18b20_num()
- {
- int wendu_h;//標志位 檢測溫度是否超過上限
- int wendu_l;//標志位 檢測溫度是否低于下限
- ET0 = 0;
- tmpchange(); //讀取溫度
- temp1=ds_tmp(); //溫度賦值
- ET0 = ET0_run;
- ds_18b20num[0]='D';
- ds_18b20num[1]=(temp1/100)+48; //將溫度轉換成字符型
- ds_18b20num[2]=(temp1/10%10)+48;
- ds_18b20num[4]=(temp1%10)+48;
- //檢測溫度值是否大于低于設定的上限下限
- wendu_h=strcmp(ds_18b20num,ds_18b20H);
- wendu_l=strcmp(ds_18b20num,ds_18b20L);
- if(wendu_h>0&&run_18b20&&shou_18b20)//溫度大于報警值
- {
- shou_18b20=0;
- UART(2,"play,245,$");//溫度上限報警
- UART(1,"溫度上限報警,當前溫度為 ");
- shou_18b20=0;
- UART(1,ds_18b20num);
- UART1_SendLR() ;
- UART(1,"溫度上限為 ");
- UART(1,ds_18b20H);
- UART1_SendLR() ;
- UART(1,"溫度下限為 ");
- UART(1,ds_18b20L);
- UART1_SendLR() ;
- UART(2,"play,070,$");//語音播報 溫度上限報警
- }
- else if(wendu_l<0&&run_18b20&&shou_18b20)//溫度低于下限
- {
- shou_18b20=0;
- UART(2,"play,246,$");//溫度下限報警
- UART(1,"溫度下限報警,當前溫度為 ");
- UART(1,ds_18b20num);
- UART1_SendLR() ;
- UART(1,"溫度上限為 ");
- UART(1,ds_18b20H);
- UART1_SendLR() ;
- UART(1,"溫度下限為 ");
- UART(1,ds_18b20L);
- UART1_SendLR() ;
- UART(2,"play,069,$");//語音播報 溫度下限報警
- }
- if(wendu_l>0&&wendu_h<0)//溫度在中間 未發生報警值
- {
- shou_18b20=1;
- }
-
- }
- void key()//板載按鍵操作函數
- {
- if(P24==0)//設置是否為語音喚醒模式
- {
- if(P55)
- {
- UART_shouq(2,"PasswordTrigger,1,$","設置成功",2000);
- UART(1,"已設置為口令觸發\r\n");
- }
- else
- {
- UART_shouq(2,"PasswordTrigger,0,$","設置成功",2000);
- UART(1,"已取消口令觸發\r\n");
- }
- P55=~P55;
- }
- if(P25==0)//按鍵測試程序 按下按鍵 返回串口接收的數據 并且取反led指示燈
- {
- UART(1,"A");
- UART(1,ADC_nume);
- UART1_SendLR();
- while(!P25);
- }
-
- if(P26==0)//按鍵測試程序 按下按鍵 返回串口接收的數據 并且取反led指示燈
- {
- MOR_DS18B20(0,1);
- while(!P26);
- }
-
- if(P50==0)
- {
- LED=~LED;
- while(!P50);
- }
- }
- void eerom()
- {
- unsigned char eerom_shou; //
- eerom_shou = IapReadByte(IAP_ADDRESS);//讀取一個字節 判斷是否為D
-
- if(eerom_shou!='D') //不是D說明 第一次上電 進行數據的初始化
- {
- IapEraseSector(IAP_ADDRESS);//刪除扇區數據 將數據全部寫為ff
- IapWrite_n(IAP_ADDRESS,ds_18b20H,5);
- IapWrite_n(IAP_ADDRESS1,ds_18b20L,5);
- }
- else//不為D說明不是第一次上電 則讀取eerom的數據 進行覆蓋
- {
- IapRead_n(IAP_ADDRESS,ds_18b20H,5);
- IapRead_n(IAP_ADDRESS1,ds_18b20L,5);
- }
- }
復制代碼
所有資料51hei提供下載:
斷電保存版本.rar
(296.85 KB, 下載次數: 26)
2019-9-3 10:30 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|