微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > 基于GSM模块的大棚环境参数传输与控制

基于GSM模块的大棚环境参数传输与控制

时间:11-29 来源:互联网 点击:
/**********************************************
设计者:胥学辰时间:2011-11-1——2011-11-6功能:18B20采集温度,dht11采集湿度,光敏电阻采集光照等,通过GSM接受指令传输参数,控制外部器件改变环境参数。完整代码下载:http://www.51hei.com/f/gpsdd.rar***********************************************/#include#include#include#include#define uchar unsigned char#define uint unsigned intsbit DQ_wen=P2^0;sbit DQ_shi=P2^1;uchar i=0,j=0,flag,tm,temp,wet,dat;char num[]="15282983798";                     //定义要拨打的电话号码char code Huifu_S[]="Fa Song Success!";       //定义成功发送要回复的内容char code Huifu_F[]="Fa Song Failure!";       //定义失败发送要回复的内容char Huifu_wsg[]="temp:00.00C wet:23%R";               //定义参数回复数组char xdata Huancun[200];          //定义返回值存储数组char code Ok[]="OK";           //返回OK值标志char code CMTI[]="+CMTI";          //接收短信标志char code open_1[]="open1";             //短信控制1标志char code open_2[]="open2";             //短信控制2标志char code open_3[]="open3";             //短信控制3标志char code open_4[]="open4";             //短信控制4标志void delay_key(uchar z);                      //按键延时函数void delay_GSM(uint y);                       //GSM模块延时函数void delay_18b20(uchar i);       //18b20延时函数void delay_dht11_C(uint j);       //dht11长延时函数void delay_dht11_D(uchar i);      //dht11短延时函数void chuankou_init();                         //串口初始化函数void clear_huancun();                         //清除缓存函数void send_ASCII(uchar *b);                    //发送ASCII代码函数void send_16_Hex(uchar c);                    //发送16进制代码函数bit panduan(uchar *a,uchar *b);               //判断是否返回OK与短信成功代码void GSM_Text_Message(uchar*num,uchar*Huifu); //Text模式短信发送函数void GSM_Call(uchar *num);                    //拨打电话函数void Tiqu_num();         //提取来电号码函数void init_18b20();         //18b20初始复位函数void write_18b20_dat(uchar dat);     //18b20写入字节函数uchar read_18b20_dat();        //18b20读出字节函数uchar read_18b20_temp_zs();       //18b20读取温度整数函数uchar read_18b20_temp_xs();       //18b20读取温度小数函数void dht11_init(void);        //dht11初始化函数uchar read_dht11(void);        //dht11读取湿度函数void chuli_wen_wet_light();       //18b20_dht11_light处理函数void main()           //主函数{chuankou_init();            //串口初始化clear_huancun();            //清除缓存delay_GSM(1000);            //延时while(!panduan(Huancun,Ok))         //判断返回值{send_ASCII("AT");          //发送联机命令send_16_Hex(0x0d);                     //发送回车符    send_16_Hex(0x0a);                   //发送换行符P0=0x01;                      //步骤指示灯1delay_GSM(600);          //延时}          clear_huancun();        //清除缓存P0=0x02;          //步骤指示灯2delay_GSM(600);            //延时send_ASCII("AT+CNMI=2,1");                //设置当有新短信到来时提示 send_16_Hex(0x0d);                        //发送回车符send_16_Hex(0x0a);                        //发送换行符delay_GSM(600);                           //延时while(!panduan(Huancun,Ok));              //等待设置成功clear_huancun();                          //清除缓存内容P0=0x03;                                  //步骤指示灯3delay_GSM(600);                           //延时  send_ASCII("AT+CMGF=1");                  //文本(TEXT)模式 send_16_Hex(0x0d);                        //发送回车符send_16_Hex(0x0a);                        //发送换行符delay_GSM(600);                           //延时while(!panduan(Huancun,Ok));           //等待设置成功clear_huancun();                          //清除缓存内容P0=0x04;                                  //步骤指示灯4delay_GSM(600);                           //延时send_ASCII("AT+CMGD=1");                  //删除第一条信息send_16_Hex(0x0d);                        //发送回车符send_16_Hex(0x0a);                        //发送换行符delay_GSM(600);                           //延时while(!panduan(Huancun,Ok));           //等待设置成功clear_huancun();                          //清除缓存内容while(1)          //与GSM模块联机成功后的大循环{ P0=0x05;             //步骤指示灯5chuli_wen_wet_light();       //实时采集处理温度if(panduan(Huancun,CMTI))                //若缓存字符串中含有"+CMTI"就表示有新的短信{P0=0x06;         //步骤指示灯6clear_huancun();                      //清除缓存内容delay_GSM(600);                       //延时send_ASCII("AT+CMGR=1");              //发送读取信息指令send_16_Hex(0x0d);                    //发送回车符send_16_Hex(0x0a);                    //发送换行符delay_GSM(600);                       //延时Tiqu_num();         //提取来电号码if(panduan(Huancun,open_1))           //如果信息内容是"open1"{ P0=0x10;         //指示灯GSM_Text_Message(num,Huifu_wsg);   //发送环境参数信息GSM_Text_Message(num,Huifu_S);   //发送成功短信回复}else if(panduan(Huancun,open_2))      //如果信息内容是"open2"{P0=0x20;                           //指示灯GSM_Text_Message(num,Huifu_S);   //发送成功短信回复}else if(panduan(Huancun,open_3))      //如果信息内容是"open3"{ P0=0x40;                            //指示灯GSM_Text_Message(num,Huifu_S);   //发送成功短信回复}else if(panduan(Huancun,open_4))      //如果信息内容是"open4"{ P0=0x80;                           //指示灯GSM_Text_Message(num,Huifu_S);   //发送成功短信回复}elseGSM_Text_Message(num,Huifu_F);   //发送失败短信回复clear_huancun();                      //清除缓存内容delay_GSM(600);                       //延时send_ASCII("AT+CMGD=1");              //删除读取后的信息send_16_Hex(0x0d);                    //发送回车符send_16_Hex(0x0a);                    //发送换行符delay_GSM(600);                       //延时while(!panduan(Huancun,Ok));       //等待设置成功clear_huancun();                      //清除缓存内容}} }/****************************各环节延时函数*****************************/void delay_key(uchar x)        //按键控制延时函数{uchar y;for(;x>0;x--)for(y=110;y>0;y--);}void delay_GSM(uint y)        //GSM模块延时函数{uint x;for(;y>0;y--){x=1500;while(x--);}}void delay_18b20(uchar i)       //18b20延时函数{while(i--);}void delay_dht11_C(uint j)       //dht11长延时函数{      uchar i;for(;j>0;j--) for(i=0;i<27;i++);}void delay_dht11_D(uchar i)       //dht11短延时函数{for(;i>0;i--)_nop_();}void chuankou_init()      //串口初始化函数{SCON=0x50;                      //串口:方式1,允许发送和接收TMOD=0x20;                      //定时器1:模式2,8位自动重装模式,用于产生波特率    TH1=0xFD;                       //11.0592MHZ晶振,波特率为9600TL1=0xFD;   TR1=1;                          //开启定时器1   ES=1;                           //开启串口中断EA=1;                           //开启全局中断}/****************************GSM部分函数*****************************/void clear_huancun()      //清除缓存内容函数{uchar k;for(k=0;k<200;k++)              {Huancun[k]=0;       //将缓存内容清零}i=0;                            //接收字符串的起始存储位置}void send_ASCII(uchar *b)          //发送字符串函数{ES=0;                           //关串口中断for(b;*b!=;b++){SBUF=*b;while(TI!=1);                 //等待发送完成TI=0;                         //清除发送中断标志位}    ES=1;                           //开串口中断}				   void send_16_Hex(uchar c)          //发送16进制函数{ES=0;                           //关串口中断SBUF=c;while(TI!=1);                   //等待发送完成TI=0;                           //清除发送中断标志位ES=1;                           //开串口中断}bit panduan(uchar *a,uchar *b)    //判断是否成功返回值函数{ if(strstr(a,b)!=NULL)     //如果a包含了b,则1;否则0return 1;elsereturn 0;}void Tiqu_num()        //提取来电号码函数函数{uchar i;for(i=0;i<11;i++) {num[i]=Huancun[i+36];}}void GSM_Text_Message(uchar *num,uchar *Huifu)   //Text模式短信发送{send_ASCII("AT");                    //发送联机命令send_16_Hex(0x0d);                   //发送回车符send_16_Hex(0x0a);                   //发送换行符 delay_GSM(200);         send_ASCII("AT+CMGF=1");             //发送TXET命令send_16_Hex(0x0d);                   //发送回车符send_16_Hex(0x0a);                   //发送换行符 delay_GSM(200); send_ASCII("AT+CSCS=GSM");            send_16_Hex(0x0d);                   //发送回车符send_16_Hex(0x0a);                   //发送换行符 delay_GSM(200); send_ASCII("AT+CSMP=17,167,0,0");    send_16_Hex(0x0d);                   //发送回车符send_16_Hex(0x0a);                   //发送换行符 delay_GSM(200); send_ASCII("AT+CMGS=");              //接收短信手机号send_ASCII(num);send_16_Hex(0x0d);                   //发送回车符send_16_Hex(0x0a);                   //发送换行符 delay_GSM(200); send_ASCII(Huifu);                   //发送发送成功命令send_ASCII("x1a");                  //16进制结束标志 delay_GSM(200);                          }                  void GSM_Call(uchar *num)             //拨打电话函数{send_ASCII("ATD");send_ASCII(num);send_ASCII("F;");send_16_Hex(0x0d);                   //发送回车符send_16_Hex(0x0a);delay_GSM(200);}/****************************18b20函数*****************************/void init_18b20(){uchar a; DQ_wen=1;                           //DQ复位 delay_18b20(8);                     //稍做延时 DQ_wen=0;                           //单片机将DQ拉低 delay_18b20(80);                    //精确延时大于480us DQ_wen=1;                           //拉高总线 delay_18b20(14);       //延时a=DQ_wen;                           //稍做延时后 如果a=0则初始化成功 a=1则初始化失败 delay_18b20(100);}void write_18b20_dat(uchar dat)   //18b20写入字符函数{uchar i;for(i=0;i<8;i++){DQ_wen=0;DQ_wen=dat&0x01;delay_18b20(5);DQ_wen=1;dat>>=1;}}uchar read_18b20_dat()     //18b20读出字符函数{uchar i,dat=0;DQ_wen=1;for(i=0;i<8;i++){DQ_wen=0;_nop_();_nop_();dat>>=1;DQ_wen=1;_nop_();_nop_();if(DQ_wen)dat|=0x80;delay_18b20(30);DQ_wen=1;}return dat;}uchar read_18b20_temp_zs()    //18b20温度整数读取函数{uchar a,b,c;init_18b20();write_18b20_dat(0xcc);write_18b20_dat(0x44);init_18b20();write_18b20_dat(0xcc);write_18b20_dat(0xbe);a=read_18b20_dat();b=read_18b20_dat();c=a&0x0f;b<=4;b+=(a&0xf0)>>4;return b;}uchar read_18b20_temp_xs()    //18b20温度小数读取函数{uchar a,b,c;init_18b20();write_18b20_dat(0xcc);write_18b20_dat(0x44);init_18b20();write_18b20_dat(0xcc);write_18b20_dat(0xbe);a=read_18b20_dat();b=read_18b20_dat();c=a&0x0f;b<=4;b+=(a&0xf0)>>4;return c;}/****************************dht11函数*****************************/void dht11_init(void)     //dht11初始化复位函数{uchar i;for(i=0;i<8;i++)    {flag=2; while((!DQ_shi)&&flag++);delay_dht11_D(2);tm=0;if(DQ_shi)tm=1;flag=2;while((DQ_shi)&&flag++);   if(flag==1)break;      dat<=1;dat|=tm;       }  }uchar read_dht11(void)    //dht11读取湿度函数{uchar wet_L,temp_L,temp_H,wet_H,JY;DQ_shi=0;delay_dht11_C(180);DQ_shi=1;delay_dht11_D(4); DQ_shi=1;   if(!DQ_shi)    {flag=2; while((!DQ_shi)&&flag++);flag=2;while((DQ_shi)&&flag++);  dht11_init();wet_H=dat;dht11_init();wet_L=dat;dht11_init();temp_H=dat;dht11_init();temp_L=dat;dht11_init();JY=dat;DQ_shi=1;tm=(temp_H+temp_L+wet_H+wet_L);if(tm==JY){temp=temp_H;wet=wet_H;}}return wet;}void chuli_wen_wet_light()    //采集数据处理函数{uchar temp_zs,temp_xs,wet_zs;temp_zs=read_18b20_temp_zs();   //读取18b20温度整数temp_xs=read_18b20_temp_xs();   //读取18b20温度小数wet_zs=read_dht11();     //dht11湿度整数Huifu_wsg[6]=temp_zs%10+0;   //数据转化为字符存入字符数组Huifu_wsg[5]=temp_zs/10+0;Huifu_wsg[9]=temp_xs%10+0;Huifu_wsg[8]=temp_xs/10+0;Huifu_wsg[17]=wet_zs%10+0;   Huifu_wsg[16]=wet_zs/10+0;}void timer4() interrupt 4  using 1{ ES=0;                        //关串口中断,防止中断嵌套if(TI)                        //如果是发送中断,则不做任何处理TI=0;                          //清除发送中断标志位if(RI)                        //如果是接送中断,则进行处理{RI=0;                        //清除接收中断标志位Huancun[i]=SBUF;             //将接收到的字符串存到缓存中i++;                         //缓存指针向后移动if(i>200)                    //如果缓存满,将缓存指针指向缓存的首地址i=0;}ES = 1;                        //开启串口中断}

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top