分享一个基于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;
-
- }
- }
复制代码
所有资料51hei提供下载:
学长毕业设计GPRS.rar
(5.94 MB, 下载次数: 55)
|