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

📄 qd.c

📁 基于GPRS无线网络和IP协议的数据传输系统 通信模块C51单片机程序
💻 C
📖 第 1 页 / 共 5 页
字号:
                        
					else
						 
						 {
						  Send_Retransmit(); //不做任何操作,相当于NAK 
						  Receive_Data_Num=0;
     					  ReceiveFlag=0;
						  }               //enable to receive the information data again 					  
	                  }    
	  
	  	       		break;
			   case 6:
			      if( Receive_Data_Num==2)
			       {  // SCON1 |= 0x20;   // SM2位置1,只在地址时中断 
					  if (Check_Info_Data(InfoData_Buffer,Receive_Data_Num))        //?????judge if the check_num is right
                      {
					    Rec_Ctrl_Flag=1;
					    if (!Ctrl_Info_Flag){ Deal_Flag=1;  }  
						else
                        {					       
						         
						  switch(Ctrl_Info_Buffer[1])
						   {
						   case 0:
						   case 1:
						   case 2:
						   case 3:
						   case 6:
						   case 7:	   
						        Ctrl_Info_Counter=4;  		   
				                break;   			 
						   case 4:
						  
						   		Ctrl_Info_Counter=5;  		   
				           		break;   			 
						   case 5:
						    	Ctrl_Info_Counter=7; 	 
						   		break;	 
						   default:
						   		break;
						   		
						   }
						   SCON1 &= 0xfd;  //SCON1的TI1标志位清零		 
						   temp=0;
						   for(i=0;i<Ctrl_Info_Counter-1;i++) temp=Ctrl_Info_Buffer[i]+temp;  //求校验和CHK
						   Ctrl_Info_Buffer[Ctrl_Info_Counter-1]=temp;
						   Deal_Flag=1;
						  
						 }
                      }
					  else  
					  {
					  	Send_Retransmit(); //不做任何操作,相当于NAK 
					   }
					  Receive_Data_Num=0;
					  ReceiveFlag=0;               //enable to receive the information data again 					                
                    }
			   		break;
			  
			  default:
		             break;   			      

			  }   
				                                          //end of switch 
				                        			     	
	       }   //end of else          
		// EIE2 |=0x40;    // 打开串口1中断
		 }

	else 					//发送中断处理程序				// If Transmit Complete:
	 {
	   SCON1 &= 0xfd;                      //清TI1标志位
		//  Send_Ack_Flag=1; 
	   if((Ctrl_Info_Flag==1)&&(Rec_Ctrl_Flag == 1))
	    {
		      Send_Ctrl_Info_Counter++;
		      if( Send_Ctrl_Info_Counter>(Ctrl_Info_Counter-1))
			      {
				     Send_Ctrl_Info_Counter=0;
		             //Ctrl_Info_Flag=0;
                      First_Send_Flag=0;
				      Rec_Ctrl_Flag=0;
				      Rec_Ack_Flag=0;//接收回应标志位清零
					  Ack_Timer_Flag=1;
					  Timer3_Counter=0;//定时器3的计数器清零
				      TMR3CN |= 0x04; //启动定时器3,检查20ms之内收到回应    
				   
				   
				   }  
			  else if  (Send_Ctrl_Info_Counter==(Ctrl_Info_Counter-1)) 
					{
					   SCON1 |=  0x08; // TB8置1
					   SBUF1=Ctrl_Info_Buffer[Send_Ctrl_Info_Counter];					// interrupt to service.
                   }
              else
			        {
                        SCON1  &= 0xf7; // TB8置0   
			            SBUF1=Ctrl_Info_Buffer[Send_Ctrl_Info_Counter];
			       }
			 
		}
     }
    EIE2 |=0x40;    // 打开串口1中断

}



//----------------------------------------------------------------------------------------
// 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.
//
//软串口中断服务程序
void USER_ISR(void) interrupt 19 {				// IE7 Interrupt Service Routine

    unsigned char  Rec_Data,i;
	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=0;
            }
                      		 
		 	else
		   		Receive_Ini_Flag=0;   
	   	   
	    }
	   
	 	else if  ( Receive_Ini_Flag==2)
	   	{  
	       	*(Ini_Data_BufferPoint+Ini_Data_Num)=Rec_Data;
	        Ini_Data_Num++;
            if( Ini_Data_Num==27)
			  {  
			  	  Receive_Ini_Flag=0;
	              Ini_Data_Num=0;
				    
				   /*for(i=0;i<4;i++)
				   {
				      if(*(Ini_Data_BufferPoint+i)==0xff)
					     counter3++;
				   }
	               
				   if(counter3>=3)
				      counter3=0; 
				   else
				     {*/
				  for(i=0;i<4;i++)
				   {
				  		Info_Frame1[i+4]=*(Ini_Data_BufferPoint+i);
	              		Info_Frame2[i+4]=*(Ini_Data_BufferPoint+i);
	              		Info_Frame3[i+4]=*(Ini_Data_BufferPoint+i);
			      		Info_Frame4[i+4]=*(Ini_Data_BufferPoint+i);
			      		Info_Frame5[i+4]=*(Ini_Data_BufferPoint+i);  
				  		Test_Frame[i+4]=*(Ini_Data_BufferPoint+i);
					}
			          //}
				   
				   
				   
				  for(i=0;i<4;i++) MDB_DATA_TEMP[i+18]=*(Ini_Data_BufferPoint+i+4);
				 				  
				  for(i=0;i<2;i++) MDB_DATA_TEMP[i+24]=*(Ini_Data_BufferPoint+i+8);
			   
			      Time_Distance[0]=*(Ini_Data_BufferPoint+10);
                  Time_Distance[1]=*(Ini_Data_BufferPoint+11);
			      Distance = Time_Distance[0]*256+Time_Distance[1];
			      
			      for(i=0;i<8;i++) MAC_Key[i]=*(Ini_Data_BufferPoint+12+i);
			       //counter3=0; 
				   /*for(i=0;i<6;i++)
				    {    
				        if(*(Ini_Data_BufferPoint+i+20)==0xff)
				                counter3++;
                    }
				   if(counter3==6)*/	  
				      
				   
				   
				   
				   
				   CS_RTC=0;
			/*	   RegB=0x86;// ???????????????????????????????????????????????????????  //考虑打开RTC日期设置
				   Century=*(Ini_Data_BufferPoint+20);
				   Year = *(Ini_Data_BufferPoint+21);
			       Month = *(Ini_Data_BufferPoint+22);
			       Day   = *(Ini_Data_BufferPoint+23);
				   Hour  = *(Ini_Data_BufferPoint+24);
				   Minute= *(Ini_Data_BufferPoint+25);
				   Second= *(Ini_Data_BufferPoint+26);
			    */  
				   RegB=0x1e;//????????????????????????????????????????????????????????
			       CS_RTC=1;
			       
				   Store_Ini_Data(); 
				   
				   CS_RTC = 1;
				   for(i=0;i<20;i++) Ini_Data_Buffer[i]=XBYTE[IniDataAddress+i]; 	
				   CS_RTC = 0;				   

				   Ini_Data_Flag=1;
				   
			 			   
			   }            
				                        			     	
	          //end of else          
		}
       else 
	    {
		     Receive_Ini_Flag=0;
	         
	    }
	}
	
	
	
	
	else if (STI)
	  {										// If Transmit Complete:
		STI = 0;											// Clear transmit flag.

		if (m<27){                          // If less than 15 characters transmitted:
		 STXBSY = 1;                         // Claim SW_UART Transmitter.
         TDR = *(Ini_Data_BufferPoint+m);
		 m++;									// Increment variable, transmit.
         CCF1 = 1;									// Force module 0 interrupt to initiate TX
      }										         
      else 			
         m=0;
		 Ini_Data_Flag=0;
		// SW_DONE=1;									// Indicate last character transmitted.
	}

//	if (STI|SRI)										// If SRI or STI is set, re-trigger
//		PRT1IF |= 0x80;								// interrupt to service.
}



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

//FLASH初始化子程序

void FLASH_INI(void)
{ 
   unsigned int i,j;
   unsigned char temp; 
   CS_RTC=1;              //Select and Enable Flash Chip,Low Effect
   i=0;  
   Send_Data_Num=0;         //initiate the num of the data sent
   UnSend_Data_Num=0;        //initiate the num of the data unsent
   Data_Total_Num=0;        //initiate the total num of the data frame byte
   for (i=0;i<960;i++)
   {
	   temp=XBYTE[StartAddress+i*64];
   
       if (temp!=0xff)                         //judge if it is effect data frame
    
	   {    
	  	switch(temp)
	  	{
	  		case 0x79:
	    		for(j=0;j<6;j++)
				{ 
		   			Device_Error_Status[j]=XBYTE[StartAddress+i*64+10+j];    
	     		}
	        break;
      
	  		case 0x7a:
	    		for(j=0;j<6;j++)
				{ 
		   			Column_Error_Status[j]=XBYTE[StartAddress+i*64+10+j];    
	     		}
            break;
	 		case 0x7b:
	    		for(j=0;j<6;j++)
				{ 
		   			Goods_Status[j]=XBYTE[StartAddress+i*64+10+j];    
	     		}
          	break;
	 		case 0x7d:
	    		for(j=0;j<28;j++)
				{ 
		   			Device_Info[j]=XBYTE[StartAddress+i*64+10+j];    
	     		}
          	break;
	 		default:
	       		break;
	 	}
	 
	   temp=XBYTE[StartAddress+i*64+63];
	   
	   if (temp!=0xff)                               //the ACK has been received 
	            Send_Data_Num++;           
       else
	            UnSend_Data_Num++;
                                    //the num of data frame increase 1 


	   }			   
       else 

	       break;
	 

     }
     if (i==0)
          Frame_Num=-1;
	 else  
	   Frame_Num=i-1;
	   Data_Total_Num =i*64;                //get the total  num of data frame byte              
       

	   
	   
	 CS_RTC=0;                          //Disable Flash 
     if(Data_Total_Num>=43008)   //总数达到56K字节   
	   {
	     Erase_Flag=1;
		 if(Data_Total_Num>=56320)
		 {
		 	Flash_Full_Flag = 1;
		 }
	   }
}
//
//
//------------------------------------------------------------------------------------------------------- 
//-------------------------------------------------------------------------------------------------------    


//计算MDB数据的校验和

bit Check_Info_Data(unsigned char * point,unsigned char length )

{   unsigned char  i;
     unsigned char temp;
	 temp=0;
     for (i=0;i<length-1;i++)
	   {  
	      temp += *(point+i);      //??????????????????????????
	    } 	  
     if (temp==*(point+length-1))
	    return 1 ;
	 else 
	    return 0;	 
}

  
//--------------------------------------------------------------------------------------------------
//--------------------------------------------------------------------------------------------------
//--------------------------------------------------------------------------------------------------
  
//读取当前时间子程序

void Read_Time(void)
{  
   CS_RTC=0;
   YEAR=Year;
   MONTH=Month;
   DAY=Day;
   HOUR=Hour;
   MINUTE=Minute;
   CS_RTC=1;


}
 
//--------------------------------------------------------------------------------------------------
//--------------------------------------------------------------------------------------------------
//--------------------------------------------------------------------------------------------------


//存储数据到FLASH子程序

void Store_Data(unsigned char *point,unsigned char  type, unsigned char length )
{      
    int i;  
    unsigned char xdata tempbuffer[100],Verify_Counter;
		
  	if(!Flash_Full_Flag)
	{
		switch(type)

	    {
		case 1:                       //identify that it is device error status
		 

			
		while(1)
		{	 
	  		for (i=1;i<length-1;i++)
		  	{
		  		Info_Frame1[i+9]=*(point+i);        
		    } 		
		  	Info_Frame1[2]= (Frame_Num- Frame_Num%256)/256;
		  	Info_Frame1[3]= Frame_Num%256;
		  	Info_Frame1[16]

⌨️ 快捷键说明

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