找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2760|回复: 0
打印 上一主题 下一主题
收起左侧

基于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管脚

单片机源程序如下:

  1. /*************************************************************/
  2. #include <REG51.H>
  3. #include <string.H>
  4. #include <intrins.h>
  5. #include <oled.h>
  6. #include "bmp.h"
  7. #define uchar unsigned char
  8. #define uint unsigned int

  9. typedef unsigned char  U8;       /* defined for unsigned 8-bits integer variable           无符号8位整型变量  */
  10. typedef signed   char  S8;       /* defined for signed 8-bits integer variable                  有符号8位整型变量  */
  11. typedef unsigned int   U16;      /* defined for unsigned 16-bits integer variable           无符号16位整型变量 */
  12. typedef signed   int   S16;      /* defined for signed 16-bits integer variable           有符号16位整型变量 */
  13. typedef unsigned long  U32;      /* defined for unsigned 32-bits integer variable           无符号32位整型变量 */
  14. typedef signed   long  S32;      /* defined for signed 32-bits integer variable           有符号32位整型变量 */
  15. typedef float          F32;      /* single precision floating point variable (32bits) 单精度浮点数(32位长度) */
  16. typedef double         F64;      /* double precision floating point variable (64bits) 双精度浮点数(64位长度) */

  17. #define FOSC_110592M
  18. sbit P13=P1^3;
  19. sbit p32=P3^2;
  20. sbit P2_0  = P2^0 ;
  21. /*********************************端口定义**********************************/
  22. sbit CS   = P3^5;                  //接adc0832  1口
  23. sbit Clk = P3^3;
  24. sbit DATI = P3^4;
  25. sbit DATO = P3^4;
  26. sbit  P20=P2^0 ;
  27. /*******************************定义全局变量********************************/
  28. unsigned char dat = 0x00;      //AD值
  29. unsigned char CH;       //通道变量



  30. //以下是开机后发送到手机的内容,发送的号码在程序中修改。        
  31. unsigned int  rec_data_len_uart=0;    //标记Buffer_Uart0接收数组
  32. unsigned char idata Buffer_Uart0_Rec[25]={0};                 //Uart0中断接收数组
  33. char fasong[25] = "wen du:";
  34. int fasong1[];
  35. int a = 37;
  36. //----------------------------------------------//
  37. //----------------定义区--------------------//
  38. //----------------------------------------------//
  39. U8  U8FLAG,U8comdata,U8temp;

  40. U8  U8T_data_H,U8T_data_L,U8RH_data_H,U8RH_data_L,U8checkdata;
  41. U8  U8T_data_H_temp,U8T_data_L_temp,U8RH_data_H_temp,U8RH_data_L_temp,U8checkdata_temp;

  42.    void Delay(U16 j)
  43.     {      U8 i;
  44.             for(;j>0;j--)
  45.           {         
  46.                 for(i=0;i<27;i++);

  47.           }
  48.     }
  49.        void  Delay_10us(void)
  50.       {
  51.         U8 i;
  52.         i--;
  53.         i--;
  54.         i--;
  55.         i--;
  56.         i--;
  57.         i--;
  58.        }
  59.         
  60.         void  COM(void)
  61.       {
  62.      
  63.                 U8 i;
  64.          
  65.        for(i=0;i<8;i++)           
  66.             {
  67.                
  68.                        U8FLAG=2;        
  69.                    while((!P2_0)&&U8FLAG++);
  70.                         Delay_10us();
  71.                     Delay_10us();
  72.                         Delay_10us();
  73.                           U8temp=0;
  74.              if(P2_0)U8temp=1;
  75.                     U8FLAG=2;
  76.                  while((P2_0)&&U8FLAG++);
  77.                    //超时则跳出for循环                  
  78.                     if(U8FLAG==1)break;
  79.                    //判断数据位是0还是1         
  80.                      
  81.         
  82.                     
  83.                    U8comdata<<=1;
  84.                       U8comdata|=U8temp;        //0
  85.              }
  86.            
  87.         }

  88.         //--------------------------------
  89.         //-----湿度读取子程序 ------------
  90.         //--------------------------------
  91.         //----以下变量均为全局变量--------
  92.         //----温度高8位== U8T_data_H------
  93.         //----温度低8位== U8T_data_L------
  94.         //----湿度高8位== U8RH_data_H-----
  95.         //----湿度低8位== U8RH_data_L-----
  96.         //----校验 8位 == U8checkdata-----
  97.         //----调用相关子程序如下----------
  98.         //--------------------------------

  99.         void RH(void)
  100.         {
  101.           //主机拉低18ms
  102.        P2_0=0;
  103.            Delay(180);
  104.            P2_0=1;
  105.          //总线由上拉电阻拉高 主机延时20us
  106.            Delay_10us();
  107.            Delay_10us();
  108.            Delay_10us();
  109.            Delay_10us();
  110.          //主机设为输入 判断从机响应信号
  111.            P2_0=1;
  112.          //判断从机是否有低电平响应信号 如不响应则跳出,响应则向下运行         
  113.            if(!P2_0)                 //T !         
  114.            {
  115.            U8FLAG=2;
  116.          //判断从机是否发出 80us 的低电平响应信号是否结束         
  117.            while((!P2_0)&&U8FLAG++);
  118.            U8FLAG=2;
  119.          //判断从机是否发出 80us 的高电平,如发出则进入数据接收状态
  120.            while((P2_0)&&U8FLAG++);
  121.          //数据接收状态                 
  122.            COM();
  123.            U8RH_data_H_temp=U8comdata;
  124.            COM();
  125.            U8RH_data_L_temp=U8comdata;
  126.            COM();
  127.            U8T_data_H_temp=U8comdata;
  128.            COM();
  129.            U8T_data_L_temp=U8comdata;
  130.            COM();
  131.            U8checkdata_temp=U8comdata;
  132.            P2_0=1;
  133.          //数据校验
  134.          
  135.            U8temp=(U8T_data_H_temp+U8T_data_L_temp+U8RH_data_H_temp+U8RH_data_L_temp);
  136.            if(U8temp==U8checkdata_temp)
  137.            {
  138.                      U8RH_data_H=U8RH_data_H_temp;
  139.                   if(U8RH_data_H>20)
  140.                     {
  141.                          U8RH_data_H = 0.6* U8RH_data_H;
  142.                         }
  143.                      U8RH_data_L=U8RH_data_L_temp;
  144.                   U8T_data_H=U8T_data_H_temp;
  145.                      U8T_data_L=U8T_data_L_temp;
  146.                      U8checkdata=U8checkdata_temp;
  147.            }//fi
  148.            }//fi

  149.         }
  150.         
  151. /****************************************************************************
  152. 函数功能:AD转换子程序
  153. 入口参数:CH  出口参数:dat
  154. ****************************************************************************/
  155. unsigned char adc0832(unsigned char CH)
  156. {
  157.       unsigned char i,test,adval;
  158.      adval = 0x00;
  159.      test = 0x00;
  160.      Clk = 0;       //初始化
  161.      DATI = 1;
  162.     _nop_();
  163.     CS = 0;
  164.     _nop_();
  165.     Clk = 1;
  166.    _nop_();
  167.    if ( CH == 0x00 )      //通道选择
  168.    {
  169.        Clk = 0;
  170.        DATI = 1;      //通道0的第一位
  171.        _nop_();
  172.       Clk = 1;
  173.         _nop_();
  174.         Clk = 0;
  175.       DATI = 0;      //通道0的第二位
  176.       _nop_();
  177.       Clk = 1;
  178.       _nop_();
  179.     }
  180.     else
  181.     {
  182.        Clk = 0;
  183.       DATI = 1;      //通道1的第一位
  184.        _nop_();
  185.        Clk = 1;
  186.        _nop_();
  187.       Clk = 0;
  188.       DATI = 1;      //通道1的第二位
  189.     _nop_();
  190.      Clk = 1;
  191.      _nop_();
  192.     }
  193.       Clk = 0;
  194.       DATI = 1;
  195.     for( i = 0;i < 8;i++ )      //读取前8位的值
  196.     {
  197.        _nop_();
  198.        adval <<= 1;
  199.        Clk = 1;
  200.        _nop_();
  201.        Clk = 0;
  202.        if (DATO)
  203.           adval |= 0x01;
  204.       else
  205.           adval |= 0x00;
  206.     }
  207.       for (i = 0; i < 8; i++)      //读取后8位的值
  208.       {
  209.            test >>= 1;
  210.            if (DATO)
  211.               test |= 0x80;
  212.            else
  213.               test |= 0x00;
  214.           _nop_();
  215.           Clk = 1;
  216.           _nop_();
  217.           Clk = 0;
  218.       }
  219.       if (adval == test)      //比较前8位与后8位的值,如果不相同舍去。若一直出现显示为零,请将该行去掉
  220.            dat = test;
  221.       _nop_();
  222.        CS = 1;        //释放ADC0832
  223.        DATO = 1;
  224.        Clk = 1;
  225.       return dat;
  226. }

  227. /***************************显示处理函数********************************/

  228.    

  229. //注意,无论接收到信号还是发送完信号,都会进中断服务程序的

  230. /************************************按键作为外部中断的初始化*******************************************/
  231. void key_init(void)
  232. {
  233.    IT0 = 1;                //外部中断0,使用端口P3.2.
  234.    EX0 = 1;
  235. }


  236. /*初始化程序(必须使用,否则无法收发),次程序将会使用定时器1*/
  237. void SerialInti()//初始化程序(必须使用,否则无法收发)
  238. {
  239.         TMOD=0x20;//定时器1操作模式2:8位自动重载定时器

  240. #ifdef FOSC_12M                   //在这里根据晶振大小设置不同的数值初始化串口
  241.         TH1=0xf3;//装入初值,波特率2400
  242.         TL1=0xf3;        
  243. #else         
  244.         TH1=0xfd;//装入初值,波特率9600
  245.         TL1=0xfd;
  246. #endif //end of SOC_12M
  247.         TR1=1;//打开定时器
  248.         SM0=0;//设置串行通讯工作模式,(10为一部发送,波特率可变,由定时器1的溢出率控制)
  249.         SM1=1;//(同上)在此模式下,定时器溢出一次就发送一个位的数据
  250.         REN=1;//串行接收允许位(要先设置sm0sm1再开串行允许)
  251.         EA=1;//开总中断
  252.         ES=1;//开串行口中断        
  253. }
  254. unsigned char hand(unsigned char *data_source,unsigned char *ptr)
  255. {
  256.         if(strstr(data_source,ptr)!=NULL)
  257.                 return 1;
  258.         else
  259.                 return 0;
  260. }
  261. void clear_rec_data()
  262. {
  263.         uchar i,temp_len;
  264.         temp_len=strlen(Buffer_Uart0_Rec);
  265.         if(temp_len>25)
  266.         {
  267.                 temp_len=25;
  268.         }
  269.         for(i=0;i<temp_len;i++)
  270.         {
  271.                 Buffer_Uart0_Rec[i]='\0';        
  272.         }
  273.         rec_data_len_uart=0;
  274. }

  275. /*串行通讯中断,收发完成将进入该中断*/
  276. void Serial_interrupt() interrupt 4
  277. {
  278.         unsigned char temp_rec_data_uart0;        
  279.         temp_rec_data_uart0 = SBUF;//读取接收数据               
  280.         RI=0;//接收中断信号清零,表示将继续接收                        
  281.         Buffer_Uart0_Rec[rec_data_len_uart]=temp_rec_data_uart0;        //接收数据
  282.         rec_data_len_uart++;
  283.         if(rec_data_len_uart>24)
  284.         {
  285.                 rec_data_len_uart=0;         //从头开始接收数据
  286.         }        
  287. }
  288. void Uart1Send(uchar c)
  289. {
  290.         SBUF=c;
  291.         while(!TI);//等待发送完成信号(TI=1)出现
  292.         TI=0;        
  293. }


  294. //串行口连续发送char型数组,遇到终止号/0将停止
  295. void Uart1Sends(uchar *str)
  296. {
  297.         while(*str!='\0')
  298.         {
  299.                 SBUF=*str;
  300.                 while(!TI);//等待发送完成信号(TI=1)出现
  301.                 TI=0;
  302.                 str++;
  303.         }
  304. }

  305. void chuli(int c)
  306. {
  307.    char bai,shi,ge;
  308.     bai =((char) c/100)+48;
  309.     shi =((char) c%100/10)+48;
  310.         ge  =((char) c%10)+48;
  311.     Uart1Send(bai);
  312.         Uart1Send(shi);
  313.         Uart1Send(ge);
  314.         //Uart1Send(ge);
  315. }
  316. //延时函数大概是1s钟,不过延时大的话不准...
  317. void DelaySec(int sec)
  318. {
  319.         uint i , j= 0;
  320.         for(i=0; i<sec; i++)
  321.         {
  322.                 for(j=0; j<65535; j++)
  323.                 {        
  324.                 }
  325.         }
  326. }
  327. void main()
  328. {
  329.         uchar i = 0;
  330.         int j;
  331.         u8 t;
  332.     CH = 0x00;       //在这里选择通道 0x00或0x01
  333.         P1 = 0XFF;
  334.         key_init();
  335.         SerialInti();
  336.         OLED_Init();                        //初始化OLED  
  337.         OLED_Clear();
  338.     P13=0;
  339.         while(1)
  340.         {
  341.           RH();
  342.           dat = adc0832(CH);
  343.           OLED_ShowString(18,3,"CO",72);
  344.           OLED_ShowCHinese(36,2,4);        //浓  
  345.           OLED_ShowCHinese(54,2,5);        //度
  346.           OLED_ShowNum(78,2,dat,3,16);//显示ASCII字符的码值
  347.          

  348.          
  349.           OLED_ShowCHinese(18,4,0);        //温
  350.           OLED_ShowCHinese(36,4,1);        //度  
  351.           OLED_ShowCHinese(54,4,6);        //为        
  352.           OLED_ShowNum(72,4,U8RH_data_H,4,16);//显示ASCII字符的码值
  353.          

  354.           OLED_ShowCHinese(18,6,3);        //湿
  355.           OLED_ShowCHinese(36,6,1);        //度  
  356.           OLED_ShowCHinese(54,6,6);        //为
  357.           OLED_ShowNum(72,6,U8T_data_H,4,16);//显示ASCII字符的码值
  358.         }
  359. }
  360. void getkey() interrupt 0
  361. {
  362.    Delay_1ms(20);
  363.    if(p32==0)                //软件消抖
  364.    {           
  365.     P13=1;
  366.     Uart1Sends("AT+CSCS=\"GSM\"\r\n");
  367.     DelaySec(1);//延时大约3秒
  368.     Uart1Sends("AT+CMGF=1\r\n");
  369.     DelaySec(1);//延时3秒
  370.         Uart1Sends("AT+CSCA?\r\n");
  371.     DelaySec(1);//延时3秒
  372.         Uart1Sends("AT+CSMP=17,167,0,241\r\n");
  373.     DelaySec(1);//延时3秒
  374.     Uart1Sends("AT+CMGS=\"13772830544\"\r\n");//此处修改为对方的电话号
  375.     DelaySec(1);//延时3秒
  376.     //fasong[20] = 2;
  377.     Uart1Sends("CO concentration: ");//修改短信内容,短信内容可为英文和数字
  378.         chuli(dat);                    //显示一氧化碳浓度

  379.         Uart1Sends("\nThe current hemperature is: ");//修改短信内容,短信内容可为英文和数字
  380.         chuli(U8RH_data_H);                    //显示一氧化碳浓度

  381.         Uart1Sends("\nThe current humidity is: ");//修改短信内容,短信内容可为英文和数字
  382.         chuli(U8T_data_H);                    //显示一氧化碳浓度
  383.     Uart1Send(0x1a);
  384.          P13=0;
  385.    
  386.         }

  387. }

复制代码


所有资料51hei提供下载:
学长毕业设计GPRS.rar (5.94 MB, 下载次数: 55)




分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏1 分享淘帖 顶 踩
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表