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

📄 main12.c

📁 透明传输的DTU。实现配置:microchip 18F6520,协议DL/T645。 全部C源码文件。
💻 C
📖 第 1 页 / 共 5 页
字号:
  			{
				ModulFlags.Bit.EchoModule = 0 ;
//RecvFromMS[0x0A + j]:05/05/23,14:49:00
				NOAddr = SMS_Start + 0x18;
				for(tt=0;tt<Address_Length;tt++)
				{
					//对方号码
					SMS_Return[tt] = RecvFromMS[NOAddr+tt];
				}
				for(tt=0;tt<SMS_Header2_SIZE;tt++)
				{
					SMS_Return[Address_Length+tt] = SMS_Header2[tt];
				}
				UDLAddr = Address_Length+SMS_Header2_SIZE;
// -----  格式转换
				EnergyDataAddr = UDLAddr+2;
				TimeDataToUCS2();
				UDLLength = 34;	//17*2
//结束符
  				AllLength = EnergyDataAddr + UDLLength * 2;
  				SMS_Return[AllLength] = _CTRLZ;
				SendSMS();
  			}
			WaitReturn = 0;
		}
	}//END of if(TP_UDL == 1)	
	
// ******************************************************************************
	else if(TP_UDL >= 0x0D)
	{
		for(k=0;k<DNE_SIZE;k++)
		{//取出对方手机号码
			SMS_Return[k] = RecvFromMS[DataAddr + k];	
		}
		if(strncmppgm2ram((char *)SMS_Return,(const far rom char *)IPAddressEqual,IP_SIZE) == 0)		
		{//设置IP地址
			TP_UDL -=3;					//总长度中减去 地址= 这三个字符
			Text1 = 0;					//IP地址长度初始化为0
//
			for(k=0;k<TP_UDL;k++)
			{
	  			temp1 = RecvFromMS[(DataAddr+12)+k*4+2];
	  			temp2 = RecvFromMS[(DataAddr+12)+k*4+3];
	  			if(temp1 == '2' && temp2 == 'E')
		  		{
					temp3 = '.' ;
				}
	  			else if(isdigit(temp1) && isdigit(temp2))
	  			{
					temp1 -=0x30;						
					temp2 -=0x30;						
					Text3 = temp1 <<4;
					temp3 = Text3 + temp2;
  				}
  				else
  					return;
	  			Ip_start_buf2[k] = temp3;
				Text1 += 1;
			}//END for
			Ip_start_buf2[k] = 0x0D;		//写入EEPROM前置结束符
			W_eeprom((char *)Ip_start_buf2,IPAddress,(Text1+1));
			OK_Data();
			SendSMS();						//发送短信 OK
			OtherFlags.Bit.TCPLink = 0;
			OnlineLed = HIGH;			//关闭在线灯
			Close_Shut();
		}
		else if(strncmppgm2ram((char *)SMS_Return,(const far rom char *)DateTimeEQUAL,DTE_SIZE) == 0)		
		{//设置时间
			TP_UDL -=3;		//总长度中减去 时间= 这三个字符
//
      		SetDateTime();
			k = 0x09;		//destination
			for(j=0;j<TP_UDL;j++)	//12个数字
			{
	  			temp1 = RecvFromMS[(DataAddr+12)+j*4+2];
	  			temp2 = RecvFromMS[(DataAddr+12)+j*4+3];
				Text1 = temp1 - 0x30;
				Text2 = temp2 - 0x30;
				Text3 = Text1 << 4;
				TranToMS[k] = Text3 + Text2;
				k++;
				j++;
	  			temp1 = RecvFromMS[(DataAddr+12)+j*4+2];
	  			temp2 = RecvFromMS[(DataAddr+12)+j*4+3];
				Text1 = temp1 - 0x30;
				Text2 = temp2 - 0x30;
				Text3 = Text1 << 4;
				TranToMS[k] = Text3 + Text2;
				k +=2;
				j++;
			}//END for
  			SendToModule (SetCCLK_SIZE);
			DelaySeconds(2);

  			if(ModulFlags.Bit.EchoModule == 1)
  			{
  	  			cRet = strncmppgm2ram((char *)RecvFromMS,(const far rom char *)OK,L_OK);
  	  			if(cRet == 0)
  	  			{
					OK_Data();
					SendSMS();						//发送短信 OK
					ReadTime();
				}
  			}
			ModulFlags.Bit.EchoModule = 0 ;
  			ByteRecvUART2 = 0;
		}
		else
			return;
	}
	WaitReturn = 0;		//必须加!否则,module主动上报帧会一直等第二个回车
}//END Proc_SMS

void ErrorMSG(void)
{
	LoadCMD_CMGD();
	WaitReturn = 0;
 	SendToModule (CMGR_CMGD_SIZE);
	DelaySeconds(4);
}
//**********************************************************
void LoadCipstartBuf(void)
{
	for(k=0;k<L_start_buf1;k++)	
	{
	  TranToMS[k] = Ip_start_buf1[k];
	}
	for(k=0;k<LengthIPDNS;k++)	
	{
	  TranToMS[k+L_start_buf1] = Ip_start_buf2[k];
	}
//装入端口号	
	TranToMS[LengthIPDNS+L_start_buf1] = _QUOTE;
	TranToMS[LengthIPDNS+L_start_buf1+1] = _COMMA;
	TranToMS[LengthIPDNS+L_start_buf1+2] = _QUOTE;
//  Read PORT NO
	R_eeprom((char *)PortNO,PortAddr,4);
	for(k=0;k<4;k++)	
	{
	  TranToMS[LengthIPDNS+L_start_buf1+3+k] = PortNO[k];
	}
	TranToMS[LengthIPDNS+L_start_buf1+7] = _QUOTE;
	TranToMS[LengthIPDNS+L_start_buf1+8] = _CR;
	
//TranToMS数组数据准备好
	LengthCipstart = L_start_buf1 + LengthIPDNS + 9;
}

//**********************************************************
void InitPeriph(void)
{
//上电腿、电源控制腿方向定义
	SHANGDIAN_CTRL = OUTPUT;
	PowerKey_CTRL = OUTPUT;
//红外腿定义	
	IrTX_CTRL = OUTPUT;
	IrTX = HIGH;
	IrRX_CTRL = INPUT;

//485端口定义	
	EN485 = EnReceive;
	EN485_CTRL = OUTPUT;

	TRIS_TXD2 = OUTPUT;
	TRIS_RXD2 = INPUT;

//LED
	OnlineLed = HIGH;			//关闭在线灯
	OnlineLed_CTRL = OUTPUT;
	//SignalLed = HIGH;			//关闭信号强度灯
	SignalLed_CTRL = OUTPUT;

	CMCON = 0x07;	// Turn off comparators
	ADCON1 = 0x0F; 	// Set PORTF as digital I/O

//编程(设置采集器编号)按键
	KEY_CTRL = INPUT;

//定义跟SPI有关的C口pin3,4,5.
	CS_FRAM = HIGH;			//片选未选择
	CS_FRAM_CTRL = OUTPUT;
	HOLD = HIGH;			//HOLD
	HOLD_CTRL = OUTPUT;

	SSPCON1bits.SSPEN = 0;
	SCK_CTRL = OUTPUT;
	SDI_CTRL = INPUT;
	SD0_CTRL = OUTPUT;
	
	SSPSTAT = 0x80;
	SSPCON1 = 0B00110001;	//spi enable,master,fos/16,idle state high 
	
}

void UART1_setup(void)
{
	/* relates crystal freq to baud rate - see PIC18Fxxx data sheet

	BRGH=1, Fosc=3.6864MHz		BRGH=1, Fosc=4MHz      BRGH=1, Fosc=8MHz    BRGH=1, Fosc=16MHz
	----------------------	  -----------------      -----------------    ------------------
	Baud		SPBRG             Baud		SPBRG          Baud		SPBRG         Baud		SPBRG
	1200		191               1200		207.3          1200		415.7         9600    103
	2400		95                2400		103.2          2400		207.3         19200		51
	4800		47                4800		51.1           4800		103.2         38400   25
	9600		23                9600		25.0           9600		51.1          57600   16
	19200		11                19200		12.0           19200	25.0          115200  8
	38400		5                 38400		5.5            38400	12.0
	57600		3                 57600		3.3            57600	7.7
	115200	        1              	  115200	1  115200	1.2            115200	3.3

	*/
//#define BRGH_VALUE 1:		1200 +0.16 207	这个误差小,准确
//#define BRGH_VALUE 0:		1200 +1.67 51
	#define BAUD1 1200
//	#define BAUD1 9600
//	#define BAUD 38400
	#define SPBRG1_VALUE ((PIC_CLK/(16UL * BAUD1) -1))
	#define BRGH_VALUE 1
//如果 BRGH_VALUE=0 则SPBRG_VALUE= ((PIC_CLK/(64UL * BAUD1) -1))


	TXSTA1bits.TRMT=0;
	TXSTA1bits.BRGH=BRGH_VALUE;	
	TXSTA1bits.SYNC=0;				//asynchronous
	TXSTA1bits.TXEN=0;				//enable the transmitter
	TXSTA1bits.TX9=1;				//发送9位
//	TXSTA1bits.TX9=0;				//发送8位
//	TXSTA1bits.CSRC=1;				//异步方式don't care

	SPBRG1 = SPBRG1_VALUE;

	RCSTA1bits.OERR=0;				//enable serial port pins
	RCSTA1bits.FERR=0;				//enable serial port pins
	RCSTA1bits.ADDEN=0;				//enable serial port pins
	RCSTA1bits.CREN=1;				//enable reception
//	RCSTA1bits.SREN=0;				//异步方式don't care
	RCSTA1bits.RX9=1;				//接收9位
//	RCSTA1bits.RX9=0;				//接收8位
	RCSTA1bits.SPEN=1;				//Serial Port Enable bit
	
}

void UART2_setup(void)
{
	/* relates crystal freq to baud rate - see PIC18Fxxx data sheet

	BRGH=1, Fosc=3.6864MHz		BRGH=1, Fosc=4MHz      BRGH=1, Fosc=8MHz    BRGH=1, Fosc=16MHz
	----------------------	  -----------------      -----------------    ------------------
	Baud		SPBRG             Baud		SPBRG          Baud		SPBRG         Baud		SPBRG
	1200		191               1200		207.3          1200		415.7         9600    103
	2400		95                2400		103.2          2400		207.3         19200		51
	4800		47                4800		51.1           4800		103.2         38400   25
	9600		23                9600		25.0           9600		51.1          57600   16
	19200		11                19200		12.0           19200	25.0          115200  8
	38400		5                 38400		5.5            38400	12.0
	57600		3                 57600		3.3            57600	7.7
	115200	        1              	  115200	1.2            115200	3.3

	*/

//	#define BAUD1 1200
	#define BAUD2 9600
	#define BRGH_VALUE2 1
	#define SPBRG2_VALUE ((PIC_CLK/(16UL * BAUD2) -1))

	TXSTA2bits.TX9D=0;	//无奇偶校验位
	TXSTA2bits.TRMT=0;	//Transmit Shift Register Status bit
	TXSTA2bits.BRGH=BRGH_VALUE2;	
	TXSTA2bits.SYNC=0;						
	TXSTA2bits.TXEN=0;						
	TXSTA2bits.TX9=0;	//发送8位
//	TXSTA2bits.CSRC=1;						

	SPBRG2 = SPBRG2_VALUE;

	RCSTA2bits.RX9D=0;	//无奇偶校验位				
	RCSTA2bits.OERR=0;						
	RCSTA2bits.FERR=0;						
	RCSTA2bits.ADDEN=0;						
	RCSTA2bits.CREN=1;	//Continuous Receive Enable bit		
//	RCSTA2bits.SREN=0;						
	RCSTA2bits.RX9=0;	//接收8位
	RCSTA2bits.SPEN=1;	//Serial Port Enable bit		
}

void LoadCMD_AT(void)
{
	TranToMS[0] = _A;	
	TranToMS[1] = _T;	
	TranToMS[2] = _CR;
}

void LoadCMD_CSCS(void)
{
	for(k=0;k<AT_CSCS_SIZE;k++)	
	{
		TranToMS[k] = AT_CSCS_buf[k];
	}
}

void LoadCMD_CIPSPRT(void)
{
	for(k=0;k<CIPSPRT_SIZE;k++)	
	{
		TranToMS[k] = Ip_CIPSPRT_buf[k];
	}
}

void LoadCMD_CREG(void)
{
	for(k=0;k<CREG_SIZE;k++)	
	{
		TranToMS[k] = Ip_CREG_buf[k];
	}
}

void LoadCMD_CREGAsk(void)
{
	for(k=0;k<CREG_ASK_SIZE;k++)	
	{
		TranToMS[k] = CREG_ASK_buf[k];
	}
}

void LoadCMD_CCLK(void)
{
	for(k=0;k<CCLK_SIZE;k++)	
	{
		TranToMS[k] = Ip_CCLK_buf[k];
	}
}

void LoadCMD_CIPHEAD(void)
{
	for(k=0;k<CIPHEAD_SIZE;k++)	
	{
		TranToMS[k] = Ip_CIPHEAD_buf[k];
	}
}

void LoadCMD_CIPSTATUS(void)
{
	for(k=0;k<CIPSTATUS_SIZE;k++)	
	{
		TranToMS[k] = AT_CIPSTATUS[k];
	}
}

void LoadCMD_ATE0(void)
{
	for(k=0;k<ATE0_SIZE;k++)	
	{
		TranToMS[k] = CMD_ATE0[k];
	}
}

void LoadCMD_CIICR(void)
{
	TranToMS[0] = _A;
	TranToMS[1] = _T;
	TranToMS[2] = _PLUS;
	TranToMS[3] = _C;
	TranToMS[4] = _I;
	TranToMS[5] = _I;
	TranToMS[6] = _C;
	TranToMS[7] = _R;
	TranToMS[8] = _CR;		
}

void LoadCMD_CIFSR(void)
{
	TranToMS[0] = _A;
	TranToMS[1] = _T;
	TranToMS[2] = _PLUS;
	TranToMS[3] = _C;
	TranToMS[4] = _I;
	TranToMS[5] = _F;
	TranToMS[6] = _S;
	TranToMS[7] = _R;
	TranToMS[8] = _CR;		
}

void LoadCMD_CMGR(void)
{
	TranToMS[0] = _A;
	TranToMS[1] = _T;
	TranToMS[2] = _PLUS;
	TranToMS[3] = _C;
	TranToMS[4] = _M;
	TranToMS[5] = _G;
	TranToMS[6] = _R;
	TranToMS[7] = _EQUAL;
	TranToMS[8] = Index0;
	TranToMS[9] = Index1;
	if(Index1 == _D)
	{
//		SMS_Start = 0x09;		//如果短信的序号是1位数,则CMGR读出的短信头从020FH开始
		CMGR_CMGD_SIZE = 10;	
	}
	else
	{
		TranToMS[10] = _CR;		
		CMGR_CMGD_SIZE = 11;
	}
}

void LoadCMD_CMGD(void)
{
	TranToMS[0] = _A;
	TranToMS[1] = _T;
	TranToMS[2] = _PLUS;
	TranToMS[3] = _C;
	TranToMS[4] = _M;
	TranToMS[5] = _G;
	TranToMS[6] = _D;
	TranToMS[7] = _EQUAL;
	TranToMS[8] = Index0;
	TranToMS[9] = Index1;
	if(Index1 == _D)
	{
		CMGR_CMGD_SIZE = 10;
	}
	else
	{
		TranToMS[10] = _CR;
		CMGR_CMGD_SIZE = 11;
	}
}

void LoadCMD_CMGL(void)
{
	TranToMS[0] = _A;
	TranToMS[1] = _T;
	TranToMS[2] = _PLUS;
	TranToMS[3] = _C;
	TranToMS[4] = _M;
	TranToMS[5] = _G;
	TranToMS[6] = _L;
	TranToMS[7] = _EQUAL;
	TranToMS[8] = _0;
	TranToMS[9] = _CR;
}

void LoadCMD_ATO(void)
{
	TranToMS[0] = _A;
	TranToMS[1] = _T;
	TranToMS[2] = _O;
	TranToMS[4] = _CR;
}


void LoadCMD_CIPSEND(void)
{
/* AT+CIPSTART只有在IP_INITIAL、IP_CLOSE、IP_STATUS状态下
才可以进行连接的建立,连接建立成功后的状态为CONNECT OK;
连接失败,则处在失败的状态上。
*/
	for(k=0;k<CIPSEND_SIZE;k++)	
	{
		TranToMS[k] = Ip_send_buf[k];
	}
}

void LoadCMD_CMGS(void)
{
/* AT+CIPSTART只有在IP_INITIAL、IP_CLOSE、IP_STATUS状态下
才可以进行连接的建立,连接建立成功后的状态为CONNECT OK;
连接失败,则处在失败的状态上。
*/
	for(k=0;k<AT_CMGS_SIZE;k++)	
	{
		TranToMS[k] = AT_CMGS_buf[k];
	}
}

void LoadCMD_CIPCLOSE(void)
{
	for(k=0;k<CIPCLOSE_SIZE;k++)	
	{
		TranToMS[k] = Ip_close_buf[k];
	}
}

void LoadCMD_CIPSHUT(void)
{
	for(k=0;k<CIPSHUT_SIZE;k++)	
	{
		TranToMS[k] = Ip_shut_buf[k];
	}
}

void ConfigInt(void)
{
	RCONbits.IPEN = 0;
	PIE1bits.RC1IE=1;		// USART1 receive interrupt enable
	PIE3bits.RC2IE=1;		// USART2 receive interrupt enable
	PIE1bits.TMR1IE=1;
	INTCONbits.PEIE=1;		//Peripheral interrupt enable
	INTCONbits.INT0IE=1;	//红外接收IrRXD放在RB0
	INTCONbits.GIE=1;

	INTCON2bits.INTEDG0=0;	//INT0(RB0)配置为下降沿触发中断
}

void Timer1_setup(void)
{
	TMR1H = hibyte(T1DELAY);
	TMR1L = lobyte(T1DELAY);	
	T1CONbits.T1CKPS0 = 1;
	T1CONbits.T1CKPS1 = 1;		//八分频
	T1CONbits.T1OSCEN = 0;		//不使用内部振荡
	T1CONbits.TMR1CS = 0;		//fOSC/4=TCYC
	T1CONbits.TMR1ON = 1;		//启动TMR1
}

void PWM_setup(void)
{
//PWM Initialization
// 4MHz crystal,实现38.4k调制输出,从RE7(CCP2MX=0)
		PR2 = 0x19;
		CCPR2L = 0x0D;			// Duty Cycle is 50% of PWM Period

		CCP2CONbits.CCP2X = 0;
		CCP2CONbits.CCP2Y = 0;
		CCP2CONbits.CCP2M3 = 1;	//CCP2置为PWM模式
		CCP2CONbits.CCP2M2 = 1;
		CCP2CONbits.CCP2M1 = 0;
		CCP2CONbits.CCP2M0 = 0;
		PWM_CTRL = OUTPUT;

⌨️ 快捷键说明

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