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

📄 qd.c

📁 基于GPRS无线网络和IP协议的数据传输系统 通信模块C51单片机程序
💻 C
📖 第 1 页 / 共 5 页
字号:
//----------------------------------------------------------------------------------------------------------------------------------
//-----------------------------------------------------------------------------------------------------------------------------------

//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连接建立的第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;
        }
	
}

//----------------------------------------------------------------------------------------------------------
//-----------------------------------------------------------------------------------------------------------
//发送断开连接子程序



void EXCH_SEND8()
{
        UINT xdata i,len=14;         
	
        for(i=0;i<len;i++)
        {
          TI0 = 0;
          SBUF0 = EXCHANGE8[i];
          while(TI0==0); TI0 = 0;
        }
	
}

   void EXCH_SEND9()
{
        UINT xdata i,len=12;         
     	Fcs16(EXCHANGE9,len);
       
	    for(i=0;i<len;i++)
        {
          TI0 = 0;
          SBUF0 = EXCHANGE9[i];
          while(TI0==0); TI0 = 0;
        }
	
}




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

//软串口初始化子程序

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.
    m=0;
    
	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
//	EA = 1;												// Globally enable interrupts

}

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

//外部中断1用于定时发送数据

void ReSend_Data1(void)  interrupt 2
{
	
	if  (counter<10)   //以3秒为计时门限,
	    {
		 counter++;
	    // EX1=1;        //允许外部中断1 :方波     
	     }
	else         
       {  
/*	       EX1=0;         //关闭外部中断1; 
       	   if(GPRS_OK == 1)
		   		Send_Data();    //发送未接收回应的数据帧,发送结束打开外部中断1
	       else
          {
		   counter=0;  //计数器清零

		   EX1=1;
		  }   */
		    Send_EX1_Flag=1;
	   }
    
}



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

// 定时发送测试帧子程序 :外部中断0


void TestNetwork(void) interrupt 0 
{
    unsigned char temp;
        
	//	unsigned int i;
	CS_RTC=0;
	temp=RegC; //读时钟芯片的寄存器C,用于中断标志位清0
    CS_RTC=1;
   if(Request_Flag==0)
   { 
	if(Test_counter<Distance)  //30)// //以3秒为计时门限,
	    { 
		  EX0=0;
		  Test_counter++;
	      EX0=1;
		// EX1=1;        //允许外部中断0 :周期性中断     
	     }
	else         
        {    
	      EX0=0;         //关闭外部中断0; 
          Send_EX0_Flag=1; 
		 
	    }
    }
    else
   {
      
    if(Test_counter<10)//'Distance)   //以3秒为计时门限,
	    { 
		  EX0=0;
		  Test_counter++;
	      EX0=1;
		// EX1=1;        //允许外部中断0 :周期性中断     
	     }
	 else         
        {    
	      EX0=0;         //关闭外部中断0; 
          Send_EX0_Flag=1; 
		 
	    }
   }
 
 
}  


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

//定时器3中断服务子程序

void Timer3_Interrupt(void)  interrupt 14
{ 
	unsigned char i;
	TMR3CN &=0x7f;   // Clear TF3
	Timer3_Counter++;
    if(Ack_Timer_Flag==1)
	 {  
	    
	    if(Timer3_Counter>=2)     
	     { Ack_Timer_Flag=0;
		    TMR3CN &=0xFB; //关闭定时器
		    SCON1 |= 0x20;   // SM2位置1,只在地址时中断 
		   if(Rec_Ack_Flag)
            {  Ctrl_Complete_Flag=1;
			   Rec_Ack_Flag=0;
	           Ctrl_Info_Flag=0; //20ms内收到回应
	         }
	     }
	 }
	
	else
	{
	  if(Timer3_Counter >= 300) //Wait 1s 
	  {
		Timer3_Counter = 0;
		if(Timer3_Flag)	  EXCH_SEND4();
	    counter_timer3++;
	    if(Timer3_Flag==1)
	  	{
	  		if(counter_timer3>20)
	      	{ 
	     		counter_timer3=0;
	     		TMR3CN &=0xFB; //关闭定时器
				// if(Timer3_Flag==1)
		 		Network_Flag=1;   //发送C0 21语句20次无响应,则强制复位
			} 	
	
	    }
        else	
	    {  
		    if(counter_timer3>10)     //发送AT+CSQ语句10次无响应,则强制复位
		    {
	    	 	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

⌨️ 快捷键说明

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