第8章基于gprs技术的远程监控系统.doc_第1页
第8章基于gprs技术的远程监控系统.doc_第2页
第8章基于gprs技术的远程监控系统.doc_第3页
第8章基于gprs技术的远程监控系统.doc_第4页
第8章基于gprs技术的远程监控系统.doc_第5页
已阅读5页,还剩37页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

8.5 软件设计本系统的软件设计主要包括以下几个部分:A/D转换子程序、时钟芯片DS12887初始化子程序、看门狗芯片的初始化及复位子程序、外部控制接点输出子程序、查询外部开关量的状态子程序、网络部分子程序等。其中网络部分是本模块软件设计相对复杂的部分,也是软件设计的重点部分。网络部分主要包括以下几个部分:GPRS MODEM拨号部分、LCP协商部分、IPCP协商部分、查找UDP包部分、UDP解包部分、UDP包的发送部分、短信报警部分等。下面分别给出主要部分的程序流程图以及相应的源代码,供读者参考。8.5.1 主程序#include#include#include#include#define uchar unsigned char #define uint unsigned int#define ulong unsigned long#define Add_h 0x00#define Add_l 0x01extern uchar data backup_P1;extern uchar xdata receive_buff256;extern uchar xdata count;extern uint xdata crc;extern uint xdata ppp_s_id;extern uchar xdata local_ip4;extern uchar xdata host_ip4;void reset_dog(void);void set_system_time(void);void out_io(void);void sd_connected_prove(void);void send_ad(void);uchar data backup_P1;/中断时用来保存片选uchar xdata receive_buff256 _at_ 0x0101;/256字节的接收缓冲区uchar xdata local_ip4;uchar xdata host_ip4;uint xdata crc=0;uchar xdata count=0;/接受数组下表,自动转头uint xdata ppp_s_id=0x3600;void csh_X25045(void);void main(void)uchar xdata h;ppp_s_id=0x3600;P1=0x1c;/选中ramcsh_X25045();baud();/设置波特率P1=0x1c;/-缓冲区清0-/for(h=0;h255;h+)receive_buffh=0x00;reset_dog();initstat_mc35();/set mc35msg();/找到短信dail();confg();/ 上网p_service();sd_connected_prove();while(1)P1=0x1c;reset_dog();read_io(); /读4路io口状态,放入io_state4数组read_ad(); /读4路AD数值,放入ad_value4数组 P1=0x0D;/选中ds12887,读系统时间,放入date6数组r_ds();P1=0x1c;for(h=0;h100;h+)delays();find_config_frame();/找udp包switch (receive_config_frame35)case 0x50:send_ad(); break;/发送对应模拟开关量case 0x70:set_system_time(); break;/设置系统时间set_system_time.ccase 0x95:out_io(); break;/执行开关量io_out.cdefault:_nop_();8.5.2 相关的硬件驱动程序1. 延时子程序void delay(uchar data a) /延时程序,延时a个机器周期 uchar data b; for(b=0;b=a;b+) _nop_(); 2. A/D转换子程序sbit sa_clk=P15;sbit sa_in=P17;sbit sa_out=P16;void delay(uchar);uint read2543(uchar data channel) /A/D转换子程序 read2543 uchar data al=0,ah=0; uint data ad; uint data i; switch (channel) /通道转换 case 0x01:channel=0x00; break;case 0x02:channel=0x01; break;case 0x03:channel=0x04; break;case 0x04:channel=0x05; break;default :channel=0x00; break; channel=4; P1=0x08; /使cs=1 P1=0x0E; /使cs=0 sa_out=0; sa_clk=0; sa_in=0; for (i=0;i12;i+)/把控制字打入2543 sa_in=(bit)(channel&0x80); sa_clk=1; _nop_();/delay(0x00); channel=1; sa_clk=0; _nop_();/delay(0x00); for (i=0;i4;i+) /取D11,D10,D9,D8 sa_out=1; sa_clk=1; _nop_();/delay(0x00); ah=1;if (sa_out) ah|=0x01;al=1; if (sa_out) al|=0x01; sa_clk=0; _nop_(); /delay(0x00); P1=0x1c; /选中ram ad=(uint)ah;ad=8;ad|=al;/得到AD值 return (ad); 3. 外部控制接点输出子程序sbit s_out=P17;sbit s_clk=P15;void out_io(void) s_out=(int)receive_config_frame39; /第四路输出开关状态,开是0,关是1 s_clk=0; s_clk=1; s_out=(int)receive_config_frame38; /第三路输出开关状态,开是0,关是1 s_clk=0; s_clk=1;s_out=(int)receive_config_frame37; /第二路输出开关状态,开是0,关是1 s_clk=0; s_clk=1;s_out=(int)receive_config_frame36; /第一路输出开关状态,开是0,关是1 s_clk=0; s_clk=1; P1=0x0a; /373的LE有效,锁存 P1=0x0a; delay(0x08); P1=0x09; /373输出P1=0x09 delay(0x08); P1=0x1c;/选中ramreceive_config_frame35=0x00;4. 外部开关量查询子程序sbit D11=P33;sbit D12=P32;sbit D13=P35;sbit D14=P34;uchar xdata io_state4;void read_io(void)D11=1; /读INT1(IO1)状态if(D11)io_state0=0x01;elseio_state0=0x00;D12=1;/读INT0(IO2)状态if(D12)io_state1=0x01;elseio_state1=0x00;D13=1;/读T1(IO3)状态if(D13)io_state2=0x01;elseio_state2=0x00;D14=1;/读T0(IO4)状态if(D14)io_state3=0x01;elseio_state3=0x00;8.5.3 网络部分子程序网络部分软件设计是本项目的设计重点,下面将给出详细的软件流程图,同时给出相应的源程序。参考前面的关键技术分析部分对网络部分的分析,再对照给出的软件流程,相信能给读者提供一定的启发。程序的流程图如图8-26所示。图8-26 程序流程图网络部分的源代码如下:#define _DATATPYE_Htypedef unsigned char U8;typedef unsigned int U16;typedef unsigned long U32;typedef signed char S8;typedef signed int S16;typedef signed long S32;#define TRUE 1#define FALSE 0#define OK1#define FAIL0#define _LIB_H#define DEALY1S 1s#define UART0 0#define UART1 1void Delay(volatile U16 time);void Prints(S8 * ptr , U8 port);void Print(S8 * ptr , U8 len , U8 port);void InitMc35(void);void Prints(S8 * ptr , U8 port)while (* str)UartSend(*ptr+ , port);void Print(S8 * ptr , U8 len , U8 port)U8 i ;for ( i=0; ilen; i+)UartSend(*ptr+, port)void PrintBuff(U8 * ptr , U8 port)for (U8 bb=0; bb2; ) if (*ptr = 0x7e)bb+;UartSend(*ptr+, port);void InitMc35(void)static S8 splus=+rn;static S8 sATH=ATHrn;static S8 sATE0V0Q0=ATE0V0Q0rn;static S8 sAT_CMGF=AT+CMGF=1rn;static S8 sAT_CGDCONT=AT+CGDCONT=1,IP,gzeunt.gdrn;static S8 sATDT=ATDT*99*1#rn;/*send + twice*/Prints(splus, UART0);Delay(DELAYTIME);Prints(splus, UART0);Delay(DEALY1S);/*sendATH,wait MC35 answer 300D*/doPrints(sATH , UART0);Delay(DEALY1S);while(!( (uart0RevBuffuart0Count-2 = 0x30) & (uart0_revbuffuart0_count-1 = 0x0D) );uart0RevBuffuart0Count-2 = 0;uart0RevBuffuart0Count-1 = 0;/*send ATE0V0Q0,wait mc35 answer 300D*/doPrints(sATE0V0Q0, UART0);Dealy(DELAY1S);while(!( (uart0RevBuffuart0Count-2 = 0x30) & (uart0_revbuffuart0_count-1 = 0x0D) );uart0RevBuffuart0Count-2 = 0;uart0RevBuffuart0Count-1 = 0;/*set MSM message format to TEXT model AT+CMGF=1 */doPrints(sAT_CMGF, UART0);Delay(DEALY1S);while(!( (uart0RevBuffuart0Count-2 = 0x30) & (uart0_revbuffuart0_count-1 = 0x0D) );uart0RevBuffuart0Count-2 = 0;uart0RevBuffuart0Count-1 = 0;/*Set APNAT+CGDCONT=1,IP,gzeunt.gdrn*/doPrints(sAT_CGDCONT, UART0);Delay(DEALY1S);while(!( (uart0RevBuffuart0Count-2 = 0x30) & (uart0_revbuffuart0_count-1 = 0x0D) );uart0RevBuffuart0Count-2 = 0;uart0RevBuffuart0Count-1 = 0;/*set GPRS sevice “ATDT*99*1#” */doPrints(sATDT , UART0);Delay(DEALY1S);while(!( (uart0RevBuffuart0Count-2 = 0x30) & (uart0_revbuffuart0_count-1 = 0x0D) );uart0RevBuffuart0Count-2 = 0;uart0RevBuffuart0Count-1 = 0;/*transfer meaning*/* author: muyi date:2004.4.20 * rework: date:2004.11.1 * function:the datas between the start and end 7e not including the start and end themselves which are 0x7e 0x7d or 0; len-)if ( (*p_nontransfer = 0x7e) | (*p_nontransfer = 0x7d) | (*p_nontransfer 0) fcs = (fcs 8) crctab16(fcs *pData) & 0xff; nLength-; pData+; return fcs; U8 IsCrc16Good(const U8 *pData, U8 nLength) U16 fcs = 0xffff; pData+; while(nLength0) fcs = (fcs 8) crctab16(fcs *pData) & 0xff; nLength-; pData+; return (fcs = 0xf0b8); / 0xf0b8 is CRC-ITUsMagic Value/*find buff*/* author: muyi date:2004.10.20 * rework: date:2004.11.1 * function: find out the frame in uart0_revbuff256;check the crc ,if the crc is right ,delete the ff 03 * after the start 7e *IO: return 1 when crc ok ,0 when crc false*/U8 Find_Frame(void)U8 back_count0 = uart0_count;U8 flag_start7e = FAIL;U8 flag_end7e = FAIL;U8 start7e = 0;U8 end7e = 0;U8 i = 0;U8 j = 0;U8 k = 0;U8 temp150;for (k=0; k255; k+,back_count0-)/ find the end 7eif (uart0_revbuffback_count0 = 0x7e)if (uart0_revbuffback_count0-1 = 0x7e)/in case of.7e7e.back_count0-;end7e=back_count0;/mark the end 7eflag_end7e = OK;break;elseend7e = back_count0;/mark the end 7eflag_end7e = OK;break; back_count0-;for (k=0; k255; k+,back_count0-)/find the start 7eif (uart0_revbuffback_count0 = 0x7e)start7e = back_count0;/mark the start 7eflag_start7e = OK;break;if (flag_start7e = FAIL | flag_end7e = FAIL)/if there is no frame , go to the endgoto END;k=0;/copy the found frame from uart0_recbuff to tempfor (i=start7e,j=0; k0x02; i+,j+)tempj = uart0_revbuffi;if (uart0_revbuffi = 0x7e)k+; receiveFrame0 = temp0;/start7e for (i=1,j=1; tempi!=0x7e; i+,j+)/transfer meaningif (tempi = 0x7d)receiveFramej=(tempi+1&0x20)?(tempi+1&0xdf):(tempi+1|0x20);i+;elsereceiveFramej = tempi;receiveFramej = tempi;if ( IsCrc16Good(receiveFrame , j-1) )uart0_revbuffstart7e = 0;/ clear the found frame in the revbuff0uart0_revbuffend7e = 0;if (receiveFrame1 = 0xff)for (i=1; i149; i+)/if receiveFrame1=0xff ,then drop itreceiveFramei = receiveFramei+1;if (receiveFrame1 = 0x03)/if receiveFrame1=0x03 ,then drop itfor (i=1; i149; i+)receiveFramei = receiveFramei+1;return 1;else/ if crc check fail then clear the receiveFramefor (i=0; i150; i+)receiveFramei = 0;return 0;END:return 0 ;/*lcp*/void Lcp(void)U8 *p_lcp=receiveFrame;U16 crc16;U8 flag=0;U8 i;Static U8;copy1=0x7e,0xff,0x03,0xc0,0x21,0x03,0x00,0x00,0x08,0x03,0x04,0xc0,0x23,0x00,0x00,0x7e;/papU8 temp50;U8 flag_sd=1;p_lcp=p_lcp+3;switch(*p_lcp)case 0x01:/requestp_lcp=p_lcp+4;doswitch (*p_lcp)case 0x01:/Maximum-Receive-Unitpassp_lcp=p_lcp+4;break;case 0x02:/Async-Control-Character-Map passp_lcp=p_lcp+6;break;case 0x03:/Authentication-Protocol chap to papif ( *(p_lcp+1) = 0x05 )flag=1;p_lcp=p_lcp+5;for (i=0; i10; i+)tempi=copy1i;temp6=receiveFrame4;/indentiferelse p_lcp=p_lcp+4;break;case 0x05:/Magic-Numberp_lcp=p_lcp+6;break;case 0x07:/Protocol-Field-Compressionp_lcp=p_lcp+2;break;case 0x08:/Address-and-Control-Field-Compressionp_lcp=p_lcp+2;break;default:break;while( (flag = 0x00) & ( *(p_lcp+2) != 0x7e) );if (flag = 0x00 )flagLcpServ = OK;temp0=0x7e; temp1=0xff;temp2=0x03;for(i=1; i6+receiveFrame6; i+)tempi+2=receiveFramei;temp5=0x02;/ackbreak;case 0x02:flagLcpClient = OK;flag_sd = 0;case 0x03:temp0=0x7e; temp1=0xff;temp2=0x03;for(i=1; i 8) & 0xff;Transfer_Meaning( temp , temp8+8 );PrintBuff(uart0SendBuff , UART0);/*Pap*/void Pap(void)if (receiveFrame3 = 0x02 )flagPap = OK; /*Ipcp*/void Ipcp(void)U8 *p_ipcp = receiveFrame;U16 crc16;U8 i;U8 temp50;U8 flag_sd=1;p_ipcp = p_ipcp+3;switch (*p_ipcp)case 0x01:for (i=0; ireceiveFrame6+6; i+)/copy receiveFrame to temp and set it to acktempi = receiveFramei;temp3 = 0x02;if ( *(p_ipcp+3) = 0x0a)flagIpcpServ = OK;break;case 0x02:flagIpcpClient = OK;/get IP hereflag_sd = 0;break;case 0x03:for (i=0; i 8) & 0xff;Transfer_Meaning( temp , temp6+6 );PrintBuff(uart0SendBuff , UART0);/*Dail Gprs*/U8 DailGprs(void)U8 flagIpcpClient = FAIL;U8 flagIpcpServ = FAIL;U8 flagLcpServ=FAIL;U8 flagLcpClient=FAIL;U8 flagPap=FAIL;U8 receiveFrame256;do ClientConfig(); Delay(DELAY1S); while ( FindFrame() ); Protocol(); while ( !(flagIpcpClient & flagIpcpServ) );/*UDP*/void GprsSendData(S8 * pSendData , U8 len)U8 *pCheckSum;U16 a,b

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论