www.pudn.com > tc35i-SMS_Mcu_Program.rar > sl.c, change:2004-03-26,size:75725b


//----------------------------------------------------------------------------------- 
// Includes 
//----------------------------------------------------------------------------------- 
//#include <c8051f020.h>								// SFR declarations 
//#include <Absacc.h> 
//#include <MAC.c> 
 
//----------------------------------------------------------------------------------- 
// Global CONSTANTS 
//----------------------------------------------------------------------------------- 
#define  UINT  unsigned int 
#define  UCHAR unsigned char 
 
#define PPPINITFCS16	0xffff				/* Initial FCS value */ 
#define PPPGOODFCS16	0x3e62				/* Good final FCS value */ 
 
/* SW_UART CONSTANTS DEFINITION */ 
#define	BAUD_RATE		9600				// User-definable SW_UART baud rate 
#define	SYSCLK			18432000			// System clock derived from 18.432MHz XTL 
#define TIME_COUNT		SYSCLK/BAUD_RATE/4	// Number of PCA counts for one bit-time. 
											// (PCA configured to count SYSCLK/4) 
#define	TH_TIME_COUNT	TIME_COUNT*3/2		// 3/2 bit-time, for use after receiving 
												// a START bit.  RX should be LOW for one 
												// bit-time after the edge of the START, 
												// and the first bit sample starts in the 
												// middle of the next bit-time. 
#define	HW_TIME_COUNT	SYSCLK/BAUD_RATE/16 // Time count for HW_UART baud rate 
 
#define TI1 (SCON1 & 0x02) 
sfr 	PRT1IF=0xad;						// 设置外部中断7寄存器 
 
 
/* define FLASH address */															// above. 
#define StartAddress	0x1000 
#define Backup_Add0		0x2000 
#define Backup_Add1		0x3000 
#define Backup_Add2		0x4000 
#define Address5555  XBYTE[0x5555] 
#define Address2AAA  XBYTE[0x2AAA] 
 
/* define time chip address */ 
#define IniDataAddress 0xF000 
 
//define RTC Register 
#define RegA         XBYTE[0xff0a] 
#define RegB         XBYTE[0xff0b] 
#define RegC         XBYTE[0xff0c] 
#define RegD         XBYTE[0xff0d] 
#define Hour         XBYTE[0xff04] 
#define Minute       XBYTE[0xff02] 
#define Second       XBYTE[0xff00] 
#define Year         XBYTE[0xff09] 
#define Month        XBYTE[0xff08] 
#define Day          XBYTE[0xff07] 
#define Week         XBYTE[0xff06] 
#define Century      XBYTE[0xff32] 
#define Hour_Alarm   XBYTE[0xff05] 
#define Minute_Alarm XBYTE[0xff03] 
#define Second_Alarm XBYTE[0xff01]  
 
#define Record_Ind	 XBYTE[0xff34] 
 
// define Initilized Data Address 
#define Monitor_IP_Add		0x01 
#define Monitor_PORT_Add	0x05 
#define Machine_Num			0x07 
#define Machine_Cycle		0x09 
#define Pressure_Limit		0x0A 
#define Power_Limit			0x0C 
#define UP_Send_Time		0x0E 
#define Time_Interval		0x10 
 
 
 
 
//--------------------------------------------------------------------------------------------------- 
//Global VARIABLES 
//----------------------------------------------------------------------------------- 
/* SW_UART VARIABLES DEFINITION */ 
bit		SRI;							// SW_UART Receive Complete Indicator 
bit		STI;		   					// SW_UART Transmit Complete Indicator 
bit		STXBSY;							// SW_UART TX Busy flag 
bit		SREN;							// SW_UART RX Enable 
bit		SES;							// SW_UART User-level Interrupt Support Enable 
 
sbit	SW_RX = P0^4;  					// SW_UART Receive pin 
sbit	SW_TX = P1^2;  					// SW_UART Transmit pin 
//------------------------------------------------------------------------------------ 
sbit    P1_4  = P1^4;					// BUTTON DOOR 
sbit    P1_3  = P1^3;					// BUTTON CARGO 
sbit    P1_5  = P1^5;					// BUTTON CLEAR 
//------------------------------------------------------------------------------------ 
sbit    CS_RTC=P1^7;					//RTC Chip Select,Low Effect, Flash Chip Select pin 
sbit    GPRS_LED=P1^6;                  // 
 
bit		Net_Ok_Flag=0;					// 网络连接成功标识符 
bit		Timer3_Flag=0;					// Flag for GSM Init and EXCHANGE4 resend  
                       
bit		Reset_Flag=0; 
bit		EXCH_SEND4_Flag=0; 
 
// 软串口缓存区定义 
unsigned char 	TDR;					// SW_UART TX Data Register 
unsigned char 	RDR;					// SW_UART RX Data Register (latch) 
unsigned char xdata Ini_Data_Buffer[26],*Ini_Data_BufferPoint; 
unsigned char xdata Ini_Data_Num_Reci=0,Ini_Data_Num_Send=0; 
unsigned char xdata Receive_Ini_Flag=0; 
bit Ini_Data_Flag=0; 
//------------------------------------------------------------------------------------- 
unsigned int xdata counter_timer3=0; 
unsigned int xdata Timer3_Counter=0; 
 
// GSM Commands 
unsigned char xdata GSMCommand1[7] = "AT+CSQ\r"; 
unsigned char xdata GSMCommand2[12] = "ATD*99***1#\r"; 
 
 
/*MPU shake hands with WAVECOM*/ 
UCHAR xdata EXCHANGE1[22]={0x7E,0xFF,0x03,0xC0,0x21,0x01,0x01,0x00,0x0E,0x02,0x06,0x00,0x00,0x00,0x00,0x07,0x02,0x08,0x02,0x00,0x00,0x7E}; 
UCHAR xdata EXCHANGE2[30]={0x7E,0xFF,0x03,0xC0,0x21,0x02,0x01,0x00,0x16,0x01,0x04,0x05,0xDC,0x02,0x06,0x00,0x00,0x00,0x00,0x07,0x02,0x08,0x02,0x03,0x04,0xC0,0x23,0x00,0x00,0x7E}; 
UCHAR xdata EXCHANGE3[21]={0x7E,0xC0,0x23,0x01,0x01,0x00,0x0F,0x09,0x48,0x55,0x41,0x4E,0x47,0x4C,0x45,0x49,0x5C,0x00,0x00,0x00,0x7E}; 
UCHAR xdata EXCHANGE4[21]={0x7E,0xC0,0x23,0x01,0x02,0x00,0x0F,0x09,0x48,0x55,0x41,0x4E,0x47,0x4C,0x45,0x49,0x5C,0x00,0x00,0x00,0x7E}; 
UCHAR xdata EXCHANGE5[16]={0x7E,0x80,0x21,0x01,0x03,0x00,0x0A,0x03,0x06,0x00,0x00,0x00,0x00,0x97,0x5D,0x7E}; 
UCHAR xdata EXCHANGE6[16]={0x7E,0x80,0x21,0x02,0x01,0x00,0x0A,0x03,0x06,0xC0,0xA8,0x6F,0x6F,0xA4,0x3D,0x7E}; 
UCHAR xdata EXCHANGE7[16]={0x7E,0x80,0x21,0x01,0x04,0x00,0x0A,0x03,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0x7E}; 
 
/*Disconnect form GPRS network*/ 
//UCHAR xdata EXCHANGE8[14]={0x7E,0xFF,0x03,0xC0,0x21,0x05,0x01,0x00,0x06,0x00,0x00,0x96,0xE,0x7E}; 
//UCHAR xdata EXCHANGE9[12]={0x7E,0xFF,0x03,0xC0,0x21,0x06,0x02,0x00,0x04,0x00,0x00,0x7E}; 
 
// Definition of frame information 
UCHAR xdata Frame_Head[2]={0x7E,0x21}; 
UCHAR xdata IP_Head[20]={0x45,0x9D,0xFF,0xFF,0x00,0x00,0x00,0x00,0xFF,0x11,0x00,0x00,0xFF,0xFF,0xFF,0xFF,211,71,10,117}; 
UCHAR xdata UDP_Head[8]={0x03,0xEA,0x02,0xBD,0x00,0x00,0x00,0x00}; 
UCHAR xdata Frame_End[3]={0x00,0x00,0x7E}; 
 
// 串口中断接收缓存区定义 
unsigned char xdata rec[50],RECEIVEBUFFER[100],*RECEIVEBUFFERPOINT;	// UART0 RECEIVE buffer 
unsigned char xdata WAVE_Receive_Num = 0; 
unsigned char xdata Receive_Buf_UAR1[300];		// UART1 RECEIVE buffer 
unsigned int xdata CAIJI_Receive_Len; 
//unsigned char xdata Inf_Buffer_UART1[20];							// 采集板送来数据存放区 
 
bit RECEIVE_FLAG = 0,PADDING_Flag = 0,PPP_Rec_Complete = 0;			// UART0 RECEIVE FLAG 
bit Receive_Flag_UART1=0,Padding_Flag_UART1=0,UART1_Rec_Complete=0; // UART1 RECEIVE FLAG 
bit PPP_First_Receive=0; 
bit GPRS_OK = 0; 
 
// WAVECOM收发数据相关定义 
bit WAVE_Data_Receive = 0,WAVE_Resend_Flag = 0; 
unsigned char xdata WAVE_Timer=0,WAVE_Resend_Num,WAVE_Receive_SeqNr = 0,WAVE_Send_SeqNr=0; 
unsigned char xdata WAVE_Data_Buffer[50],WAVE_Command_Buf[300]; 
unsigned char xdata WAVE_Data_Len; 
unsigned int xdata WAVE_Comm_Len; 
 
// 采集板收发数据相关定义 
bit CAIJI_Data_Receive = 0,CAIJI_Resend_Flag = 0; 
unsigned char xdata CAIJI_Timer=0,CAIJI_Resend_Num,CAIJI_Receive_SeqNr = 0,CAIJI_Send_SeqNr = 0; 
unsigned char xdata CAIJI_Data_Buffer[300],CAIJI_Command_Buf[15]; 
unsigned int xdata CAIJI_Data_Len; 
unsigned char xdata CAIJI_Comm_Len; 
 
// 采集命令的相关定义 
bit Data_Gather_Comm = 0,WAVECOM_Gather=0,Time_Gather = 0; 
bit Data_Ready_Flag = 0; 
unsigned char xdata Frame_Num = 0; 
 
 
bit WAVE_Timer_End = 0; 
bit CAIJI_Timer_End = 0; 
 
// 数据备份相关定义 
unsigned char xdata Backup_Index; 
unsigned int  Current_Add; 
 
// 上电初始化标识设定 
bit Init_Flag = 0; 
 
// 外部中断1相关定义 
bit Send_Test_Frame = 0; 
bit Test_Frame_Answer = 0; 
bit Timer_Gather_Flag = 0; 
unsigned char xdata Timer_Num = 0; 
 
 
// 测试数据定义 
bit send_flag=1; 
 
unsigned char xdata Inf_Buffer[10]; 
 
UINT code fcstab[256] = { 
   0x0000, 0x1189, 0x2312, 0x329b, 0x4624, 0x57ad, 0x6536, 0x74bf, 
   0x8c48, 0x9dc1, 0xaf5a, 0xbed3, 0xca6c, 0xdbe5, 0xe97e, 0xf8f7, 
   0x1081, 0x0108, 0x3393, 0x221a, 0x56a5, 0x472c, 0x75b7, 0x643e, 
   0x9cc9, 0x8d40, 0xbfdb, 0xae52, 0xdaed, 0xcb64, 0xf9ff, 0xe876, 
   0x2102, 0x308b, 0x0210, 0x1399, 0x6726, 0x76af, 0x4434, 0x55bd, 
   0xad4a, 0xbcc3, 0x8e58, 0x9fd1, 0xeb6e, 0xfae7, 0xc87c, 0xd9f5, 
   0x3183, 0x200a, 0x1291, 0x0318, 0x77a7, 0x662e, 0x54b5, 0x453c, 
   0xbdcb, 0xac42, 0x9ed9, 0x8f50, 0xfbef, 0xea66, 0xd8fd, 0xc974, 
   0x4204, 0x538d, 0x6116, 0x709f, 0x0420, 0x15a9, 0x2732, 0x36bb, 
   0xce4c, 0xdfc5, 0xed5e, 0xfcd7, 0x8868, 0x99e1, 0xab7a, 0xbaf3, 
   0x5285, 0x430c, 0x7197, 0x601e, 0x14a1, 0x0528, 0x37b3, 0x263a, 
   0xdecd, 0xcf44, 0xfddf, 0xec56, 0x98e9, 0x8960, 0xbbfb, 0xaa72, 
   0x6306, 0x728f, 0x4014, 0x519d, 0x2522, 0x34ab, 0x0630, 0x17b9, 
   0xef4e, 0xfec7, 0xcc5c, 0xddd5, 0xa96a, 0xb8e3, 0x8a78, 0x9bf1, 
   0x7387, 0x620e, 0x5095, 0x411c, 0x35a3, 0x242a, 0x16b1, 0x0738, 
   0xffcf, 0xee46, 0xdcdd, 0xcd54, 0xb9eb, 0xa862, 0x9af9, 0x8b70, 
   0x8408, 0x9581, 0xa71a, 0xb693, 0xc22c, 0xd3a5, 0xe13e, 0xf0b7, 
   0x0840, 0x19c9, 0x2b52, 0x3adb, 0x4e64, 0x5fed, 0x6d76, 0x7cff, 
   0x9489, 0x8500, 0xb79b, 0xa612, 0xd2ad, 0xc324, 0xf1bf, 0xe036, 
   0x18c1, 0x0948, 0x3bd3, 0x2a5a, 0x5ee5, 0x4f6c, 0x7df7, 0x6c7e, 
   0xa50a, 0xb483, 0x8618, 0x9791, 0xe32e, 0xf2a7, 0xc03c, 0xd1b5, 
   0x2942, 0x38cb, 0x0a50, 0x1bd9, 0x6f66, 0x7eef, 0x4c74, 0x5dfd, 
   0xb58b, 0xa402, 0x9699, 0x8710, 0xf3af, 0xe226, 0xd0bd, 0xc134, 
   0x39c3, 0x284a, 0x1ad1, 0x0b58, 0x7fe7, 0x6e6e, 0x5cf5, 0x4d7c, 
   0xc60c, 0xd785, 0xe51e, 0xf497, 0x8028, 0x91a1, 0xa33a, 0xb2b3, 
   0x4a44, 0x5bcd, 0x6956, 0x78df, 0x0c60, 0x1de9, 0x2f72, 0x3efb, 
   0xd68d, 0xc704, 0xf59f, 0xe416, 0x90a9, 0x8120, 0xb3bb, 0xa232, 
   0x5ac5, 0x4b4c, 0x79d7, 0x685e, 0x1ce1, 0x0d68, 0x3ff3, 0x2e7a, 
   0xe70e, 0xf687, 0xc41c, 0xd595, 0xa12a, 0xb0a3, 0x8238, 0x93b1, 
   0x6b46, 0x7acf, 0x4854, 0x59dd, 0x2d62, 0x3ceb, 0x0e70, 0x1ff9, 
   0xf78f, 0xe606, 0xd49d, 0xc514, 0xb1ab, 0xa022, 0x92b9, 0x8330, 
   0x7bc7, 0x6a4e, 0x58d5, 0x495c, 0x3de3, 0x2c6a, 0x1ef1, 0x0f78 
   }; 
 
void Delay10ms(); 
 
// 初始化子程序组 
void Baudrate_Init(void); 
void AT(); 
void GSM_INI(void); 
void ATD99(); 
void Download_Init_Data(); 
 
void SW_UART_INIT();		// SW_UART initialization routine 
void SW_UART_ENABLE(); 
 
void Interrupt_Enable(void); 
void Ini_Data_Deal(); 
// 握手子程序组 
void EXCH_SEND1(); 
void EXCH_SEND2(); 
void EXCH_SEND3(); 
void EXCH_SEND4(); 
void EXCH_SEND5(); 
void EXCH_SEND6(); 
void EXCH_SEND7(); 
 
// FLASH程序组 
void Write_Byte(unsigned int w_address, unsigned char w_byte); 
void Erase_Sector(unsigned int w_address); 
void Erase_Chip(void); 
//void Flash_Test(void); 
 
// RTC程序组 
void RTC_Init(void); 
void RTC_Time_Update(unsigned char xdata *source); 
//void RTC_Test(void); 
 
// FCS校验子程序组 
UINT pppfcs16(UINT fcs,unsigned char *cp,int len); 
void Fcs16(unsigned char *cp,int len); 
 
// 头校验子程序组 
void CHECKSUM_UDP(unsigned int Data_length); 
long cksum(unsigned char *ip, int len); 
 
// 应用子程序组 
void DEAL_DATA_WAVECOM(void); 
void WAVE_Rec_Ack(void); 
void SEND_DATA_CAIJI(unsigned char Data_Len); 
void SEND_DATA_WAVECOM(unsigned int data_len); 
 
void DEAL_DATA_CAIJI(void); 
 
// 监控命令程序组 
void Machine_Message_Set(void); 
void Pressure_Limit_Set(void); 
void Power_Limit_Set(void); 
void UP_Timer_Set(void); 
void Time_Interval_Set(void); 
 
void Data_Gather_Set(void); 
void Open_Machine_Comm(void); 
void Close_Machine_Comm(void); 
 
void Link_Send_Comm(); 
void Test_Frame_Send(); 
void Timer_Gather_Deal(); 
 
//采集命令组 
void Frame_Data_Deal(); 
void Trouble_Inform_Comm(); 
void Data_Ready_Comm(); 
void Get_Data_Comm(); 
 
// 重发程序组 
void CAIJI_Resend_Deal(); 
void WAVE_Resend_Deal(); 
 
void MAIN (void) 
{ 
	UINT delay;						// Delay counter. 
  	UINT i; 
	unsigned char j; 
	 
//	ProtectCode(); 
	 
	OSCXCN = 0x67;					// Enable external crystal	 
	WDTCN = 0xDE;					// disable watchdog timer 
	WDTCN = 0xAD; 
 
 
    EMI0CF = 0x07;	      			// Set External Memory Configuration Register,使用片内 4K 和片外存储器 低端口,地址数据复用  
    XBR0 = 0x0c;               		// Set UART0,CEX0,CEX1, 
    XBR1 = 0x14;    	      		// Set /INT0,/INT1 
    XBR2 = 0x46;              		// Set UART1,Enable XBAR,Enable EMFILE 
     
    P0MDOUT = 0xe5; 				// Output configuration for P0  
    P1MDOUT = 0xc4; 				// Output configuration for P1  
    P2MDOUT = 0xff; 				// Output configuration for P2  
    P3MDOUT = 0xff; 				// Output configuration for P3 
    P0 |= 0x1a;     				// Enable RX0 
                    				// Enable RX1 
    P1 |= 0x3b;     				// Enable RX2 
      
	// 输出PIN初始化 
    GPRS_LED=1;						// LED灯指示初始化 
    CS_RTC=1;                       // 禁止访问时钟芯片   
		 
	delay=256;						// Delay >1 ms  before polling XTLVLD. 
	while(delay--); 
 
	while (!(OSCXCN & 0x80));		// Wait until external crystal has									// started. 
	OSCICN = 0x0C;					// Switch to external oscillator 
	OSCICN = 0x88;					// Disable internal oscillator; enable  
                        			// missing clock detector. 
	while (!(OSCXCN & 0x80));		// Wait until external crystal has									// started. 
	OSCICN = 0x08;					// Switch to external oscillator 
 
	// 初始化UART0、UART1、TIMER2、TIMER4、TIMER3 ,定时器3中断开 
  	Baudrate_Init();                // 初始化串口0和串口1的波特率 
	 
	IP |= 0x10;						// interrupt UART0 priority 
	IT0 = 1;						// 设置外部中断1为沿触发 
 
	// 初始化软串口 
	SW_UART_INIT();					 
 
	// 时间芯片初始化 
	//	RTC_Init(); 
 
	// 复位WAVECOM 
    GPRS_LED=0; 
	for(i=0;i<100;i++) Delay10ms(); 
	GPRS_LED=1;						// 初始化指示灯 
	 
 	EA=1;							// open interrupt control  
	for(i=0;i<1000;i++) Delay10ms();   
 
	// 擦除FLASH 
//	Erase_Chip(); 
 
	  
	// 数据初始化 
//	Download_Init_Data(); 
 
	//GSM初始化,查询网络信号强度   
	GSM_INI();    					  	  
	ES0=1;          				//允许串口0中断 
 
	// delay 
    for(i=0;i<1000;i++) Delay10ms(); 
    for(i=0;i<1000;i++) Delay10ms(); 
    for(i=0;i<1000;i++) Delay10ms(); 
	     
    ATD99();      					//拨号连接GPRS网络  ATD*99***1#  
 
	for(i=0;i<1000;i++) Delay10ms(); 
	WDTCN = 0xa5; 
 
	while(1) 
	{ 
		// 处理WAVECOM传来的数据 
	   	if(PPP_Rec_Complete) 		    
		{ 
        	PPP_Rec_Complete = 0; 
 			DEAL_DATA_WAVECOM(); 
        }	 
 
		// 用于连接网络时,超时进行复位 
		if(Reset_Flag==1)			 
		{ 
		 	Reset_Flag=0; 
			for(i=0;i<1000;i++) Delay10ms(); 
	    	WDTCN = 0xa5; 
	    	for(i=0;i<80;i++) Delay10ms(); 
		} 
 
		// 用于连接网络时,数组4重发 
		if(EXCH_SEND4_Flag == 1)	 
		{ 
		 	EXCH_SEND4_Flag = 0; 
			EXCH_SEND4(); 
		} 
 
		if(GPRS_OK == 1) 
		{ 
			/* 
			if(send_flag == 1) 
			{ 
				send_flag = 0; 
 
				CAIJI_Comm_Len =0; 
				CAIJI_Command_Buf[CAIJI_Comm_Len++] = CAIJI_Send_SeqNr++; 
				CAIJI_Command_Buf[CAIJI_Comm_Len++] = 0x55; 
				CAIJI_Command_Buf[CAIJI_Comm_Len++] = 00; 
				CAIJI_Command_Buf[CAIJI_Comm_Len++] = 01; 
				CAIJI_Command_Buf[CAIJI_Comm_Len++] = 03; 
				 
				SEND_DATA_CAIJI(CAIJI_Comm_Len); 
				 
				// 设置命令重传标识	 
				CAIJI_Resend_Flag = 1;																	 
				CAIJI_Resend_Num = 0; 
				CAIJI_Timer = 1; 
				TMR3CN |= 0x04;		// 开启定时器3 
				 
			} 
*/ 
			i=1; 
 
		} 
 
		//软串口收到数据处理 
		if(Ini_Data_Flag == 1)            
		{  
			Ini_Data_Flag=0; 
			Ini_Data_Deal(); 
		} 
		  
		// 处理采集板传来的数据 
		if(UART1_Rec_Complete == 1)  
		{ 
			UART1_Rec_Complete = 0; 
			DEAL_DATA_CAIJI(); 
		} 
 
		// 处理监控中心传来的数据 
		if(WAVE_Data_Receive == 1) 
		{ 
			WAVE_Data_Receive = 0; 
			WAVE_Rec_Ack(); 
		} 
 
		// 处理取数据命令 
		if(Data_Gather_Comm == 1) 
		{ 
			if(Data_Ready_Flag == 1) 
			{ 
				if(CAIJI_Resend_Flag != 1 && WAVE_Resend_Flag !=1) 
				{ 
					Get_Data_Comm(); 
				} 
			} 
		} 
 
		// 测试帧发送处理 
		if(Send_Test_Frame == 1) 
		{ 
			Send_Test_Frame = 0; 
			if(CAIJI_Resend_Flag != 1 && WAVE_Resend_Flag !=1) 
			{ 
				Test_Frame_Send(); 
			} 
			else 
			{ 
				Test_Frame_Answer = 0; 
			} 
		} 
 
		// 定时发送数据处理 
		if(Timer_Gather_Flag == 1) 
		{ 
			if(CAIJI_Resend_Flag != 1 && WAVE_Resend_Flag !=1) 
			{ 
				Timer_Gather_Flag = 0; 
				Timer_Gather_Deal(); 
			} 
		} 
 
		// 处理向采集板的命令重发 
		if(CAIJI_Timer_End == 1) 
		{ 
			CAIJI_Timer_End = 0; 
			CAIJI_Resend_Deal(); 
		} 
 
		// 处理向监控中心的命令重发 
		if(WAVE_Timer_End == 1) 
		{ 
			WAVE_Timer_End = 0; 
			WAVE_Resend_Deal(); 
		} 
 
 
		 
		if(GPRS_OK==1)				// 测试WAVECOM数据发送报文 
		{ 
		 	if(send_flag==1) 
			{ 
				send_flag=0; 
				for(j=0;j<3;j++) 
				{ 
		 		for(i=0;i<100;i++) Delay10ms(); 
				Inf_Buffer[0]=0x41; 
				Inf_Buffer[1]=0x42; 
				Inf_Buffer[2]=0x43; 
				Inf_Buffer[3]=0x44; 
				Inf_Buffer[4]=0x45; 
				Inf_Buffer[5]=0x46; 
 				SEND_DATA_WAVECOM(6); 
				} 
			} 
		}		 		 	 
  } 
} 
//------------------------------------------------------------------------- 
//-------------------------------------------------------------------------- 
// 初始化程序模块 
 
void Baudrate_Init(void) 
{ 
     T2CON  = 0x30;      	//Set Timer2 as Baudrate Generator of UART0 
     RCAP2H = 0xff;     	//Set Reload High Byte 
     RCAP2L = 0xc4;     	//Set Reload Low Byte 
     SCON0  = 0x50;      	//Set UART0 Mode 1 (1 Start Bit ,8 Data Bit ,1 Stop Bit) and Enable Receive  
     
     T4CON  = 0x30;       	//Use SysClk 
     RCAP4H = 0xff;			//Set Timer1 Mode 2 (Auto Reload Byte) 
     RCAP4L = 0xc4;			//Set Reload High Byte   
     SCON1  = 0x50;      	//Set UART1 Mode 1 (1 Start Bit ,8 Data Bit ,1 Stop Bit) and Enable Receive  
                  
     TMR3CN = 0x00;        //Timer3 use sysclk/12  
     TMR3H  = 0x3c;        //set Timer3 High Byte 
     TMR3L  = 0x00;        //set Timer3 Low  Byte 
     TMR3RLH= 0x3c;        //set Timer3 Reload High Byte  
     TMR3RLL= 0x00;        // set Timer3 Reload Low Byte    Timer3 : 10ms is distance  
       
     EIE2 &= 0xfb;        	//Disable Timer4 Interrupt 
     ET2 = 0;            	//Disable Timer2 Interrupt    
     EIE2 |= 0x01;        	//允许定时器3中断  
     T4CON |= 0x04;         //Start Timer4 
     TR2 = 1;            	//Start  Timer2 
     TMR3CN &=0xFB;         //Stop   Timer3   
}   
 
//-------------------------------------------------------------------------------------------------------------------------- 
//-------------------------------------------------------------------------------------------------------------------------- 
 
//软串口初始化子程序 
 
void SW_UART_INIT(void) 
{ 
	 
	PCA0CPM0 = 0x10;									// Module 0 in negative capture mode; module 
															// 0 interrupt disabled. 
 	PCA0CPM1 = 0x01;									// Module 1 in software timer mode; module 
															// 1 interrupt disabled.	 
 
	PCA0CN = 0;											// Leave PCA disabled 
	PCA0MD = 0x02;										// PCA timebase = SYSCLK/4; PCA counter 
															// interrupt disabled. 
	CCF0 = 0;											// Clear pending PCA module 0 and 
	CCF1 = 0;											// module 1 capture/compare interrupts. 
	SRI = 0;											// Clear Receive complete flag. 
	STI = 0;											// Clear Transmit complete flag.     
	SW_TX = 1;											// TX line initially high.	 
	STXBSY = 0;											// Clear SW_UART Busy flag 
 
} 
 
//------------------------------------------------------------------------------------------ 
//------------------------------------------------------------------------------------------ 
 
// SW_UART_ENABLE: SW_UART Enable Routine 
 
void SW_UART_ENABLE(void) 
{ 
	 
	PCA0CPM0 |= 0x01;									// Enable module 0 (receive) interrupts. 
	PCA0CPM1 |= 0x01;									// Enable module 1 (transmit) interrupts. 
 
	CR = 1;												// Start PCA counter.  
	EIE1 |= 0x08;										// Enable PCA interrupts 
} 
//延时子程序 
 
 
void Delay10ms() 
{ 
   UINT i; 
   for(i=0;i<10000;i++); 
}  
 
// -------------------------------------------------------------------------------- 
// 上电初始化程序 
void Download_Init_Data(void) 
{ 
	unsigned char i; 
 
	// 初始化备份索引号 
	CS_RTC = 0; 
	if((Record_Ind<2) || (Record_Ind>4)) 
	{ 
		Record_Ind = 2; 
	} 
	Backup_Index = Record_Ind; 
 
	// 初始化信宿IP地址和端口号 
	CS_RTC = 1; 
	if(XBYTE[StartAddress] == 0xAA)							 
	{ 
		// FLASH数据已初始化过 
		for(i=0;i<4;i++) 
		{ 
			IP_Head[16+i] = XBYTE[StartAddress+Monitor_IP_Add+i];		// 装入IP地址 
		} 
		for(i=0;i<2;i++) 
		{ 
			UDP_Head[2+i] = XBYTE[StartAddress+Monitor_PORT_Add+i];		// 装入端口号 
		} 
		Init_Flag = 1;													// 设定初始化标识 
	} 
} 
 
 
//--------------------------------------------------------------------------------------------------------------------------- 
//--------------------------------------------------------------------------------------------------------------------------- 
 
//测试模块是否正常子程序 
 
void AT() 
{ 
        UCHAR i; 
        UCHAR AT_Command[3]="AT\r"; 
 
        for(i=0;i<3;i++) 
        { 
    	   SBUF0=AT_Command[i]; 
    	   while(TI0==0); TI0 =0; 
        } 
     
} 
 
//------------------------------------------------------------------------------------------------------------------------- 
//-------------------------------------------------------------------------------------------------------------------------- 
 
//拨号连接GPRS网络子程序 
 
void ATD99() 
{ 
	unsigned char i; 
    for(i=0;i<12;i++)                 /* ATD*99***1# */ 
   	{ 
   	  SBUF0 = GSMCommand2[i]; 
   	  while(TI0==0); TI0=0; 
	} 
         
} 
 
//--------------------------------------------------------------------------------------------------------------------------  
//--------------------------------------------------------------------------------------------------------------------------  
 
// 查询GSM网络信号强度子程序   
    
void GSM_INI( void) 
{ 
    unsigned char i; 
	bit Signal_OK=0; 
 
    RI0=0; 
    AT(); 
    for(i=0;i<80;i++) Delay10ms(); 
    AT(); 
    for(i=0;i<80;i++) Delay10ms(); 
    TMR3CN |= 0x04;  
    while(!Signal_OK)                                   /* AT+CSQ */ 
    { 
    	for(i=0;i<7;i++) 
    	{ 
      	  SBUF0 = GSMCommand1[i]; 
		  while(TI0==0); TI0 = 0; 
      	  while(RI0==0); 
		  rec[i] = SBUF0; 
      	  RI0 = 0; 
    	} 
 
    	for(i=7;i<15;i++)                               /* Error state */ 
    	{ 
      	  while(RI0==0); 
		  rec[i] = SBUF0; 
      	  RI0 = 0; 
	       
		} 
	    if(rec[8] != 'R' && rec[9] != 'R' && rec[10] != 'R' && rec[11] != 'R') 
	    { 
          for(i=15;i<25;i++) 
          {   
	        while(RI0==0); 
			rec[i] = SBUF0; 
      	    RI0 = 0; 
      	  } 
       	} 
        for(i=8;i<25;i++){ 
			if(rec[i] == ':' && rec[i+2] != '9')  
			{ 
				Signal_OK = 1; 
				break; 
			} 
		                    
		}		 
    } 
 	TMR3CN &=0xFB;  
 	Timer3_Flag=1; 
 	counter_timer3=0; 
 	Timer3_Counter=0; 
} 
 
//-------------------------------------------------------------------- 
//  
// RTC初始化代码 
void RTC_Init(void) 
{ 
	CS_RTC = 0;				// 使能时钟芯片 
	RegB = 0x02;			// 设置时间格式为BCD码格式,24小时制式 
//	RegA = 0x20;			// 开启RTC计时 软串口数据初始化后在开启 
	RegB |=0x80; 
	Hour_Alarm = 0xFF;   
	Minute_Alarm = 0xFF; 
	Second_Alarm = 0x00;  
	RegB &= 0x7F; 
	CS_RTC = 1; 
} 
 
// RTC时间更新代码 
void RTC_Time_Update(unsigned char xdata *source) 
{ 
	unsigned char i; 
	 
	CS_RTC=0;				// open RTC 
	RegB |= 0x80; 
	for(i=0;i<10;i++) 
	{ 
		XBYTE[IniDataAddress+i] = *(source+i); 
	} 
	Second_Alarm = 0x00; 
	Minute_Alarm = 0xFF; 
	Hour_Alarm = 0xFF; 
	RegB &= 0x7F; 
	CS_RTC = 1; 
} 
 
 
// ----------------------------------------------------------------------- 
// 中断使能处理 
void Interrupt_Enable(void) 
{ 
 
	// 网络连接成功后,打开其余的中断 
 
	EIE2 |=0x40;			// 允许串口1中断 
	 
 
	if(Init_Flag == 1) 
	{ 
		EX0 = 1;				// 允许外部1中断 
 
		CS_RTC = 0;				// 允许时间芯片中断		 
		RegB |=0x20; 
		CS_RTC = 1; 
	} 
 
	SW_UART_ENABLE();		// 软串口中断设置 
	SREN = 1;				// 允许软串口接收 
	SES = 1; 
} 
//------------------------------------------------------------------------ 
 
// 软串口初始化数据处理 
void Ini_Data_Deal() 
{ 
	unsigned char i; 
 
	// 数据存入FLASH 
	CS_RTC = 1; 
	Erase_Sector(StartAddress); 
 
	for(i=0;i<16;i++) 
	{ 
		Write_Byte(StartAddress+1+i,Ini_Data_Buffer[i]); 
	} 
	Write_Byte(StartAddress,0xAA);					// 设置FLASH设置标识位 
	 
	// 初始化时间芯片 
	CS_RTC = 0; 
	RegB = 0x06;								// 设置时间格式为二进制格式,24小时制式 
 
	RegB |= 0x80; 
 
	Second = Ini_Data_Buffer[16];  
	Minute = Ini_Data_Buffer[17];  
	Hour   = Ini_Data_Buffer[18];  
	Week   = Ini_Data_Buffer[19];	       	       
	Day    = Ini_Data_Buffer[20];        
	Month  = Ini_Data_Buffer[21];   
	Year   = Ini_Data_Buffer[22]; 
				 
	Hour_Alarm = 0xFF;   
	Minute_Alarm = 0xFF; 
	Second_Alarm = 0x00;  
 
	RegB &=0x7F; 
//	RegA = 0x20;		// 开启时间芯片 
	CS_RTC = 1; 
	 
	// 开中断 
	EX0 = 1;				// 允许外部1中断 
	CS_RTC = 0;				// 允许时间芯片中断		 
	RegB |=0x20; 
	RegA = 0x20;			// 开启时间芯片 
	CS_RTC = 1; 
 
	// 初始化IP地址 
	for(i=0;i<4;i++) 
	{ 
		IP_Head[16+i] = XBYTE[StartAddress+Monitor_IP_Add+i];		// 装入IP地址 
	} 
	for(i=0;i<2;i++) 
	{ 
		UDP_Head[2+i] = XBYTE[StartAddress+Monitor_PORT_Add+i];		// 装入端口号 
	} 
	// 设置起始标识 
	Init_Flag = 1; 
 
	// 定时间隔计数器清0 
	Timer_Num = 0; 
 
	// 向采集板发初始化数据 
	CAIJI_Comm_Len = 0; 
	CAIJI_Command_Buf[CAIJI_Comm_Len++] = CAIJI_Send_SeqNr++; 
	CAIJI_Command_Buf[CAIJI_Comm_Len++] = 0x55; 
	CAIJI_Command_Buf[CAIJI_Comm_Len++] = 0x07; 
	CAIJI_Command_Buf[CAIJI_Comm_Len++] = 0x05; 
	CS_RTC = 1; 
 
	for(i=0;i<5;i++) 
	{ 
		CAIJI_Command_Buf[CAIJI_Comm_Len++] = XBYTE[StartAddress+Machine_Cycle+i]; 
	} 
	SEND_DATA_CAIJI(CAIJI_Comm_Len); 
/* 
	// 向监控中心发链路命令 
	WAVE_Comm_Len = 0; 
	WAVE_Command_Buf[WAVE_Comm_Len++] = WAVE_Send_SeqNr++;		// 命令序列号 
	WAVE_Command_Buf[WAVE_Comm_Len++] = 0x00;					// 命令标识 
	WAVE_Command_Buf[WAVE_Comm_Len++] = 0x00;					// command[0] 
	WAVE_Command_Buf[WAVE_Comm_Len++] = 0x03;					// command[1] 
	WAVE_Command_Buf[WAVE_Comm_Len++] = 0x02;					// 数据长度 
 
	CS_RTC = 1; 
	for(i=0;i<2;i++) 
	{ 
		WAVE_Command_Buf[WAVE_Comm_Len++] = XBYTE[StartAddress+Machine_Num+i]; 
	} 
	SEND_DATA_WAVECOM(WAVE_Comm_Len);							// 向监控中心发送数据 
 
	// 设置命令重传标识 
	WAVE_Resend_Flag = 1; 
	WAVE_Resend_Num = 0; 
	WAVE_Timer = 10; 
	*/ 
 
	CAIJI_Resend_Flag = 1; 
	CAIJI_Resend_Num = 0; 
	CAIJI_Timer = 1; 
	TMR3CN |= 0x04;		// 开启定时器3 
 
	// 回送软串口数据 
	STI=1; 
	EIE2 |= 0x20;			// Start SW_TX by enabling 
	PRT1IF |= 0x80; 
} 
//------------------------------------------------------------------------ 
//处理 WAVECOME 传来数据子程序 
  
void DEAL_DATA_WAVECOM(void) 
{ 
	UINT i; 
 
	RECEIVEBUFFERPOINT=RECEIVEBUFFER; 
	if((*RECEIVEBUFFERPOINT==0xFF)&&(*(RECEIVEBUFFERPOINT+2)==0xC0)&&(*(RECEIVEBUFFERPOINT+3)==0x21)&&(*(RECEIVEBUFFERPOINT+4)==0x01) && (PPP_First_Receive==0)) 
	{    
		WDTCN = 0xDE;			// disable watchdog timer 
    	WDTCN = 0xAD; 
		 
		EXCH_SEND1(); 
 
		PPP_First_Receive = 1; 
	} 
	else if((*RECEIVEBUFFERPOINT==0xFF)&&(*(RECEIVEBUFFERPOINT+2)==0xC0)&&(*(RECEIVEBUFFERPOINT+3)==0x21)&&(*(RECEIVEBUFFERPOINT+4)==0x1)) 
	{ 
		PPP_First_Receive = 0;		 
		EXCH_SEND2(); 
		EXCH_SEND3(); 
		TMR3CN |= 0x04;        //启动定时器3,每隔1S发送EXCH_SEND4(),直至收到回应 
	}  
	else if((*RECEIVEBUFFERPOINT==0xC0)&&(*(RECEIVEBUFFERPOINT+1)==0x23)&&(*(RECEIVEBUFFERPOINT+2)==0x02)) 
	{ 
		TMR3CN &=0xFB;         //关闭定时器3,停止发送EXCH_SEND4() 
	    counter_timer3=0; 
		EXCH_SEND5(); 
	} 
	else if((*RECEIVEBUFFERPOINT==0x80)&&(*(RECEIVEBUFFERPOINT+1)==0x21)&&(*(RECEIVEBUFFERPOINT+2)==0x01)) 
	{ 
		for(i=8;i=12;i++) EXCHANGE6[i+1] = *(RECEIVEBUFFERPOINT+i); 
		EXCH_SEND6();          //读取网关地址 
	} 
	else if((*RECEIVEBUFFERPOINT==0x80)&&(*(RECEIVEBUFFERPOINT+1)==0x21)&&(*(RECEIVEBUFFERPOINT+2)==0x03)) 
	{ 
		for(i=8;i<12;i++) { 
			EXCHANGE7[i+1] = *(RECEIVEBUFFERPOINT+i);       //读取并更新IP地址 
			IP_Head[i+4] = *(RECEIVEBUFFERPOINT+i); 
		} 
		EXCH_SEND7();           
		GPRS_OK = 1; 
		Net_Ok_Flag=1; 
 
		// 中断使能处理 
		Interrupt_Enable(); 
 
		// 发送链路连接命令 
		Link_Send_Comm(); 
	     
//        EIE2 |=0x40;			//允许串口1中断 
	} 
	else if((*RECEIVEBUFFERPOINT==0xFF)&&(*(RECEIVEBUFFERPOINT+2)==0xC0)&&(*(RECEIVEBUFFERPOINT+3)==0x21)&&(*(RECEIVEBUFFERPOINT+4)==0x5)) 
    {     		     
	    Reset_Flag=1;		 
	}											              
	else if((*RECEIVEBUFFERPOINT==0x21)&&(*(RECEIVEBUFFERPOINT+1)==0x45)&&(*(RECEIVEBUFFERPOINT+10)==0x11)) 
	{ 
        if((*(RECEIVEBUFFERPOINT+13)==IP_Head[12])&&(*(RECEIVEBUFFERPOINT+14)==IP_Head[13])&&(*(RECEIVEBUFFERPOINT+15)==IP_Head[14])&&(*(RECEIVEBUFFERPOINT+16)==IP_Head[15])) 
        { 
			WAVE_Data_Receive = 1; 
//			 WAVE_Rec_Ack();	//注意中心的IP地址			      
		}						     
		 
    }	 
} 
 
 
//---------------------------------------------------------------------------------------------------------------------------------  
//--------------------------------------------------------------------------------------------------------------------------------- 
 
//PPP的FCS校验子程序 
 
UINT pppfcs16(UINT fcs,unsigned char *cp,int len) 
{ 
	while (len--) 
        fcs = (fcs >> 8) ^ fcstab[(fcs ^ *cp++) & 0xff]; 
 
    return (fcs); 
} 
 
//---------------------------------------------------------------------------------------------------------------------------------- 
//----------------------------------------------------------------------------------------------------------------------------------- 
 
//PPP的FCS校验子程序 
 
void Fcs16(unsigned char *cp,int len) 
{ 
    UINT trialfcs; 
    cp++; 
    trialfcs = pppfcs16( PPPINITFCS16, cp, len-4 ); 
    trialfcs ^= 0xffff;               // complement 
    cp[len-4] = (trialfcs & 0x00ff);    // least significant byte first 
    cp[len-3] = ((trialfcs >> 8) & 0x00ff); 
 
} 
/******************************************************************** 
//				PPP连接时交互语句 
********************************************************************/ 
// 发送PPP连接建立的第1条交互语句子程序 
 
void EXCH_SEND1() 
{ 
        UINT xdata i,len=22;          
	 
		Fcs16(EXCHANGE1,len); 
 
        for(i=0;i<len;i++) 
        { 
          TI0 = 0; 
          SBUF0 = EXCHANGE1[i]; 
          while(TI0==0); TI0 = 0; 
        } 
	 
} 
 
//----------------------------------------------------------------------------------------------------------- 
// 发送PPP连接建立的第2条交互语句子程序 
 
void EXCH_SEND2() 
{ 
        UINT xdata i,len=30;          
	 
		Fcs16(EXCHANGE2,len); 
 
        for(i=0;i<len;i++) 
        { 
          TI0 = 0; 
          SBUF0 = EXCHANGE2[i]; 
          while(TI0==0); TI0 = 0; 
        } 
	 
} 
 
//----------------------------------------------------------------------------------------------------------- 
// 发送PPP连接建立的第3条交互语句子程序 
 
void EXCH_SEND3() 
{ 
        UINT xdata i,len=21;          
	 
		Fcs16(EXCHANGE3,len); 
 
        for(i=0;i<len;i++) 
        { 
          TI0 = 0; 
          SBUF0 = EXCHANGE3[i]; 
          while(TI0==0); TI0 = 0; 
        } 
	 
} 
 
//----------------------------------------------------------------------------------------------------------- 
// 发送PPP连接建立的第4条交互语句子程序 
 
void EXCH_SEND4() 
{ 
        UINT xdata i,len=21;          
	 
		Fcs16(EXCHANGE4,len); 
 
        for(i=0;i<len;i++) 
        { 
          TI0 = 0; 
          SBUF0 = EXCHANGE4[i]; 
          while(TI0==0); TI0 = 0; 
        } 
	 
} 
 
//----------------------------------------------------------------------------------------------------------- 
// 发送PPP连接建立的第5条交互语句子程序 
 
void EXCH_SEND5() 
{ 
        UINT xdata i,len=16;          
	 
		Fcs16(EXCHANGE5,len); 
 
        for(i=0;i<len;i++) 
        { 
          TI0 = 0; 
          SBUF0 = EXCHANGE5[i]; 
          while(TI0==0); TI0 = 0; 
        } 
	 
} 
 
//----------------------------------------------------------------------------------------------------------- 
// 发送PPP连接建立的第6条交互语句子程序 
 
void EXCH_SEND6() 
{ 
        UINT xdata i,len=16;          
	 
		Fcs16(EXCHANGE6,len); 
 
        for(i=0;i<len;i++) 
        { 
          TI0 = 0; 
          SBUF0 = EXCHANGE6[i]; 
          while(TI0==0); TI0 = 0; 
        } 
	 
} 
 
//----------------------------------------------------------------------------------------------------------- 
// 发送PPP连接建立的第7条交互语句子程序 
 
void EXCH_SEND7() 
{ 
        UINT xdata i,len=16;          
	 
		Fcs16(EXCHANGE7,len); 
		 
        for(i=0;i<len;i++) 
        { 
          TI0 = 0; 
          SBUF0 = EXCHANGE7[i]; 
          while(TI0==0); TI0 = 0; 
        } 
	 
} 
//-------------------------------------------------------------------- 
//				Interrupt Programe 
//-------------------------------------------------------------------- 
// Timer3 interrupt programe 
 
void Timer3_Interrupt(void)  interrupt 14 
{  
	unsigned char i; 
 
	TMR3CN &=0x7f;							// Clear TF3 
	 
	if(Timer3_Counter<300){					//Wait 1s 	 
		Timer3_Counter++; 
	} 
 
	else{ 
		Timer3_Counter = 0; 
		counter_timer3++; 
		if(Net_Ok_Flag==1){ 
			if(CAIJI_Timer != 0)		// 采集板重发数据定时处理 
			{ 
				CAIJI_Timer--; 
				if(CAIJI_Timer == 0) 
				{ 
					CAIJI_Timer_End = 1; 
				} 
			} 
 
			if(WAVE_Timer != 0)			// 监控中心重发数据定时处理 
			{ 
				WAVE_Timer--; 
				if(WAVE_Timer == 0) 
				{ 
					WAVE_Timer_End = 1; 
				} 
			} 
		} 
 
		else{     
			if(Timer3_Flag==1){ 
				if(counter_timer3>20){ 	      		 
	     			counter_timer3=0; 
	     			TMR3CN &=0xFB;			//Closing Timer3 
		 			Reset_Flag=1;			//Setting reset Flag 
				} 
					 
				else{ 
					//EXCH_SEND4();				 
					EXCH_SEND4_Flag=1; 
				} 
			} 
			else{ 
				if(counter_timer3>10){    	//sending AT+CSQ more than 10 ,reset 		     
	    	 		WDTCN = 0xa5; 
		     		for(i=0;i<100;i++)Delay10ms(); 
				} 
			} 
		} 
	} 
} 
 
//----------------------------------------------------------------------------- 
// PCA 中断服务子程序 
void	PCA_ISR(void) interrupt 9  
{ 
	static char 	SUTXST = 0;						// SW_UART TX state variable 
	static char 	SURXST = 0;						// SW_UART RX state variable 
	static unsigned char 	RXSHIFT;				// SW_UART RX Shift Register 
	 
	unsigned int	PCA_TEMP;						// Temporary storage variable for 
													// manipulating PCA module high & low bytes.	 
 
	// Check receive interrupt flag first; service if CCF0 is set. 
	if (CCF0){ 
		CCF0 = 0;										// Clear interrupt flag. 
		switch (SURXST){ 
			 
			// State 0: START bit received. 
			// In this state, a negative edge on SW_TX has caused the interrupt, 
			// meaning a START has been detected and the PCA0CP0 registers have  
			// captured the value of PCA0. 
			// - Check for receive enable and good START bit 
			// - Switch PCA module 0 to software timer mode 
			// - Add 3/2 bit time to module 0 capture registers to sample LSB. 
			// - Increment RX state variable. 
			case 0: 
				if (SREN & ~SW_RX){					// Check for receive enable and a good 
															// START bit.   
																 
					PCA_TEMP = (PCA0CPH0 < 8);	// Read module 0 contents into 
					PCA_TEMP |= PCA0CPL0;			// PCA_TEMP. 
 
					PCA_TEMP += TH_TIME_COUNT;		// Add 3/2 bit times to PCA_TEMP 
 
					PCA0CPL0 = PCA_TEMP;				// Restore PCA0CPL0 and PCA0CPH0 
					PCA0CPH0 = (PCA_TEMP >> 8);	// with the updated value 
 
					PCA0CPM0 = 0x49;					// Change module 0 to software 
															// timer mode, interrupts enabled. 
 
					SURXST++;							// Update RX state variable. 
				} 
				break; 
			 
			// States 1-8: Bit Received 
			// - Sample SW_RX pin 
			// - Shift new bit into RXSHIFT 
			// - Add 1 bit time to module 0 capture registers 
			// - Increment RX state variable 
			case 1: 
			case 2: 
			case 3: 
			case 4: 
			case 5: 
			case 6: 
			case 7: 
			case 8: 
					 
				RXSHIFT = RXSHIFT >> 1;				// Shift right 1 bit 
				if (SW_RX)								// If SW_RX=1,  
					RXSHIFT |= 0x80;					// shift '1' into RXSHIFT msb 
				 
				PCA_TEMP = (PCA0CPH0 < 8);		// Read module 0 contents into 
				PCA_TEMP |= PCA0CPL0;				// PCA_TEMP. 
 
				PCA_TEMP += TIME_COUNT;				// Add 1 bit time to PCA_TEMP 
 
				PCA0CPL0 = PCA_TEMP;					// Restore PCA0CPL0 and PCA0CPH0 
				PCA0CPH0 = (PCA_TEMP >> 8);		// with the updated value 
				 
				SURXST++;								// Update RX state variable. 
				break; 
 
			// State 9: 8-bits received, Capture STOP bit. 
			// - Move RXSHIFT into RDR. 
			// - Set SRI (indicate receive complete). 
			// - Prepare module 0 for next transfer. 
			// - Reset RX state variable. 
			// - Trigger IE7 if user-level interrupt support is enabled. 
			case 9: 
 
				RDR = RXSHIFT;							// Move received data to receive register. 
				SRI = 1;									// Set receive complete indicator. 
 
				PCA0CPM0 = 0x11;						// Switch module 0 to negative capture 
															// mode; interrupt enabled for START 
															// detection. 
 
				SURXST = 0;								// Reset RX state variable. 
 
				if (SES){								// If user-level interrupt support enabled 
					EIE2 |= 0x20;						// Enable IE7. 
					PRT1IF |= 0x80;					// Trigger IE7. 
				} 
				break; 
				 
			} 
		} 
		 
		// Check Transmit interrupt; service if CCF1 is set. 
		else if (CCF1){  
			CCF1 = 0;									// Clear interrupt flag 
			switch (SUTXST){ 
				 
				// State 0: Transmit Initiated. 
				// Here, the user has loaded a byte to transmit into TDR, and set the 
				// module 1 interrupt to initiate the transfer. 
				// - Transmit START bit (drop SW_TX) 
				// - Read PCA0, add one bit time, & store in module 1 capture registers 
				//   for first bit. 
				// - Increment TX state variable. 
				case 0: 
 
					SW_TX = 0;							// Drop TX pin as START bit. 
					 
					PCA_TEMP = PCA0L;					// Read PCA counter value into 
					PCA_TEMP |= (PCA0H < 8);		// PCA_TEMP. 
 
					PCA_TEMP += TIME_COUNT;			// Add 1 bit time. 
 
					PCA0CPL1 = PCA_TEMP;				// Store updated match value into 
					PCA0CPH1 = (PCA_TEMP >> 8);	// module1 capture/compare registers. 
 
					PCA0CPM1 |= 0x48;					// Enable module 1 software timer. 
 
					SUTXST++;							// Update TX state variable.				 
					break; 
 
				// States 1-9: Transmit Bit. 
				// - Output LSB of TDR onto TX 
				// - Shift TDR 1 bit right. 
				// - Shift a '1' into MSB of TDR for STOP bit in State 9. 
				// - Add 1 bit time to module 1 capture register 
				case 1: 
				case 2: 
				case 3: 
				case 4: 
				case 5: 
				case 6: 
				case 7: 
				case 8: 
				case 9: 
					 
					SW_TX = (TDR & 0x01);			// Output LSB of TDR onto SW_TX pin. 
					TDR >>= 1;							// Shift TDR right 1 bit. 
					TDR |= 0x80;						// Shift '1' into MSB of TDR for 
															// STOP bit in State 9. 
 
					PCA_TEMP = (PCA0CPH1 < 8);	// Read module 0 contents into 
					PCA_TEMP |= PCA0CPL1;			// PCA_TEMP. 
 
					PCA_TEMP += TIME_COUNT;			// Add 1 bit time to PCA_TEMP 
	 
					PCA0CPL1 = PCA_TEMP;				// Restore PCA0CPL1 and PCA0CPH1 
					PCA0CPH1 = (PCA_TEMP >> 8);	// with the updated value	 
 
					SUTXST++;                     // Update TX state variable. 
					break; 
					 
				// State 10: Last bit has been transmitted.  Transmit STOP bit 
				// and end transfer.   
				// - Transmit STOP bit 
				// - Set TX Complete indicator, clear Busy flag 
				// - Reset TX state 
				// - Prepare module 1 for next transfer. 
				// - Trigger IE7 interrupt if user-level interrupts enabled. 
				case 10: 
 
					STI = 1;								// Indicate TX complete. 
					SUTXST = 0;							// Reset TX state. 
					SW_TX = 1;							// SW_TX should remain high. 
 
					PCA0CPM1 = 0x01;					// Disable module 1 software timer; leave 
															// interrupt enabled for next transmit.					 
					 
					if (SES){							// If user-level interrupt support enabled: 
						EIE2 |= 0x20;					// Enable IE7. 
						PRT1IF |= 0x80;				// Trigger IE7. 
					} 
					STXBSY = 0;							// SW_UART TX free.	 
					break; 
				} 
		} 
} 
 
//---------------------------------------------------------------------------------------- 
// USER_ISR: User SW_UART Interrupt Service Routine (IE7 ISR) 
// If interrupt-mode test code is enabled, this ISR 
// transmits 15 characters and receives 15 characters. This routine is triggered each 
// time a SW_UART transmit or receive is completed. 
// - Checks receive complete indicator, and services. 
// - Checks transmit complete indicator, and services. 
// - Checks for transmits or receives that completed during the ISR; if so, triggers the 
//   interrupt again. 
 
// 软串口中断服务程序(外部中断7服务程序) 
void USER_ISR(void) interrupt 19		// IE7 Interrupt Service Routine 
{				 
    unsigned char  Rec_Data; 
 
	PRT1IF &= ~(0x80);					// Clear IE7 interrupt flag 
	if (SRI)							// If Receive Complete: 
	{							 
		SRI = 0;						// Clear receive flag.	   
	    Rec_Data=RDR; 
		if (Receive_Ini_Flag==0) 
    	{    
			if(Rec_Data==0xa5)  
			{ 
		    	Receive_Ini_Flag=1;		//Has received the first byte  
			} 
	   	} 
	 	else if ( Receive_Ini_Flag==1) 	    
	    {  
	     	if(Rec_Data==0xa5) 	  	    
		    {  
		     	Receive_Ini_Flag=2;  
	         	Ini_Data_BufferPoint=Ini_Data_Buffer;			 			  
			 	Ini_Data_Num_Reci=0; 
            }                     		  
		 	else 
			{ 
		   		Receive_Ini_Flag=0; 
			}	   	    
	    }	    
	 	else if  ( Receive_Ini_Flag==2) 
	   	{   
	       	*(Ini_Data_BufferPoint+Ini_Data_Num_Reci)=Rec_Data; 
	        Ini_Data_Num_Reci++; 
            if( Ini_Data_Num_Reci==23) 
			{   
			  	  Receive_Ini_Flag=0; 
	              Ini_Data_Num_Reci=0; 
				  //待处理程序				  
				  Ini_Data_Flag=1;				   			 			    
			}            				                        			     		      
		} 
       else  
	   { 
		   Receive_Ini_Flag=0;	          
	   } 
	}				 
	else if (STI) 
	{													// If Transmit Complete: 
		STI = 0;										// Clear transmit flag. 
		if (Ini_Data_Num_Send<23)						// If less than 15 characters transmitted: 
		{                           
			STXBSY = 1;									// Claim SW_UART Transmitter. 
			TDR = *(Ini_Data_BufferPoint+Ini_Data_Num_Send); 
			Ini_Data_Num_Send++;						// Increment variable, transmit. 
			CCF1 = 1;									// Force module 0 interrupt to initiate TX 
		}										          
		else  
		{ 
			Ini_Data_Num_Send=0; 
		}	 
		Ini_Data_Flag=0;		 
	} 
} 
 
//-------------------------------------------------------------- 
//WAVECOM 数据接收子程序:串口0中断服务程序 
  
void  Serial0_WAVECOM(void)   interrupt 4 
 
{    
    EA=0; 
	if (RI0)	 
	{	  
		RI0=0; 
		if(RECEIVE_FLAG==0) 
		{ 
			if(SBUF0==0x7E) 
			{ 
				RECEIVE_FLAG=1; 
				RECEIVEBUFFERPOINT=RECEIVEBUFFER; 
				WAVE_Receive_Num = 0; 
			} 
        } 
		else 
		{ 
			if(SBUF0==0x7E) 
			{  
			  if(RECEIVEBUFFERPOINT!=RECEIVEBUFFER)     //排除连续收到两个7E,数据长度为0的错误情况 
				 { 
				  RECEIVE_FLAG=0; 
				  PPP_Rec_Complete = 1; 
                 } 
			} 
			else 
			{ 
				if(PADDING_Flag==1) 
	  			{ 
	  				*RECEIVEBUFFERPOINT=SBUF0; 
	  	        	*RECEIVEBUFFERPOINT^=0x20; 
	  	        	PADDING_Flag=0; 
	  	        	RECEIVEBUFFERPOINT++; 
					WAVE_Receive_Num++; 
	    		} 
	    		else 
	    		{ 
	    			if(SBUF0==0x7D) 
	    				PADDING_Flag=1; 
	    			else 
	    			{ 
	    				*RECEIVEBUFFERPOINT=SBUF0; 
	  	           		RECEIVEBUFFERPOINT++; 
						WAVE_Receive_Num++; 
	  	        	} 
	  	        } 
			} 
		} 
   	} 
 
    EA=1; 
} 
//------------------------------------------------------------- 
//------------------------------------------------------------- 
 
// 采集板数据接收子程序:串口1中断服务程序 
 
// Head_Flag=0x0E	End_Flag=0x05  0x0A means 0x7D  
// when x<0x10  ,x= 0x7D x^0x10 
	 
void  Serial1_CaiJi(void)  interrupt 20 
{		 
	if((SCON1 & 0x01)!=0x00){  
 
		SCON1 &= 0xFE; 					// 清串口1标字位					 
		if(SBUF1==0x0E){				// 接收帧头 
 
			Receive_Flag_UART1=1; 
			CAIJI_Receive_Len = 0; 
		}			 
		else{ 
 
			if(Receive_Flag_UART1==1){ 
							 
				if(SBUF1==0x05){ 
					Receive_Flag_UART1=0; 
					Padding_Flag_UART1=0; 
				 	UART1_Rec_Complete=1; 
				} 
				else if(Padding_Flag_UART1==1){ 
					Padding_Flag_UART1=0; 
					Receive_Buf_UAR1[CAIJI_Receive_Len] = SBUF1; 
	  	        	Receive_Buf_UAR1[CAIJI_Receive_Len] ^= 0x7D; 
	  	        	CAIJI_Receive_Len++; 
				} 
				else if(SBUF1==0x7D){ 
					Padding_Flag_UART1=1; 
				} 
				else if(SBUF1==0x0A){ 
					Receive_Buf_UAR1[CAIJI_Receive_Len] = 0x7D; 
					CAIJI_Receive_Len++; 
				} 
				else{ 
					Receive_Buf_UAR1[CAIJI_Receive_Len] = SBUF1; 
					CAIJI_Receive_Len++; 
				}							 
			} 
		} 
	}						 
}				 
 
 
// 定时发送测试帧子程序 :外部中断0 
void TestNetwork(void) interrupt 0  
{ 
   	unsigned char xdata temp1; 
	unsigned char xdata temp2; 
	 
	Timer_Num++; 
 
	// 测试间隔到否 
	CS_RTC = 1; 
	if(Timer_Num == XBYTE[StartAddress + Time_Interval]) 
	{ 
		if(Test_Frame_Answer == 1) 
		{ 
			WDTCN = 0xa5; // 重启 
		} 
 
		else  
		{ 
			Send_Test_Frame = 1; 
			Test_Frame_Answer = 1; 
			Timer_Num = 0; 
		} 
	} 
	CS_RTC=0;读时钟芯片的寄存器C 
	temp1 = RegC; //,用于中断标志位清0 
	 
	while(RegA & 0x80 != 0x00);	 
	temp1 = Hour; 
	temp2 = Minute; 
	CS_RTC=1;  
 
	//测试定时采集到否 
	if((temp1 == XBYTE[StartAddress+UP_Send_Time]) && (temp2 == XBYTE[StartAddress+UP_Send_Time+1])) 
	{ 
		Timer_Gather_Flag = 1; 
	} 
}   
								 
// ------------------------------------------------------------------- 
// 外部FLASH处理程序代码		 
 
//擦除FLASH子程序 
 
void Erase_Chip(void) 
{ 
	unsigned int i,j; 
 
 
	Address5555=0xAA; 
	Address2AAA=0x55; 
	Address5555=0x80; 
	Address5555=0xAA; 
	Address2AAA=0x55; 
	Address5555=0x10; 
	for(i=0;i<1000;i++) for(j=0;j<1000;j++); 
	 
}	 
 
//擦除FLASH扇区子程序 
 
void Erase_Sector(unsigned int w_address) 
{ 
	unsigned int i,j; 
	Address5555=0xAA; 
	Address2AAA=0x55; 
	Address5555=0x80; 
	Address5555=0xAA; 
	Address2AAA=0x55; 
	XBYTE[w_address]=0x30; 
	for(i=0;i<100;i++) for(j=0;j<1000;j++); 
	 
}	 
 
//写FLASH操作子程序 
 
void Write_Byte(unsigned int w_address, unsigned char w_byte) 
 { 
 	unsigned int i; 
 	CS_RTC=1; 
	Address5555=0xAA; 
	Address2AAA=0x55; 
	Address5555=0xA0; 
	XBYTE[w_address]=w_byte; 
	for(i=0;i<1000;i++);             //for(i=0;i<10000;i++);             减少10倍 
	CS_RTC=0; 
} 
 
// ------------------------------------------------------------------ 
// ------------------------------------------------------------------ 
 
// 应用程序校验代码 
void CHECKSUM_UDP(unsigned int Data_length) 
{ 
	unsigned char  i; 
	long sum; 
	unsigned char xdata Temp_Buffer[350]; 
 
	sum = cksum(IP_Head,20); 
    IP_Head[10] = ((sum >> 8) & 0x00ff); 
    IP_Head[11] = (sum & 0x00ff);             		// least significant byte first 
 
    for(i=0;i<8;i++) Temp_Buffer[i] = IP_Head[i+12]; 
 
    Temp_Buffer[8] = 0x0; 
    Temp_Buffer[9] = IP_Head[9]; 
    Temp_Buffer[10] = UDP_Head[4]; 
    Temp_Buffer[11] = UDP_Head[5]; 
 
    for(i=0;i<8;i++) Temp_Buffer[i+12] = UDP_Head[i]; 
	for(i=0;i<Data_length;i++)Temp_Buffer[i+20] = WAVE_Command_Buf[i]; 
    sum = cksum(Temp_Buffer,20+Data_length); 
    UDP_Head[6] = ((sum >> 8) & 0x00ff); 
    UDP_Head[7] = (sum & 0x00ff);             // least significant byte first 
 
} 
 
//------------------------------------------------------------------------------------------------------- 
long cksum(unsigned char *ip, int len) 
{ 
 
       register long sum = 0; 
 
        while( len > 1 ) 
        { 
               sum += *((unsigned short *)ip)++; 
               len -= 2; 
       	} 
 
       if( len > 0 ) 
               sum += *(unsigned char *)ip; 
 
       while (sum>>16) 
           sum = (sum & 0xffff) + (sum >> 16); 
 
       return ~sum; 
} 
 
//------------------------------------------------------------------------- 
//------------------------------------------------------------------------- 
 
// 应用程序段 
 
void SEND_DATA_WAVECOM(unsigned int data_len) 
{ 
	unsigned int i; 
	unsigned char xdata Temp_Buffer[400]; 
	unsigned int buffer_len=0; 
 
	/* 
 
	// 网络不同且没经过初始化,不允许发数据 
	if((GPRS_OK !=1) || (Init_Flag != 1)) 
	{ 
		return; 
	} 
 
	// 如为奇数后面补0 
	i = data_len%2; 
	if(i!=0) 
	{ 
		WAVE_Command_Buf[data_len] = 0; 
		data_len++; 
	} 
*/ 
	*( unsigned int xdata *)(IP_Head+2)=28+data_len;	// write total length to IP head  
	IP_Head[10]=IP_Head[11]=0x00;						// clear check_sum buffer in IP_HEAD 
 
	*(unsigned int xdata *)(UDP_Head+4)=8+data_len;		// write UDP length to UDP head 
	UDP_Head[6]=UDP_Head[7]=0x00;						// clear check_sum buffer in UDP_HEAD 
 
	Frame_End[0]=Frame_End[1]=0x00;						// clear FCS buffer  
	CHECKSUM_UDP(data_len); 
 
	for(i=0;i<2;i++)  Temp_Buffer[buffer_len++] = Frame_Head[i]; 
	for(i=0;i<20;i++) Temp_Buffer[buffer_len++] = IP_Head[i]; 
	for(i=0;i<8;i++)  Temp_Buffer[buffer_len++] = UDP_Head[i]; 
	for(i=0;i<data_len;i++)	Temp_Buffer[buffer_len++] = WAVE_Command_Buf[i]; 
	for(i=0;i<3;i++)  Temp_Buffer[buffer_len++] = Frame_End[i]; 
	 
	Fcs16(Temp_Buffer,buffer_len);						// create FSC and write to buffer 
	 
	for(i=0;i<11;i++)									// send data to UART0 
	{ 
		TI0 = 0; 
       	SBUF0 = Temp_Buffer[i]; 
       	while(TI0==0); TI0 = 0; 
	} 
	 
	SBUF0 = 0x7D; 
	while(TI0==0);TI0=0; 
	SBUF0 = 0x31; 
	while(TI0==0);TI0=0; 
	for(i=12;i<buffer_len-1;i++) 
	{ 
		if(Temp_Buffer[i] == 0x7E){ 
			SBUF0 = 0x7D; 
			while(TI0==0);TI0=0; 
			SBUF0 = 0x5E; 
			while(TI0==0);TI0=0; 
		} 
		else if(Temp_Buffer[i] == 0x7D){ 
			SBUF0 = 0x7D; 
			while(TI0==0);TI0=0; 
			SBUF0 = 0x5D; 
			while(TI0==0);TI0=0; 
		} 
	/*	else if(Temp_Buffer[i] 0x20){			 
			SBUF0 = 0x7D; 
			while(TI0==0);TI0=0; 
			SBUF0 = Temp_Buffer[i]^0x20; 
			while(TI0==0);TI0=0; 
		}*/ 
		else{ 
			SBUF0 = Temp_Buffer[i]; 
			while(TI0==0);TI0=0; 
		} 
	} 
 
	SBUF0 = 0x7E; 
	while(TI0==0);TI0=0;	 
	 
} 
 
 
// 向采集板发送子程序 
void SEND_DATA_CAIJI(unsigned char Data_Len) 
{ 
	unsigned char i; 
	unsigned char checksum=0; 
 
	for(i=0;i<Data_Len;i++) 
	{ 
		checksum = checksum + CAIJI_Command_Buf[i]; 
	} 
	 
	CAIJI_Command_Buf[Data_Len] = checksum; 
	SCON1 &=0xFD; 
	SBUF1 = 0x0E;									// 发送帧头 
	while(TI1==0); SCON1 &= 0xFD; 
 
	for(i=0;i<Data_Len+1;i++)							// 发送数据 
	{ 
		if(CAIJI_Command_Buf[i] == 0x7D) 
		{ 
			SBUF1 = 0x0A; 
			while(TI1==0); SCON1 &=0xFD; 
		} 
		else if(CAIJI_Command_Buf[i]<0x10) 
		{ 
			SBUF1 = 0x7D; 
			while(TI1==0); SCON1 &=0xFD; 
			SBUF1 = CAIJI_Command_Buf[i]^0x7D; 
			while(TI1==0); SCON1 &=0xFD; 
		} 
		else  
		{ 
			SBUF1 = CAIJI_Command_Buf[i]; 
			while(TI1==0); SCON1 &=0xFD; 
		} 
	} 
 
	SBUF1 = 0x05;									// 发送帧尾 
	while(TI1==0); SCON1 &=0xFD; 
} 
 
// 采集板送来数据处理子程序 
 
void DEAL_DATA_CAIJI(void) 
{ 
	unsigned int i; 
	unsigned char check_sum=0; 
 
	for(i=0;i<CAIJI_Receive_Len-1;i++) 
	{ 
		CAIJI_Data_Buffer[i] = Receive_Buf_UAR1[i];		// 保存数据到数据缓存区 
		check_sum =	check_sum + Receive_Buf_UAR1[i];	// 计算校验和 
	} 
 
	if(check_sum !=  Receive_Buf_UAR1[CAIJI_Receive_Len-1])	// 校验校验和 
	{ 
		return; 
	} 
	// 数据传输正确,进行处理 
	CAIJI_Data_Len = CAIJI_Receive_Len - 1; 
 
	switch(CAIJI_Data_Buffer[1]) 
	{ 
		case	0xAA:								// 应答代码 
			switch(CAIJI_Data_Buffer[2]) 
			{ 
				case	0x10: 
					// 普通命令应答处理 
					if(CAIJI_Data_Buffer[0] != (CAIJI_Send_SeqNr-1))	 
					{ 
						return;								// 序列号不匹配,不作处理 
					} 
 
					// 停止向采集板命令重传 
					CAIJI_Resend_Flag = 0;					 
					CAIJI_Timer = 0; 
					if(WAVE_Resend_Flag == 0) 
					{ 
						TMR3CN &=0xFB;	// 关闭定时器3					 
					} 
					break; 
 
				case	0x20: 
					// 采集数据处理 
					Frame_Data_Deal(); 
					break; 
			}											 
		case	0x55: 
			switch(CAIJI_Data_Buffer[2]) 
			{ 
				case	0x00: 
					Trouble_Inform_Comm();		// 故障通知命令 
					break; 
				case	0x01: 
					Data_Ready_Comm();			// 数据准备好命令 
					break; 
			} 
	} 
	 
} 
 
// 采集板送来的帧处理 
void Frame_Data_Deal(void) 
{ 
	unsigned int i; 
	unsigned int address; 
 
	// 判断序列号 
	if(CAIJI_Data_Buffer[0] != CAIJI_Send_SeqNr-1 )	 
	{ 
		return;								 
	} 
 
	// 判断帧序号 
	if(CAIJI_Data_Buffer[5] != Frame_Num) 
	{ 
		return; 
	} 
 
	// 判断帧长度 
	if(CAIJI_Data_Buffer[3]>245) 
	{ 
		return; 
	} 
 
	// 停止向采集板命令重传 
	CAIJI_Resend_Flag = 0;					 
	CAIJI_Timer = 0; 
	if(WAVE_Resend_Flag == 0) 
	{ 
		TMR3CN &=0xFB;	// 关闭定时器3					 
	} 
	 
	// 设置向监控中心发送的命令报文 
	WAVE_Comm_Len = 0; 
 
	if(WAVECOM_Gather == 1)				 
	{ 
		// 发送被动上传数据命令 
		{ 
			// 命令头 
			WAVE_Command_Buf[WAVE_Comm_Len++] = WAVE_Send_SeqNr++;			// 命令序列号 
			WAVE_Command_Buf[WAVE_Comm_Len++] = 0x00;						// 命令标识 
			WAVE_Command_Buf[WAVE_Comm_Len++] = 0x00;						// command [0] 
			WAVE_Command_Buf[WAVE_Comm_Len++] = 0x00;						// command [1] 
			WAVE_Command_Buf[WAVE_Comm_Len++] = 0x03+CAIJI_Data_Len-0x06;	// 数据长度 
 
			// 中心序号 
			WAVE_Command_Buf[WAVE_Comm_Len++] = WAVE_Receive_SeqNr; 
			// 尾帧标识			 
			WAVE_Command_Buf[WAVE_Comm_Len++] = CAIJI_Data_Buffer[4];			 
			// 帧序号 
			WAVE_Command_Buf[WAVE_Comm_Len++] = Frame_Num; 
			// 送入采集数据 
			for(i=0;i<CAIJI_Data_Len - 6;i++) 
			{ 
				WAVE_Command_Buf[WAVE_Comm_Len++] = CAIJI_Data_Buffer[6+i]; 
			} 
		} 
	} 
	else								 
	{ 
		// 现场定时上传采集数据 
		{ 
			// 命令头 
			WAVE_Command_Buf[WAVE_Comm_Len++] = WAVE_Send_SeqNr++;			// 命令报文序列号 
			WAVE_Command_Buf[WAVE_Comm_Len++] = 0x00;						// 发送命令标识 
			WAVE_Command_Buf[WAVE_Comm_Len++] = 0x00;						// Command[0] 
			WAVE_Command_Buf[WAVE_Comm_Len++] = 0x01;						// Command[1] 
			WAVE_Command_Buf[WAVE_Comm_Len++] = CAIJI_Data_Len + 3;			// 数据长度 
 
			// 尾帧标识 
			WAVE_Command_Buf[WAVE_Comm_Len++] = CAIJI_Data_Buffer[4]; 
			// 帧序号 
			WAVE_Command_Buf[WAVE_Comm_Len++] = Frame_Num; 
			// 设置时间 
			{ 
				 
				WAVE_Command_Buf[WAVE_Comm_Len++] = 0x14;					// 年(高位) 
				CS_RTC = 0;													// 从时间芯片读取时间 
				while(RegA & 0x80 != 0x00); 
				WAVE_Command_Buf[WAVE_Comm_Len++] = Year; 
				WAVE_Command_Buf[WAVE_Comm_Len++] = Month; 
				WAVE_Command_Buf[WAVE_Comm_Len++] = Day; 
				WAVE_Command_Buf[WAVE_Comm_Len++] = Hour; 
				WAVE_Command_Buf[WAVE_Comm_Len++] = Minute; 
				WAVE_Command_Buf[WAVE_Comm_Len++] = Second; 
				CS_RTC = 1; 
				 
			} 
			// 送入采集数据 
			for(i=0;i<CAIJI_Data_Len - 6;i++) 
			{ 
				WAVE_Command_Buf[WAVE_Comm_Len++] = CAIJI_Data_Buffer[6+i]; 
			} 
 
			// 备份数据 
			{ 
				// 备份长度 
				Write_Byte(Current_Add,CAIJI_Data_Len+1); 
				Current_Add++; 
				// 备份数据 
				for(i=0;i<CAIJI_Data_Len+1;i++) 
				{ 
					Write_Byte(Current_Add,WAVE_Command_Buf[7+i]); 
					Current_Add++; 
				} 
			} 
		} 
	} 
 
	// 向中心发命令 
	SEND_DATA_WAVECOM(WAVE_Comm_Len);								// 向监控中心发送数据 
 
	// 设置重传标识 
	WAVE_Resend_Flag = 1;										// 设置命令重传标识								 
	WAVE_Resend_Num = 0; 
	WAVE_Timer = 10; 
	TMR3CN |= 0x04;		// 开启定时器3 
 
	// ---------------------------------------------------------- 
	// 设置后续重发帧 
	Frame_Num++; 
	if(CAIJI_Data_Buffer[4] == 0) 
	{ 
		// 帧传输结束 
 
		// 清数据采集好标识 
		Data_Ready_Flag = 0; 
		if(WAVECOM_Gather == 1) 
		{ 
			WAVECOM_Gather = 0; 
			if(Time_Gather == 1) 
			{ 
				// 向采集板发送采集命令(类型为定时发送规定的) 
				// 命令头 
				CAIJI_Comm_Len = 0; 
				CAIJI_Command_Buf[CAIJI_Comm_Len++] = CAIJI_Send_SeqNr++; 
				CAIJI_Command_Buf[CAIJI_Comm_Len++] = 0x55; 
				CAIJI_Command_Buf[CAIJI_Comm_Len++] = 0x05; 
				CAIJI_Command_Buf[CAIJI_Comm_Len++] = 0x04; 
 
				// 冲次数 
				CAIJI_Command_Buf[CAIJI_Comm_Len++] = 0x01; 
 
				// 参量类型 
				CAIJI_Command_Buf[CAIJI_Comm_Len++] = 0x03; 
				CAIJI_Command_Buf[CAIJI_Comm_Len++] = 0x08; 
				CAIJI_Command_Buf[CAIJI_Comm_Len++] = 0x10; 
				 
				// 发送数据 
				SEND_DATA_CAIJI(CAIJI_Comm_Len); 
 
				// 设置命令重传标识	 
				CAIJI_Resend_Flag = 1;																	 
				CAIJI_Resend_Num = 0; 
				CAIJI_Timer = 1; 
				TMR3CN |= 0x04;		// 开启定时器3 
 
				// 设置初始帧序号 
				Frame_Num = 1; 
			} 
			else 
			{ 
				Data_Gather_Comm = 0; 
			} 
		} 
		else 
		{ 
			// 清除数据采集标识 
			Time_Gather = 0; 
			Data_Gather_Comm = 0; 
			 
			// 设置备份项数和备份数据发送标识 
			address = Backup_Index*0x1000; 
//			Write_Byte(address,0xAA);				// 标识该帧已发送 
			Write_Byte(address,Frame_Num-1); 
 
			// 修改记录号 
			if(Backup_Index == 4) 
			{ 
				Backup_Index = 2; 
				CS_RTC = 0; 
				Record_Ind = 2; 
				CS_RTC = 1; 
			} 
			else 
			{ 
				Backup_Index++; 
				CS_RTC = 0; 
				Record_Ind = Backup_Index; 
				CS_RTC = 1; 
			} 
		} 
	} 
} 
 
// 故障通知命令处理 
void Trouble_Inform_Comm(void) 
{	 
	CAIJI_Receive_SeqNr = CAIJI_Data_Buffer[0];							// 保存接收序列号	 
	// 停止其它一切的命令及应答 
	WAVE_Resend_Flag = 0;												 
	WAVE_Timer = 0; 
	CAIJI_Resend_Flag = 0;												 
	CAIJI_Timer = 0; 
	TMR3CN &=0xFB;				// 关闭定时器3 
 
	WAVECOM_Gather = 0; 
	Time_Gather = 0; 
	Data_Gather_Comm = 0; 
 
 
	// 向采集板回送应答代码 
	CAIJI_Comm_Len = 0; 
	CAIJI_Command_Buf[CAIJI_Comm_Len++] = CAIJI_Receive_SeqNr; 
	CAIJI_Command_Buf[CAIJI_Comm_Len++] = 0xAA; 
	CAIJI_Command_Buf[CAIJI_Comm_Len++] = 0x10; 
	CAIJI_Command_Buf[CAIJI_Comm_Len++] = 0x00; 
	SEND_DATA_CAIJI(CAIJI_Comm_Len); 
 
	// 向监控中心发命令代码 
	WAVE_Comm_Len = 0; 
	WAVE_Command_Buf[WAVE_Comm_Len++] = WAVE_Send_SeqNr++;		// 命令报文序列号 
	WAVE_Command_Buf[WAVE_Comm_Len++] = 0x00;					// 发送命令标识 
	WAVE_Command_Buf[WAVE_Comm_Len++] = 0x00;					// Command[0] 
	WAVE_Command_Buf[WAVE_Comm_Len++] = 0x02;					// Command[1] 
	WAVE_Command_Buf[WAVE_Comm_Len++] = 0x08+0x03;				// 数据长度 
	WAVE_Command_Buf[WAVE_Comm_Len++] = 0x14;					// 年(高位) 
 
	CS_RTC = 0;													// 从时间芯片读取时间 
	while(RegA & 0x80 != 0x00); 
	WAVE_Command_Buf[WAVE_Comm_Len++] = Year; 
	WAVE_Command_Buf[WAVE_Comm_Len++] = Month; 
	WAVE_Command_Buf[WAVE_Comm_Len++] = Day; 
	WAVE_Command_Buf[WAVE_Comm_Len++] = Hour; 
	WAVE_Command_Buf[WAVE_Comm_Len++] = Minute; 
	WAVE_Command_Buf[WAVE_Comm_Len++] = Second; 
	CS_RTC = 1; 
 
	WAVE_Command_Buf[WAVE_Comm_Len++] = 0xAA;					// 故障标识 
	WAVE_Command_Buf[WAVE_Comm_Len++] = CAIJI_Data_Buffer[4];	// 故障信息 
	WAVE_Command_Buf[WAVE_Comm_Len++] = CAIJI_Data_Buffer[5]; 
	WAVE_Command_Buf[WAVE_Comm_Len++] = CAIJI_Data_Buffer[6]; 
 
	WAVE_Resend_Flag = 1;										// 设置命令重传标识								 
	WAVE_Resend_Num = 0; 
	WAVE_Timer = 10; 
	TMR3CN |= 0x04;		// 开启定时器3 
} 
 
// 数据准备好命令处理 
void Data_Ready_Comm() 
{ 
	if(WAVE_Resend_Flag == 1 || CAIJI_Resend_Flag == 1) 
	{ 
		return;			// 如有数据重发,不作处理 
	} 
 
	CAIJI_Receive_SeqNr = CAIJI_Data_Buffer[0];							// 保存接收序列号 
 
	// 向采集板回送应答代码 
	CAIJI_Comm_Len = 0; 
	CAIJI_Command_Buf[CAIJI_Comm_Len++] = CAIJI_Receive_SeqNr; 
	CAIJI_Command_Buf[CAIJI_Comm_Len++] = 0xAA; 
	CAIJI_Command_Buf[CAIJI_Comm_Len++] = 0x10; 
	CAIJI_Command_Buf[CAIJI_Comm_Len++] = 0x00; 
	SEND_DATA_CAIJI(CAIJI_Comm_Len); 
 
	// 设置数据准备好标识 
	Data_Ready_Flag = 1; 
} 
  
// 向采集板取数据命令 
void Get_Data_Comm(void) 
{ 
	CAIJI_Comm_Len = 0; 
	CAIJI_Command_Buf[CAIJI_Comm_Len++] = CAIJI_Send_SeqNr++; 
	CAIJI_Command_Buf[CAIJI_Comm_Len++] = 0x55; 
	CAIJI_Command_Buf[CAIJI_Comm_Len++] = 0x06; 
	CAIJI_Command_Buf[CAIJI_Comm_Len++] = 0x01; 
	CAIJI_Command_Buf[CAIJI_Comm_Len++] = Frame_Num; 
 
	// 发送数据 
	SEND_DATA_CAIJI(CAIJI_Comm_Len); 
 
	// 设置命令重传标识	 
	CAIJI_Resend_Flag = 1;																	 
	CAIJI_Resend_Num = 0; 
	CAIJI_Timer = 1; 
	TMR3CN |= 0x04;		// 开启定时器3 
} 
 
 
 
// -------------------------------------------------------------------------------------------------- 
// 处理监控中心发来的UDP信息 
void WAVE_Rec_Ack(void) 
{ 
	unsigned char i; 
 
	for(i=0;i<WAVE_Receive_Num - 31;i++) 
	{ 
		WAVE_Data_Buffer[i] = RECEIVEBUFFER[29+i]; 
	} 
 
	switch(WAVE_Data_Buffer[1])			// 命令代码和应答代码分类 
	{ 
		case	0x00:						// 命令代码 
 
			if(WAVE_Resend_Flag == 1 || CAIJI_Resend_Flag == 1 || Data_Gather_Comm == 1) 
			{ 
				return;		// 当前有数据重传或者正在进行数据采集,不应答 
			} 
 
			switch(WAVE_Data_Buffer[2])		// 命令类型分类 
			{ 
				case	0x00:						// 参数设置命令	 
					 
					switch(WAVE_Data_Buffer[3])		 
					{	 
						case	0x00:				// 设置油井编号和油井冲次 
							Machine_Message_Set(); 
							break; 
 
						case	0x01:				// 设置油管回压超限值 
							Pressure_Limit_Set(); 
							break; 
 
						case	0x02:				// 设置电动机功率超限值 
							Power_Limit_Set(); 
							break; 
 
						case	0x03:				// 设置上传时间 
							UP_Timer_Set(); 
							break; 
 
						case	0x04:				// 设置时间间隔 
							Time_Interval_Set(); 
							break; 
 
						default: 
							break; 
					} 
					 
				case	0x01:						// 数据采集命令 
					Data_Gather_Set(); 
					break; 
 
				case	0x02:						// 控制命令 
					switch(WAVE_Data_Buffer[3]) 
					{ 
						case	0x00:				// 开机命令 
							Open_Machine_Comm(); 
							break; 
 
						case	0x01:				// 关机命令 
							Close_Machine_Comm(); 
							break; 
 
						default: 
							break; 
					} 
 
				default: 
					break; 
			} 
 
		case	0x01:		// 应答报文 
			if(WAVE_Data_Buffer[0] != WAVE_Send_SeqNr-1) 
			{ 
				return; 
			} 
			// 清除重发标识 
			WAVE_Resend_Flag = 0; 
			WAVE_Timer = 0; 
			Test_Frame_Answer = 0; 
 
			if(CAIJI_Resend_Flag == 0) 
			{ 
				TMR3CN &=0xFB;         //Stop   Timer3 
			} 
			break; 
 
		default: 
			break; 
	} 
} 
 
// 油井信息设置命令 
void Machine_Message_Set(void) 
{ 
	unsigned char i; 
	unsigned char xdata temp[19]; 
 
	// 校验长度 
	if(WAVE_Data_Buffer[4] != 3) 
	{ 
		return; 
	} 
 
	// 备份数据 
	for(i=1;i<17;i++) 
	{ 
		temp[i-1] = XBYTE[StartAddress+i]; 
	} 
	// 擦除扇区 
	CS_RTC = 1; 
	Erase_Sector(StartAddress); 
 
	// 保存发来的序列号 
	WAVE_Receive_SeqNr = WAVE_Data_Buffer[0]; 
 
	// 恢复前面的数据 
	for(i=0;i<6;i++) 
	{ 
		Write_Byte(StartAddress+1+i,temp[i]); 
	} 
	// 写入修改的数据 
	for(i=0;i<2;i++) 
	{ 
		Write_Byte(StartAddress+Machine_Num+i,WAVE_Data_Buffer[5+i]); // 油井编号 
	} 
	Write_Byte(StartAddress+Machine_Cycle,WAVE_Data_Buffer[7]);		  // 油井冲次 
	// 恢复后面的数据 
	for(i=9;i<16;i++) 
	{ 
		Write_Byte(StartAddress+1+i,temp[i]); 
	} 
	Write_Byte(StartAddress,0xAA);								// 设置FLASH设置标识位 
 
	// 向监控中心发应答信息 
	WAVE_Comm_Len = 0; 
	WAVE_Command_Buf[WAVE_Comm_Len++] = WAVE_Receive_SeqNr;		// 应答序列号 
	WAVE_Command_Buf[WAVE_Comm_Len++] = 0x01;					// 应答命令标识 
	WAVE_Command_Buf[WAVE_Comm_Len++] = 0x00;					// 状态 
	WAVE_Command_Buf[WAVE_Comm_Len++] = 0x00;					// 长度 
	SEND_DATA_WAVECOM(WAVE_Comm_Len);							// 向监控中心发送数据 
 
	// 向采集板发送设置参数 
	CAIJI_Comm_Len = 0; 
	CAIJI_Command_Buf[CAIJI_Comm_Len++] = CAIJI_Send_SeqNr++; 
	CAIJI_Command_Buf[CAIJI_Comm_Len++] = 0x55; 
	CAIJI_Command_Buf[CAIJI_Comm_Len++] = 0x00; 
	CAIJI_Command_Buf[CAIJI_Comm_Len++] = 0x01; 
	CAIJI_Command_Buf[CAIJI_Comm_Len++] = WAVE_Data_Buffer[7]; 
	SEND_DATA_CAIJI(CAIJI_Comm_Len); 
 
	// 设置重发标识 
	CAIJI_Resend_Flag = 1; 
	CAIJI_Timer = 1; 
	CAIJI_Resend_Num =0 ; 
	TMR3CN |= 0x04;		// 开启定时器3 
} 
 
 
// 油管回压超限值设置命令 
void Pressure_Limit_Set(void) 
{ 
	unsigned char i; 
	unsigned char xdata temp[19]; 
 
	// 校验长度 
	if(WAVE_Data_Buffer[4] != 0x02) 
	{ 
		return; 
	} 
	 
	// 备份数据 
	for(i=1;i<17;i++) 
	{ 
		temp[i-1] = XBYTE[StartAddress+i]; 
	} 
	// 擦除扇区 
	CS_RTC = 1; 
	Erase_Sector(StartAddress); 
 
	// 保存发来底序列号 
	WAVE_Receive_SeqNr = WAVE_Data_Buffer[0]; 
 
	// 恢复前面的数据 
	for(i=0;i<9;i++) 
	{ 
		Write_Byte(StartAddress+1+i,temp[i]); 
	} 
	// 写入修改的数据 
	for(i=0;i<2;i++) 
	{ 
		Write_Byte(StartAddress+Pressure_Limit+i,WAVE_Data_Buffer[5+i]);		 //	油管回压超限值 
	} 
	// 恢复后面的数据 
	for(i=11;i<16;i++) 
	{ 
		Write_Byte(StartAddress+1+i,temp[i]); 
	} 
	Write_Byte(StartAddress,0xAA);								// 设置FLASH设置标识位 
	// 向监控中心发应答信息 
	WAVE_Comm_Len = 0; 
	WAVE_Command_Buf[WAVE_Comm_Len++] = WAVE_Receive_SeqNr;		// 应答序列号 
	WAVE_Command_Buf[WAVE_Comm_Len++] = 0x01;					// 应答命令标识 
	WAVE_Command_Buf[WAVE_Comm_Len++] = 0x00;					// 状态 
	WAVE_Command_Buf[WAVE_Comm_Len++] = 0x00;					// 长度 
	SEND_DATA_WAVECOM(WAVE_Comm_Len);							// 向监控中心发送数据 
	// 向采集板发送设置参数 
	CAIJI_Comm_Len = 0; 
	CAIJI_Command_Buf[CAIJI_Comm_Len++] = CAIJI_Send_SeqNr++; 
	CAIJI_Command_Buf[CAIJI_Comm_Len++] = 0x55; 
	CAIJI_Command_Buf[CAIJI_Comm_Len++] = 0x01; 
	CAIJI_Command_Buf[CAIJI_Comm_Len++] = 0x02; 
	for(i=0;i<2;i++) 
	{ 
		CAIJI_Command_Buf[CAIJI_Comm_Len++] = WAVE_Data_Buffer[5+i]; 
	} 
	SEND_DATA_CAIJI(CAIJI_Comm_Len); 
 
	// 设置重发标识 
	CAIJI_Resend_Flag = 1; 
	CAIJI_Timer = 1; 
	CAIJI_Resend_Num =0 ; 
	TMR3CN |= 0x04;		// 开启定时器3 
} 
 
// 电动机功率超限值设置命令 
void Power_Limit_Set(void) 
{ 
	unsigned char i; 
	unsigned char xdata temp[19]; 
 
	// 校验长度 
	if(WAVE_Data_Buffer[4] !=0x02) 
	{ 
		return; 
	} 
	// 备份数据 
	for(i=1;i<17;i++) 
	{ 
		temp[i-1] = XBYTE[StartAddress+i]; 
	} 
	// 擦除扇区 
	CS_RTC = 1; 
	Erase_Sector(StartAddress); 
 
	WAVE_Receive_SeqNr = WAVE_Data_Buffer[0]; 
	// 恢复前面的数据 
	for(i=0;i<11;i++) 
	{ 
		Write_Byte(StartAddress+1+i,temp[i]); 
	} 
	// 写入修改的数据	 
	for(i=0;i<2;i++) 
	{ 
		Write_Byte(StartAddress+Power_Limit+i,WAVE_Data_Buffer[5+i]);		 //	电动机功率超限值 
	} 
	// 恢复后面的数据 
	for(i=13;i<16;i++) 
	{ 
		Write_Byte(StartAddress+1+i,temp[i]); 
	} 
	Write_Byte(StartAddress,0xAA);								// 设置FLASH设置标识位 
	// 向监控中心发应答信息 
	WAVE_Comm_Len = 0; 
	WAVE_Command_Buf[WAVE_Comm_Len++] = WAVE_Receive_SeqNr;		// 应答序列号 
	WAVE_Command_Buf[WAVE_Comm_Len++] = 0x01;					// 应答命令标识 
	WAVE_Command_Buf[WAVE_Comm_Len++] = 0x00;					// 状态 
	WAVE_Command_Buf[WAVE_Comm_Len++] = 0x00;					// 长度 
	SEND_DATA_WAVECOM(WAVE_Comm_Len);							// 向监控中心发送数据 
	// 向采集板发送设置参数 
	CAIJI_Comm_Len = 0; 
	CAIJI_Command_Buf[CAIJI_Comm_Len++] = CAIJI_Send_SeqNr++; 
	CAIJI_Command_Buf[CAIJI_Comm_Len++] = 0x55; 
	CAIJI_Command_Buf[CAIJI_Comm_Len++] = 0x02; 
	CAIJI_Command_Buf[CAIJI_Comm_Len++] = 0x02; 
	for(i=0;i<2;i++) 
	{ 
		CAIJI_Command_Buf[CAIJI_Comm_Len++] = WAVE_Data_Buffer[5+i]; 
	} 
	SEND_DATA_CAIJI(CAIJI_Comm_Len); 
 
	// 设置重发标识 
	CAIJI_Resend_Flag = 1; 
	CAIJI_Timer = 1; 
	CAIJI_Resend_Num =0 ; 
	TMR3CN |= 0x04;		// 开启定时器3 
} 
 
// 上传时间设置命令 
void UP_Timer_Set(void) 
{ 
	unsigned char i; 
	unsigned char xdata temp[19]; 
	 
	// 校验数据长度 
	if(WAVE_Data_Buffer[4] != 0x02) 
	{ 
		return; 
	} 
	// 备份数据 
	for(i=1;i<17;i++) 
	{ 
		temp[i-1] = XBYTE[StartAddress+i]; 
	} 
	// 擦除扇区 
	CS_RTC = 1; 
	Erase_Sector(StartAddress); 
 
	WAVE_Receive_SeqNr = WAVE_Data_Buffer[0]; 
	// 恢复前面的数据 
	for(i=0;i<13;i++) 
	{ 
		Write_Byte(StartAddress+1+i,temp[i]); 
	} 
	// 写入修改的数据							 
	Write_Byte(StartAddress+UP_Send_Time,WAVE_Data_Buffer[5]);		 //	电动机功率超限值 
	Write_Byte(StartAddress+UP_Send_Time+1,WAVE_Data_Buffer[6]); 
	// 恢复后面的数据 
	for(i=15;i<16;i++) 
	{ 
		Write_Byte(StartAddress+1+i,temp[i]); 
	} 
	Write_Byte(StartAddress,0xAA);								// 设置FLASH设置标识位 
	// 向监控中心发应答信息 
	WAVE_Comm_Len = 0; 
	WAVE_Command_Buf[WAVE_Comm_Len++] = WAVE_Receive_SeqNr;		// 应答序列号 
	WAVE_Command_Buf[WAVE_Comm_Len++] = 0x01;					// 应答命令标识 
	WAVE_Command_Buf[WAVE_Comm_Len++] = 0x00;					// 状态 
	WAVE_Command_Buf[WAVE_Comm_Len++] = 0x00;					// 长度 
	SEND_DATA_WAVECOM(WAVE_Comm_Len);							// 向监控中心发送数据 
} 
 
// 时间间隔设置命令 
void Time_Interval_Set(void) 
{ 
	unsigned char i; 
	unsigned char xdata temp[19]; 
	 
	// 校验数据长度 
	if(WAVE_Data_Buffer[4] != 0x01) 
	{ 
		return; 
	} 
	// 备份数据 
	for(i=1;i<17;i++) 
	{ 
		temp[i-1] = XBYTE[StartAddress+i]; 
	} 
	// 擦除扇区 
	CS_RTC = 1; 
	Erase_Sector(StartAddress); 
 
	WAVE_Receive_SeqNr = WAVE_Data_Buffer[0]; 
	// 恢复前面的数据 
	for(i=0;i<15;i++) 
	{ 
		Write_Byte(StartAddress+1+i,temp[i]); 
	} 
	// 写入修改的数据							 
	Write_Byte(StartAddress+Time_Interval,WAVE_Data_Buffer[5]);		 //	时间间隔 
 
	Write_Byte(StartAddress,0xAA);								// 设置FLASH设置标识位 
 
	// 时间间隔计数器清0 
	Timer_Num = 0; 
	// 向监控中心发应答信息 
	WAVE_Comm_Len = 0; 
	WAVE_Command_Buf[WAVE_Comm_Len++] = WAVE_Receive_SeqNr;		// 应答序列号 
	WAVE_Command_Buf[WAVE_Comm_Len++] = 0x01;					// 应答命令标识 
	WAVE_Command_Buf[WAVE_Comm_Len++] = 0x00;					// 状态 
	WAVE_Command_Buf[WAVE_Comm_Len++] = 0x00;					// 长度 
	SEND_DATA_WAVECOM(WAVE_Comm_Len);							// 向监控中心发送数据 
} 
 
// 数据采集命令 
void Data_Gather_Set(void) 
{ 
	unsigned char i; 
 
	// 校验数据长度 
	if(WAVE_Data_Buffer[4] != 0x04) 
	{ 
		return; 
	} 
	// 校验冲次数 
	if((WAVE_Data_Buffer[5]>3) || (WAVE_Data_Buffer[5]==0) )				// 冲次数大于3,错误不处理 
	{ 
		return; 
	} 
	WAVE_Receive_SeqNr = WAVE_Data_Buffer[0]; 
	// 设置采集命令标识 
	Data_Gather_Comm = 1; 
	WAVECOM_Gather=1; 
	Frame_Num = 1; 
 
	// 向监控中心发应答信息 
	WAVE_Comm_Len = 0; 
	WAVE_Command_Buf[WAVE_Comm_Len++] = WAVE_Receive_SeqNr;		// 应答序列号 
	WAVE_Command_Buf[WAVE_Comm_Len++] = 0x01;					// 应答命令标识 
	WAVE_Command_Buf[WAVE_Comm_Len++] = 0x00;					// 状态 
	WAVE_Command_Buf[WAVE_Comm_Len++] = 0x00;					// 长度 
	SEND_DATA_WAVECOM(WAVE_Comm_Len);							// 向监控中心发送数据 
 
	// 向采集板发送数据采集命令 
	CAIJI_Comm_Len = 0; 
	CAIJI_Command_Buf[CAIJI_Comm_Len++] = CAIJI_Send_SeqNr++; 
	CAIJI_Command_Buf[CAIJI_Comm_Len++] = 0x55; 
	CAIJI_Command_Buf[CAIJI_Comm_Len++] = 0x05; 
	CAIJI_Command_Buf[CAIJI_Comm_Len++] = 0x04;					// 数据长度 
	for(i=0;i<4;i++) 
	{ 
		CAIJI_Command_Buf[CAIJI_Comm_Len++] = WAVE_Data_Buffer[5+i]; 
	} 
	SEND_DATA_CAIJI(CAIJI_Comm_Len); 
 
	// 设置重发标识 
	CAIJI_Resend_Flag = 1; 
	CAIJI_Timer = 1; 
	CAIJI_Resend_Num =0 ; 
	TMR3CN |= 0x04;		// 开启定时器3 
 
} 
 
// 开机命令 
void Open_Machine_Comm(void) 
{ 
	// 校验数据长度 
	if(WAVE_Data_Buffer[4] != 00) 
	{ 
		return; 
	} 
	WAVE_Receive_SeqNr = WAVE_Data_Buffer[0]; 
	// 向监控中心发应答信息 
	WAVE_Comm_Len = 0; 
	WAVE_Command_Buf[WAVE_Comm_Len++] = WAVE_Receive_SeqNr;		// 应答序列号 
	WAVE_Command_Buf[WAVE_Comm_Len++] = 0x01;					// 应答命令标识 
	WAVE_Command_Buf[WAVE_Comm_Len++] = 0x00;					// 状态 
	WAVE_Command_Buf[WAVE_Comm_Len++] = 0x00;					// 长度 
	SEND_DATA_WAVECOM(WAVE_Comm_Len);							// 向监控中心发送数据 
	// 向采集板发送设置参数 
	CAIJI_Comm_Len = 0; 
	CAIJI_Command_Buf[CAIJI_Comm_Len++] = CAIJI_Send_SeqNr++; 
	CAIJI_Command_Buf[CAIJI_Comm_Len++] = 0x55; 
	CAIJI_Command_Buf[CAIJI_Comm_Len++] = 0x03; 
	CAIJI_Command_Buf[CAIJI_Comm_Len++] = 0x00; 
	SEND_DATA_CAIJI(CAIJI_Comm_Len); 
 
	// 设置重发标识 
	CAIJI_Resend_Flag = 1; 
	CAIJI_Timer = 1; 
	CAIJI_Resend_Num =0 ; 
	TMR3CN |= 0x04;		// 开启定时器3 
} 
 
// 关机命令 
void Close_Machine_Comm(void) 
{ 
 
	// 校验数据长度 
	if(WAVE_Data_Buffer[4] != 00) 
	{ 
		return; 
	} 
	WAVE_Receive_SeqNr = WAVE_Data_Buffer[0]; 
	// 向监控中心发应答信息 
	WAVE_Comm_Len = 0; 
	WAVE_Command_Buf[WAVE_Comm_Len++] = WAVE_Receive_SeqNr;		// 应答序列号 
	WAVE_Command_Buf[WAVE_Comm_Len++] = 0x01;					// 应答命令标识 
	WAVE_Command_Buf[WAVE_Comm_Len++] = 0x00;					// 状态 
	WAVE_Command_Buf[WAVE_Comm_Len++] = 0x00;					// 长度 
	SEND_DATA_WAVECOM(WAVE_Comm_Len);							// 向监控中心发送数据 
	// 向采集板发送设置参数 
	CAIJI_Comm_Len = 0; 
	CAIJI_Command_Buf[CAIJI_Comm_Len++] = CAIJI_Send_SeqNr++; 
	CAIJI_Command_Buf[CAIJI_Comm_Len++] = 0x55; 
	CAIJI_Command_Buf[CAIJI_Comm_Len++] = 0x04; 
	CAIJI_Command_Buf[CAIJI_Comm_Len++] = 0x00; 
	SEND_DATA_CAIJI(CAIJI_Comm_Len); 
 
 
	// 设置重发标识 
	CAIJI_Resend_Flag = 1; 
	CAIJI_Timer = 1; 
	CAIJI_Resend_Num =0 ; 
	TMR3CN |= 0x04;		// 开启定时器3 
} 
 
// 链路连接命令 
void Link_Send_Comm(void) 
{ 
	unsigned char i; 
 
	if(Init_Flag != 1) 
	{ 
		return;					// 没有进行初始化,不能发链路命令 
	}	 
/* 
	// 发送链路命令 
	WAVE_Comm_Len = 0; 
	WAVE_Command_Buf[WAVE_Comm_Len++] = WAVE_Send_SeqNr++;		// 命令序列号 
	WAVE_Command_Buf[WAVE_Comm_Len++] = 0x00;					// 命令标识 
	WAVE_Command_Buf[WAVE_Comm_Len++] = 0x00;					// command[0] 
	WAVE_Command_Buf[WAVE_Comm_Len++] = 0x03;					// command[1] 
	WAVE_Command_Buf[WAVE_Comm_Len++] = 0x02;					// 数据长度 
 
	CS_RTC = 1; 
	for(i=0;i<2;i++) 
	{ 
		WAVE_Command_Buf[WAVE_Comm_Len++] = XBYTE[StartAddress+Machine_Num+i]; 
	} 
	SEND_DATA_WAVECOM(WAVE_Comm_Len);							// 向监控中心发送数据 
 
	WAVE_Resend_Flag = 1;										// 设置命令重传标识								 
	WAVE_Resend_Num = 0; 
	WAVE_Timer = 10; 
	TMR3CN |= 0x04;		// 开启定时器3 
	*/ 
} 
 
// 发送测试帧命令 
void Test_Frame_Send(void) 
{ 
	WAVE_Comm_Len = 0; 
	WAVE_Command_Buf[WAVE_Comm_Len++] = WAVE_Send_SeqNr++;		// 命令序列号 
	WAVE_Command_Buf[WAVE_Comm_Len++] = 0x00;					// 命令标识 
	WAVE_Command_Buf[WAVE_Comm_Len++] = 0x00;					// command[0] 
	WAVE_Command_Buf[WAVE_Comm_Len++] = 0x02;					// command[1] 
	WAVE_Command_Buf[WAVE_Comm_Len++] = 0x08;					// 数据长度 
 
	WAVE_Command_Buf[WAVE_Comm_Len++] = 0x14; 
	CS_RTC = 0;													// 从时间芯片读取时间 
	while(RegA & 0x80 != 0x00); 
	WAVE_Command_Buf[WAVE_Comm_Len++] = Year; 
	WAVE_Command_Buf[WAVE_Comm_Len++] = Month; 
	WAVE_Command_Buf[WAVE_Comm_Len++] = Day; 
	WAVE_Command_Buf[WAVE_Comm_Len++] = Hour; 
	WAVE_Command_Buf[WAVE_Comm_Len++] = Minute; 
	WAVE_Command_Buf[WAVE_Comm_Len++] = Second; 
	CS_RTC = 1; 
 
	WAVE_Command_Buf[WAVE_Comm_Len++] = 0x55;					// 运行正常 
 
	WAVE_Resend_Flag = 1;										// 设置命令重传标识								 
	WAVE_Resend_Num = 0; 
	WAVE_Timer = 10; 
	TMR3CN |= 0x04;		// 开启定时器3 
} 
 
// 定时采集命令处理 
void Timer_Gather_Deal(void) 
{ 
	Data_Gather_Comm = 1; 
	Time_Gather =1 ; 
	Current_Add = (Backup_Index+1)*0x1000 + 1; 
 
	if(WAVECOM_Gather != 1) 
	{ 
		// 发送采集命令 
		CAIJI_Comm_Len = 0; 
		CAIJI_Command_Buf[CAIJI_Comm_Len++] = CAIJI_Send_SeqNr++; 
		CAIJI_Command_Buf[CAIJI_Comm_Len++] = 0x55; 
		CAIJI_Command_Buf[CAIJI_Comm_Len++] = 0x05; 
		CAIJI_Command_Buf[CAIJI_Comm_Len++] = 0x04; 
 
		// 冲次数 
		CAIJI_Command_Buf[CAIJI_Comm_Len++] = 0x01; 
 
		// 参量类型 
		CAIJI_Command_Buf[CAIJI_Comm_Len++] = 0x03; 
		CAIJI_Command_Buf[CAIJI_Comm_Len++] = 0x08; 
		CAIJI_Command_Buf[CAIJI_Comm_Len++] = 0x10; 
		 
		// 发送数据 
		SEND_DATA_CAIJI(CAIJI_Comm_Len); 
 
		// 设置命令重传标识	 
		CAIJI_Resend_Flag = 1;																	 
		CAIJI_Resend_Num = 0; 
		CAIJI_Timer = 1; 
		TMR3CN |= 0x04;		// 开启定时器3 
 
		// 设置初始帧序号 
		Frame_Num = 1; 
	} 
} 
 
//------------------------------------------------------------------------ 
// 重发程序处理块 
// 采集板重发处理 
 
void CAIJI_Resend_Deal(void) 
{ 
	if(CAIJI_Resend_Flag == 1) 
	{ 
		CAIJI_Resend_Num++; 
		if(CAIJI_Resend_Num <3) 
		{ 
			// 重发该命令 
			SEND_DATA_CAIJI(CAIJI_Comm_Len); 
			CAIJI_Timer = 1; 
		} 
		else 
		{ 
			// 采集板无应答,出错 
			CAIJI_Resend_Flag = 0; 
			CAIJI_Timer = 0; 
			if(WAVE_Resend_Flag !=1) 
			{ 
				TMR3CN &=0xFB;         //Stop   Timer3  
			} 
			// 采集命令出错处理(*************************) 
		} 
	} 
} 
 
void WAVE_Resend_Deal(void) 
{ 
	if(WAVE_Resend_Flag == 1) 
	{ 
		WAVE_Resend_Num++; 
		if(WAVE_Resend_Num <3) 
		{ 
			// 重发该命令 
			SEND_DATA_WAVECOM(WAVE_Comm_Len); 
			WAVE_Timer = 10; 
		} 
		else 
		{ 
			// 采集板无应答,出错 
			WAVE_Resend_Flag = 0; 
			WAVE_Timer = 0; 
			if(CAIJI_Resend_Flag !=1) 
			{ 
				TMR3CN &=0xFB;         //Stop   Timer3  
			} 
			// 采集命令出错处理(*************************) 
		} 
	} 
} 
 
// ----------------------------------------------------------------------- 
/* 
// 测试程序块 
void Flash_Test(void) 
{ 
	unsigned char xdata buffer1[4],buffer2[4]; 
	unsigned char i; 
	 
	for (i=0;i<4;i++) 
	{ 
		buffer1[i]=0xDD; 
		buffer2[i]=0x00; 
	} 
 
	Erase_Sector(0x1000); 
	for(i=0;i<4;i++) 
	{ 
		Write_Byte(0x1000+i,buffer1[i]); 
		CS_RTC=1; 
		buffer2[i]=XBYTE[0x1000+i]; 
	} 
} 
 
void RTC_Test(void) 
{ 
	unsigned int i; 
	 
	unsigned char xdata time_buffer[10] = {0x00,0x00,0x12,0x12,0x09,0x09,0x02,0x18,0x02,0x03}; 
	RTC_Init(); 
	CS_RTC = 0; 
	RegB |=0x20; 
	CS_RTC = 1; 
	EX0 = 1; 
	RTC_Time_Update(time_buffer); 
//	for(i=0;i<10000;i++) Delay10ms(); 
	CS_RTC = 0; 
//	while(RegA & 0x80 == 0x00); 
//	for(i=0;i<10;i++) 
//	{ 
//		time_buffer[i] = XBYTE[IniDataAddress+i]; 
//	} 
	 
	RegB |=0x20; 
	CS_RTC = 1; 
	EX0 = 1; 
 
	while (1); 
} 
 
*/