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

📄 sl.c

📁 7941916tc35i-SMS_Mcu_Program.rar
💻 C
📖 第 1 页 / 共 5 页
字号:
				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中断
	}

⌨️ 快捷键说明

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