⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 qd.c

📁 基于GPRS无线网络和IP协议的数据传输系统 通信模块C51单片机程序
💻 C
📖 第 1 页 / 共 5 页
字号:
				 	SBUF1=Ctrl_Info_Buffer[0]; //发送第一个字节		 
	             	 
					}
				    else
				    {  
				     ;
				    } 
			    }		 
		        else
			   { 
			       SCON1 |= 0x08;   //如果无控制信息,则回应,回应TB8位置1
			       SBUF1=0;         //回应字节为0x0 
			       Deal_Flag=0;
			       Rec_Ctrl_Flag=0;
			    }
		     } 
			 		 
			else
		  	{
			  SCON1 |= 0x08;   //如果无控制信息,则回应,回应TB8位置1
			  SBUF1=0;         //回应字节为0x0
              if(Information_Type!=0 && Information_Type!=6)//如果不是控制信息和复位命令
			   { 
			     Compare_Counter=0;
				 switch (Information_Type)
				 
				 {
				  case 1://Device Error Status 
				     
				    for(i=0;i<6;i++)
					  {
					  if(InfoData_Buffer[i+1]!=Device_Error_Status[i])
					      Compare_Counter++;
				       }
                      if (Compare_Counter!=0)
					     {	 
						      for(i=0;i<6;i++)  Device_Error_Status[i]=InfoData_Buffer[i+1];
                             			  
							  Compare_Counter=0; 		 
				              Read_Time(); //读取当前时间
		                      Frame_Num++; 
			                  Store_Data(InfoData_Buffer,Information_Type,Receive_Data_Num);//存储数据
			              }
				       break;
				 
				  case 2://Column  Error Status
				           
				      for(i=0;i<6;i++)
					  {
					  if(InfoData_Buffer[i+1]!=Column_Error_Status[i])
					      Compare_Counter++;
				       }
				      if (Compare_Counter!=0)
					     {	 
						      for(i=0;i<6;i++)  Column_Error_Status[i]=InfoData_Buffer[i+1];
							 
							  Compare_Counter=0; 		 
				              Read_Time(); //读取当前时间
		                      Frame_Num++; 
			                  Store_Data(InfoData_Buffer,Information_Type,Receive_Data_Num);//存储数据
			              }
				      break;
				   case 3://Goods Status 
                     
					  for(i=0;i<6;i++)
					  {
					  if(InfoData_Buffer[i+1]!=Goods_Status[i])
					      Compare_Counter++;
				      }
				      if (Compare_Counter!=0)
					     {	 
						      for(i=0;i<6;i++)  Goods_Status[i]=InfoData_Buffer[i+1];
							 							  
							  Compare_Counter=0; 		 
				              Read_Time(); //读取当前时间
		                      Frame_Num++; 
			                  Store_Data(InfoData_Buffer,Information_Type,Receive_Data_Num);//存储数据
			              }
				      break;
				    
				
				case 4://Sale Info
				
				        Read_Time(); //读取当前时间
		                Frame_Num++; 
			            Store_Data(InfoData_Buffer,Information_Type,Receive_Data_Num);//存储数据
				
				        break;
				
				
				
				
				
				
					case 5: //Device Info 
				     
					  for(i=0;i<13;i++)
                         {
					       if(InfoData_Buffer[i+1]!=Device_Info[i])
					          Compare_Counter++;
				         }
					  for(i=16;i<28;i++)
                         {
					       if(InfoData_Buffer[i+1]!=Device_Info[i])
					          Compare_Counter++;
				         }
				      if (Compare_Counter!=0)                    //对除温度状态外其它设备信息进行比较
					     {	 
						      for(i=0;i<28;i++)
							    Device_Info[i]=InfoData_Buffer[i+1];
							 		 
							  Compare_Counter=0; 		 
				              Read_Time(); //读取当前时间
		                      Frame_Num++; 
			                  Store_Data(InfoData_Buffer,Information_Type,Receive_Data_Num);//存储数据
			              }
					   else
					     {
						      Compare_Counter = 0;
							  for(i=13;i<16;i++)                  //温度变化超过“6度”则发送该信息;屏蔽最高位
							  {
							  		if(((InfoData_Buffer[i+1] & 0x7F) > Device_Info[i] + 6) || ((InfoData_Buffer[i+1] & 0x7F) + 6 < Device_Info[i]))
										Compare_Counter ++;
							  }
							  if (Compare_Counter!=0)
					     	  {	 
						      		for(i=0;i<28;i++)
							    		Device_Info[i]=InfoData_Buffer[i+1] & 0x7F;
							 		 
							  		Compare_Counter=0; 		 
				              		Read_Time(); //读取当前时间
		                      		Frame_Num++; 
			                  		Store_Data(InfoData_Buffer,Information_Type,Receive_Data_Num);//存储数据
			              	   }
						 }	
				       break;
				     
					 default:
					    break;
				 
				 
				 	 }
				 				 
				 
				 
				 
				 

			     } 
			  
			  
			   Receive_Data_Num=0;
     		   ReceiveFlag=0;
		       Deal_Flag=0;
			  }
	             
			  
		    }
		      
	  
	
	 if( Ini_Data_Flag)              //软串口
	  { 
	    Ini_Data_Flag=0;
	    STI=1;
	   	EIE2 |= 0x20;										// Start SW_TX by enabling
	    PRT1IF |= 0x80;
	   }  
	
	 if(Network_Flag==1)
	  {  
	    Network_Flag=0; 
		for(i=0;i<1000;i++) Delay10ms();
	    WDTCN = 0xa5;
	    for(i=0;i<80;i++) Delay10ms();
	   

	  }

	if(Send_EX0_Flag)
	{
      Send_EX0_Flag=0;
	  if(Request_Flag)
	  Send_Request_Frame();//发送初始化故障信息请求帧
	  else
	  Send_Test_Frame();    //发送测试数据帧
      
	  Test_Frame_Num++;
	  if(Test_Frame_Num>50)    //测试帧发送50次无回应,则复位
	    { 
		  Network_Flag=1; 
		  EX0=0;  
		  Test_Frame_Num=0;
	  	}  
   	}
	
	if(Send_EX1_Flag){
		Send_EX1_Flag=0;
		if( GPRS_OK == 1)
		 Send_Data();    //发送未接收回应的数据帧
	     else
          {
		  	counter=0;  //计数器清零
		   	EX1=1;
		  }
	
	}
	if(Ctrl_Complete_Flag)
	{
		Control_Success_For_Ack_Flag=1;
    	Ctrl_Complete_Flag=0;
	  	Send_Ack_Frame();
	}	
 /* if(P1_3==0||P1_4==0||P1_5==0)
  
  {  	
     Network_Flag=1;
   
   }	
*/
	
  }
}


//------------------------------------------------------------------------------------
// Functions
//------------------------------------------------------------------------------------

//   

void ProtectCode(void)
{
	unsigned char xdata *pwrite;
	unsigned char code  *pread;
	unsigned char temp1=0,temp2=0;
	EA = 0;
	pread = 0xFDFF;
	pwrite = 0xFDFF;
	temp1 = *pread;
	temp2 = *(pread-1);
	if(*pread == 0xFF) {
		FLSCL = FLSCL | 0x01; // FLWE = 1; 允许FLASH写/擦除操作
		PSCTL = PSCTL | 0x01; // PSWE = 1; 允许FLASH写入
		XBYTE[0xFDFF] = 0x00; // 读锁定
		XBYTE[0xFDFE] = 0; // 写/擦除锁定

		PSCTL = PSCTL & 0xFE; // 禁止FLASH写入
		FLSCL = FLSCL & 0xFE; // 禁止FLASH写/擦除
	}
	EA = 1;
}
 
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  = 0xd0;      //Set UART0 Mode 3 (1 Start Bit ,8 Data Bit ,1 Mode Bit ,1 Stop Bit),the 9th Bit ignored and Enable Receive 
     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 
    // TL1    = 0xc4;        //Set Reload Low Byte   
     SCON1  = 0xf0;      //Set UART1 Mode 3 (1 Start Bit ,8 Data Bit ,1 Mode Bit ,1 Stop Bit),the 9th Bit ignored and Enable Receive 
     SADEN1 |=0xf8;
     SADDR1 =0x78;       
           
     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 &= 0xfe;         //Disable Timer3 Interrupt 
     EIE2 |= 0x01;        //允许定时器3中断 
	 T4CON |= 0x04;            //Start Timer4
     TR2 = 1;            //Start  Timer2
   //  TMR3CN |= 0x04;      //Start  Timer3 
     TMR3CN &=0xFB;         //Stop   Timer3  
}  





//--------------------------------------------------------------------------------------------------------------------------
//--------------------------------------------------------------------------------------------------------------------------

//延时子程序


void Delay10ms()
{
   UINT i;
   for(i=0;i<10000;i++);
} 

//---------------------------------------------------------------------------------------------------------------------------
//---------------------------------------------------------------------------------------------------------------------------

//测试模块是否正常子程序

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();
    AT();
    for(i=0;i<80;i++) Delay10ms();
    TMR3CN |= 0x04; 
    while(!Signal_OK)                                   /* AT+CSQ */
    {
    	for(i=0;i<7;i++)
    	{
      	  SBUF0 = GSMCommand1[i];
      	 // WDTCN = 0xa5;
		  while(TI0==0); TI0 = 0;
      	  while(RI0==0);
      	 // WDTCN = 0xa5;
		  rec[i] = SBUF0;
      	  RI0 = 0;
    	}

    	for(i=7;i<15;i++)                               /* Error state */
    	{
      	  while(RI0==0);
      	 // WDTCN = 0xa5;
		  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);
      	  //  WDTCN = 0xa5;
			rec[i] = SBUF0;
      	    RI0 = 0;
      	  }
       	}
        for(i=8;i<25;i++){
			    // WDTCN = 0xa5;
			if(rec[i] == ':' && rec[i+2] != '9') 
			{
				Signal_OK = 1;
				break;
			}
		                    //WDTCN = 0xa5;
		}
	//	for(i=0;i<80;i++) Delay10ms();		




    }
//	WDTCN = 0xDE;										// disable watchdog timer
//	WDTCN = 0xAD;
 	TMR3CN &=0xFB; 
 	Timer3_Flag=1;
 	counter_timer3=0;
 	Timer3_Counter=0;
}

//--------------------------------------------------------------------------------------------------------------------------------- 
//---------------------------------------------------------------------------------------------------------------------------------

//PPP的FCS校验子程序

UINT pppfcs16(UINT fcs,unsigned char *cp,int len)
{
	while (len--)
        fcs = (fcs >> 8) ^ fcstab[(fcs ^ *cp++) & 0xff];

    return (fcs);
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -