标题:
基于GPRS的环境实时远程监测系统设计资料与源码下载
[打印本页]
作者:
伟超时代121
时间:
2018-1-15 19:32
标题:
基于GPRS的环境实时远程监测系统设计资料与源码下载
分享一个基于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
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1