分享一個基于GPRS網絡的遠程氣體檢測系統,用到了煙霧傳感器、0.96寸的oled
四、畢業論文﹙設計﹚的內容要求:
隨著越來越多的場合向自動化無人職守邁進,尤其在安全、監控等領域。為了進一步降低成本,減少人力的投資,以及更集中、更方便的掌握現場情況,許多場合都采用了電子監控設備。而這些電子設備的設計無疑涉及到這些領域的安全性,這就對監控設備的成本,穩定性,以及性能三方面都提出了更高的要求。
本設計主要是利用GPRS無線網絡實現環境的實時在線監測。該系統由監測端、通信網絡和監測中心組成,監測端由煙霧等傳感器、微處理器和控制電路部分組成,實現環境參數的實時測量和數據的處理。采通信網絡由GPRS無線發送模塊組成,將實時監測到的數據發送到監測中心。系統工作過程為:首先傳感器進行環境監測數據的采集,經信號處理模塊處理后送到單片機,經過單片機串口送到GPRS模塊發射,經GPRS通信網絡接入internet網,將數據送到監測中心。并對數據進行實時處理
具體要求如下:
1 完成系統硬件和軟件設計;
2利用GPRS網絡實現液位數據的實時遠程傳輸和液位實時控制。
五、畢業論文﹙設計﹚應收集資料及參考文獻:
收集關于單片機應用、GPRS在數據采集和遠程監控方面的專業資料,閱讀和學習下列參考文獻:
[1] 陳蒙蒙.雨量水位監測系統設計[D].杭州:杭州電子科技大學,2013.
[2] 張廣馳.基于GPRS的水資源遠程監測系統研究[D].淮南:安徽理工大學,2014.
[3] 胡勝利,萬晉軍.基于GPRS的地下水自動監測系統設計[J].水利水電技術.2011,4
[4] 湯新龍. GPRS數據通訊程序設計方法及應用研究[D]. 蘇州: 蘇州大學,2014.
[5] 潘驍 . 基于ZigBee與GPRS的無線倉儲環境參數監測系統設計 [D], 廣西師范大學,2016
六、畢業論文﹙設計﹚的進度安排:
1月10日——3月20日:查閱資料,完成外文翻譯原文和開題報告。
3月21日——4月20日:完成系統監測終端的設計并提交中期檢查報告。
4月21日——5月20日:完成環境監測參數的遠程傳輸設計,準備作品驗收。
5月21日——6月15日:撰寫、修改畢業設計論文,準備并完成答辯。
接線說明:
STC89C52RC ADC0832
P3.5 ----------------------- 1
P3.4 ----------------------- 5
P3.3 ----------------------- 7
VCC ----------------------- 8
GND ----------------------- 4
OLED
P1.0 --------------------- CLK
P1.1 -------------------- SDA
DHT11
P2.0 -------------------- DATA
MQ7 A0------------------ ADC0832 2管腳
單片機源程序如下:
- /*************************************************************/
- #include <REG51.H>
- #include <string.H>
- #include <intrins.h>
- #include <oled.h>
- #include "bmp.h"
- #define uchar unsigned char
- #define uint unsigned int
- typedef unsigned char U8; /* defined for unsigned 8-bits integer variable 無符號8位整型變量 */
- typedef signed char S8; /* defined for signed 8-bits integer variable 有符號8位整型變量 */
- typedef unsigned int U16; /* defined for unsigned 16-bits integer variable 無符號16位整型變量 */
- typedef signed int S16; /* defined for signed 16-bits integer variable 有符號16位整型變量 */
- typedef unsigned long U32; /* defined for unsigned 32-bits integer variable 無符號32位整型變量 */
- typedef signed long S32; /* defined for signed 32-bits integer variable 有符號32位整型變量 */
- typedef float F32; /* single precision floating point variable (32bits) 單精度浮點數(32位長度) */
- typedef double F64; /* double precision floating point variable (64bits) 雙精度浮點數(64位長度) */
- #define FOSC_110592M
- sbit P13=P1^3;
- sbit p32=P3^2;
- sbit P2_0 = P2^0 ;
- /*********************************端口定義**********************************/
- sbit CS = P3^5; //接adc0832 1口
- sbit Clk = P3^3;
- sbit DATI = P3^4;
- sbit DATO = P3^4;
- sbit P20=P2^0 ;
- /*******************************定義全局變量********************************/
- unsigned char dat = 0x00; //AD值
- unsigned char CH; //通道變量
- //以下是開機后發送到手機的內容,發送的號碼在程序中修改。
- unsigned int rec_data_len_uart=0; //標記Buffer_Uart0接收數組
- unsigned char idata Buffer_Uart0_Rec[25]={0}; //Uart0中斷接收數組
- char fasong[25] = "wen du:";
- int fasong1[];
- int a = 37;
- //----------------------------------------------//
- //----------------定義區--------------------//
- //----------------------------------------------//
- U8 U8FLAG,U8comdata,U8temp;
- U8 U8T_data_H,U8T_data_L,U8RH_data_H,U8RH_data_L,U8checkdata;
- U8 U8T_data_H_temp,U8T_data_L_temp,U8RH_data_H_temp,U8RH_data_L_temp,U8checkdata_temp;
- void Delay(U16 j)
- { U8 i;
- for(;j>0;j--)
- {
- for(i=0;i<27;i++);
- }
- }
- void Delay_10us(void)
- {
- U8 i;
- i--;
- i--;
- i--;
- i--;
- i--;
- i--;
- }
-
- void COM(void)
- {
-
- U8 i;
-
- for(i=0;i<8;i++)
- {
-
- U8FLAG=2;
- while((!P2_0)&&U8FLAG++);
- Delay_10us();
- Delay_10us();
- Delay_10us();
- U8temp=0;
- if(P2_0)U8temp=1;
- U8FLAG=2;
- while((P2_0)&&U8FLAG++);
- //超時則跳出for循環
- if(U8FLAG==1)break;
- //判斷數據位是0還是1
-
-
-
- U8comdata<<=1;
- U8comdata|=U8temp; //0
- }
-
- }
- //--------------------------------
- //-----濕度讀取子程序 ------------
- //--------------------------------
- //----以下變量均為全局變量--------
- //----溫度高8位== U8T_data_H------
- //----溫度低8位== U8T_data_L------
- //----濕度高8位== U8RH_data_H-----
- //----濕度低8位== U8RH_data_L-----
- //----校驗 8位 == U8checkdata-----
- //----調用相關子程序如下----------
- //--------------------------------
- void RH(void)
- {
- //主機拉低18ms
- P2_0=0;
- Delay(180);
- P2_0=1;
- //總線由上拉電阻拉高 主機延時20us
- Delay_10us();
- Delay_10us();
- Delay_10us();
- Delay_10us();
- //主機設為輸入 判斷從機響應信號
- P2_0=1;
- //判斷從機是否有低電平響應信號 如不響應則跳出,響應則向下運行
- if(!P2_0) //T !
- {
- U8FLAG=2;
- //判斷從機是否發出 80us 的低電平響應信號是否結束
- while((!P2_0)&&U8FLAG++);
- U8FLAG=2;
- //判斷從機是否發出 80us 的高電平,如發出則進入數據接收狀態
- while((P2_0)&&U8FLAG++);
- //數據接收狀態
- COM();
- U8RH_data_H_temp=U8comdata;
- COM();
- U8RH_data_L_temp=U8comdata;
- COM();
- U8T_data_H_temp=U8comdata;
- COM();
- U8T_data_L_temp=U8comdata;
- COM();
- U8checkdata_temp=U8comdata;
- P2_0=1;
- //數據校驗
-
- U8temp=(U8T_data_H_temp+U8T_data_L_temp+U8RH_data_H_temp+U8RH_data_L_temp);
- if(U8temp==U8checkdata_temp)
- {
- U8RH_data_H=U8RH_data_H_temp;
- if(U8RH_data_H>20)
- {
- U8RH_data_H = 0.6* U8RH_data_H;
- }
- U8RH_data_L=U8RH_data_L_temp;
- U8T_data_H=U8T_data_H_temp;
- U8T_data_L=U8T_data_L_temp;
- U8checkdata=U8checkdata_temp;
- }//fi
- }//fi
- }
-
- /****************************************************************************
- 函數功能:AD轉換子程序
- 入口參數:CH 出口參數:dat
- ****************************************************************************/
- unsigned char adc0832(unsigned char CH)
- {
- unsigned char i,test,adval;
- adval = 0x00;
- test = 0x00;
- Clk = 0; //初始化
- DATI = 1;
- _nop_();
- CS = 0;
- _nop_();
- Clk = 1;
- _nop_();
- if ( CH == 0x00 ) //通道選擇
- {
- Clk = 0;
- DATI = 1; //通道0的第一位
- _nop_();
- Clk = 1;
- _nop_();
- Clk = 0;
- DATI = 0; //通道0的第二位
- _nop_();
- Clk = 1;
- _nop_();
- }
- else
- {
- Clk = 0;
- DATI = 1; //通道1的第一位
- _nop_();
- Clk = 1;
- _nop_();
- Clk = 0;
- DATI = 1; //通道1的第二位
- _nop_();
- Clk = 1;
- _nop_();
- }
- Clk = 0;
- DATI = 1;
- for( i = 0;i < 8;i++ ) //讀取前8位的值
- {
- _nop_();
- adval <<= 1;
- Clk = 1;
- _nop_();
- Clk = 0;
- if (DATO)
- adval |= 0x01;
- else
- adval |= 0x00;
- }
- for (i = 0; i < 8; i++) //讀取后8位的值
- {
- test >>= 1;
- if (DATO)
- test |= 0x80;
- else
- test |= 0x00;
- _nop_();
- Clk = 1;
- _nop_();
- Clk = 0;
- }
- if (adval == test) //比較前8位與后8位的值,如果不相同舍去。若一直出現顯示為零,請將該行去掉
- dat = test;
- _nop_();
- CS = 1; //釋放ADC0832
- DATO = 1;
- Clk = 1;
- return dat;
- }
- /***************************顯示處理函數********************************/
-
- //注意,無論接收到信號還是發送完信號,都會進中斷服務程序的
- /************************************按鍵作為外部中斷的初始化*******************************************/
- void key_init(void)
- {
- IT0 = 1; //外部中斷0,使用端口P3.2.
- EX0 = 1;
- }
- /*初始化程序(必須使用,否則無法收發),次程序將會使用定時器1*/
- void SerialInti()//初始化程序(必須使用,否則無法收發)
- {
- TMOD=0x20;//定時器1操作模式2:8位自動重載定時器
- #ifdef FOSC_12M //在這里根據晶振大小設置不同的數值初始化串口
- TH1=0xf3;//裝入初值,波特率2400
- TL1=0xf3;
- #else
- TH1=0xfd;//裝入初值,波特率9600
- TL1=0xfd;
- #endif //end of SOC_12M
- TR1=1;//打開定時器
- SM0=0;//設置串行通訊工作模式,(10為一部發送,波特率可變,由定時器1的溢出率控制)
- SM1=1;//(同上)在此模式下,定時器溢出一次就發送一個位的數據
- REN=1;//串行接收允許位(要先設置sm0sm1再開串行允許)
- EA=1;//開總中斷
- ES=1;//開串行口中斷
- }
- unsigned char hand(unsigned char *data_source,unsigned char *ptr)
- {
- if(strstr(data_source,ptr)!=NULL)
- return 1;
- else
- return 0;
- }
- void clear_rec_data()
- {
- uchar i,temp_len;
- temp_len=strlen(Buffer_Uart0_Rec);
- if(temp_len>25)
- {
- temp_len=25;
- }
- for(i=0;i<temp_len;i++)
- {
- Buffer_Uart0_Rec[i]='\0';
- }
- rec_data_len_uart=0;
- }
- /*串行通訊中斷,收發完成將進入該中斷*/
- void Serial_interrupt() interrupt 4
- {
- unsigned char temp_rec_data_uart0;
- temp_rec_data_uart0 = SBUF;//讀取接收數據
- RI=0;//接收中斷信號清零,表示將繼續接收
- Buffer_Uart0_Rec[rec_data_len_uart]=temp_rec_data_uart0; //接收數據
- rec_data_len_uart++;
- if(rec_data_len_uart>24)
- {
- rec_data_len_uart=0; //從頭開始接收數據
- }
- }
- void Uart1Send(uchar c)
- {
- SBUF=c;
- while(!TI);//等待發送完成信號(TI=1)出現
- TI=0;
- }
- //串行口連續發送char型數組,遇到終止號/0將停止
- void Uart1Sends(uchar *str)
- {
- while(*str!='\0')
- {
- SBUF=*str;
- while(!TI);//等待發送完成信號(TI=1)出現
- TI=0;
- str++;
- }
- }
- void chuli(int c)
- {
- char bai,shi,ge;
- bai =((char) c/100)+48;
- shi =((char) c%100/10)+48;
- ge =((char) c%10)+48;
- Uart1Send(bai);
- Uart1Send(shi);
- Uart1Send(ge);
- //Uart1Send(ge);
- }
- //延時函數大概是1s鐘,不過延時大的話不準...
- void DelaySec(int sec)
- {
- uint i , j= 0;
- for(i=0; i<sec; i++)
- {
- for(j=0; j<65535; j++)
- {
- }
- }
- }
- void main()
- {
- uchar i = 0;
- int j;
- u8 t;
- CH = 0x00; //在這里選擇通道 0x00或0x01
- P1 = 0XFF;
- key_init();
- SerialInti();
- OLED_Init(); //初始化OLED
- OLED_Clear();
- P13=0;
- while(1)
- {
- RH();
- dat = adc0832(CH);
- OLED_ShowString(18,3,"CO",72);
- OLED_ShowCHinese(36,2,4); //濃
- OLED_ShowCHinese(54,2,5); //度
- OLED_ShowNum(78,2,dat,3,16);//顯示ASCII字符的碼值
-
-
- OLED_ShowCHinese(18,4,0); //溫
- OLED_ShowCHinese(36,4,1); //度
- OLED_ShowCHinese(54,4,6); //為
- OLED_ShowNum(72,4,U8RH_data_H,4,16);//顯示ASCII字符的碼值
-
- OLED_ShowCHinese(18,6,3); //濕
- OLED_ShowCHinese(36,6,1); //度
- OLED_ShowCHinese(54,6,6); //為
- OLED_ShowNum(72,6,U8T_data_H,4,16);//顯示ASCII字符的碼值
- }
- }
- void getkey() interrupt 0
- {
- Delay_1ms(20);
- if(p32==0) //軟件消抖
- {
- P13=1;
- Uart1Sends("AT+CSCS=\"GSM\"\r\n");
- DelaySec(1);//延時大約3秒
- Uart1Sends("AT+CMGF=1\r\n");
- DelaySec(1);//延時3秒
- Uart1Sends("AT+CSCA?\r\n");
- DelaySec(1);//延時3秒
- Uart1Sends("AT+CSMP=17,167,0,241\r\n");
- DelaySec(1);//延時3秒
- Uart1Sends("AT+CMGS=\"13772830544\"\r\n");//此處修改為對方的電話號
- DelaySec(1);//延時3秒
- //fasong[20] = 2;
- Uart1Sends("CO concentration: ");//修改短信內容,短信內容可為英文和數字
- chuli(dat); //顯示一氧化碳濃度
- Uart1Sends("\nThe current hemperature is: ");//修改短信內容,短信內容可為英文和數字
- chuli(U8RH_data_H); //顯示一氧化碳濃度
- Uart1Sends("\nThe current humidity is: ");//修改短信內容,短信內容可為英文和數字
- chuli(U8T_data_H); //顯示一氧化碳濃度
- Uart1Send(0x1a);
- P13=0;
-
- }
- }
復制代碼
0.jpg (35.43 KB, 下載次數: 32)
下載附件
2018-1-16 01:09 上傳
所有資料51hei提供下載:
學長畢業設計GPRS.rar
(5.94 MB, 下載次數: 55)
2018-1-15 19:31 上傳
點擊文件名下載附件
GPRS煙霧檢測 下載積分: 黑幣 -5
|