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

📄 main12.c

📁 透明传输的DTU。实现配置:microchip 18F6520,协议DL/T645。 全部C源码文件。
💻 C
📖 第 1 页 / 共 5 页
字号:
//	delay4ms();

	EN485 = EnReceive;
	TXSTA1bits.TXEN = 0;				//发送禁止
	RCSTA1bits.CREN = 1;				//接收数据允许
	RCSTA1bits.FERR = 0;
	PIE1bits.TMR1IE = 1;				//打开定时中断
}

void ReturnDataToHander(unsigned char num)
{
	PIE1bits.TMR1IE = 0;			//关闭定时中断
	INTCONbits.INT0IE = 0;	//红外接收IrRXD放在RB0
	IrRX_CTRL = OUTPUT;
	
	
   	for(k = 0;k < num;k++)
//   	for(k = 0;k < 255;k++)
   	{	
		temp1 = BUF_METER[k];
		GenParity(temp1);
		if(parity == 1)
	  	  IrTX9D = 1;
		else
	  	  IrTX9D = 0;
	  	Ir_ByteToSend = temp1;
		SendByte();	
		delay10ms();
		delay10ms();
	}	
	PIE1bits.TMR1IE = 1;				//打开定时中断
	INTCONbits.INT0IF = 0;
	INTCONbits.INT0IE=1;	//红外接收IrRXD放在RB0
	IrRX_CTRL = INPUT;
}

void GenParity(unsigned char DataWillSend)
{
  unsigned char gp,tt;
  	gp = DataWillSend;
	parity = 0;

	tt = gp & 0x01;
	if(tt != 0)
	  parity ^=0x01;
	tt = gp & 0x02;
	if(tt != 0)
	  parity ^=0x01;
	tt = gp & 0x04;
	if(tt != 0)
	  parity ^=0x01;
	tt = gp & 0x08;
	if(tt != 0)
	  parity ^=0x01;
	tt = gp & 0x10;
	if(tt != 0)
	  parity ^=0x01;
	tt = gp & 0x20;
	if(tt != 0)
	  parity ^=0x01;
	tt = gp & 0x40;
	if(tt != 0)
	  parity ^=0x01;
	tt = gp & 0x80;
	if(tt != 0)
	  parity ^=0x01;
}

void CHECKSUM(void)
{
	unsigned int CXOR = 0;
	for(k=0;k<10+BUF_METER[12];k++)
	{
		CXOR = CXOR + BUF_METER[3+k];
	}
	BUF_METER[3+10+BUF_METER[12]] = (unsigned char)CXOR;
	BUF_METER[3+10+BUF_METER[12]+1] = 0x16;
}
void YC_CHECKSUM(void)
{
	unsigned int CXOR = 0;
	for(k=0;k<10+YC_CMD_BUF[12];k++)
	{
		CXOR = CXOR + YC_CMD_BUF[3+k];
	}
	YC_CMD_BUF[3+10+YC_CMD_BUF[12]] = (unsigned char)CXOR;
	YC_CMD_BUF[3+10+YC_CMD_BUF[12]+1] = 0x16;
}

void TT_CHECKSUM(void)
{
	unsigned int CXOR = 0;
	for(k=0;k<10;k++)
	{
		CXOR = CXOR + TranToMS[k];	//没有前导符0xFE
	}
	TranToMS[10] = (unsigned char)CXOR;
	TranToMS[11] = 0x16;
}

void SMS_CHECKSUM(void)
{
	unsigned int CXOR = 0;
	for(k=0;k<10+SMS_CMD_BUF[12];k++)
	{
		CXOR = CXOR + SMS_CMD_BUF[3+k];
	}
	SMS_CMD_BUF[3+10+SMS_CMD_BUF[12]] = (unsigned char)CXOR;
	SMS_CMD_BUF[3+10+SMS_CMD_BUF[12]+1] = 0x16;
}

void PWRKeyOn(void)
{
	PowerKey = HIGH;
	PassSeconds(2);
	PowerKey = LOW;			//power down
	PassSeconds(1);

	PassSeconds(5);
	LoadCMD_AT();
	SendToModule (3);

	PassSeconds(40);		//等待CALL READY
  	ModulFlags.Bit.EchoModule = 0;
   	ModulFlags.Bit.RecvEcho = 0;
	ClearGPRSREG();
	Nop();
	for (k = 0; k < 32; k++)	//清除字节的接收区
	{
		RecvFromMS[k] = 0;
	}
	Nop();
}
void PWRKeyOff(void)
{
	PowerKey = HIGH;
	PassSeconds(1);
	PowerKey = LOW;			//power down
	PassSeconds(10);

  	ModulFlags.Bit.EchoModule = 0;
   	ModulFlags.Bit.RecvEcho = 0;
	ClearGPRSREG();
	Nop();
	for (k = 0; k < 32; k++)	//清除字节的接收区
	{
		RecvFromMS[k] = 0;
	}
	Nop();
}
void PowerOnModule(void)
{
	SHANGDIAN = HIGH;
	PassSeconds(1);
}

void PowerOffModule(void)
{
	SHANGDIAN = LOW;
	PassSeconds(10);
}

void W_eeprom(char *pData,unsigned int addr,unsigned char DataLen)
{
  EEADRH = hibyte(addr);
  EEADR = lobyte(addr);
  EECON1bits.EEPGD=0;
  EECON1bits.CFGS=0;
  EECON1bits.WREN=1;
  INTCONbits.GIE = 0; 
	
  for (k = 0; k < DataLen; k++)
  {
	EEDATA=pData[k];
	EECON2=0x55;
	EECON2=0xAA;
	EECON1bits.WR=1;
	while (!PIR2bits.EEIF)
	;
	PIR2bits.EEIF=0;
	EEADR++;
  }
  EECON1bits.WREN = 0;
  INTCONbits.GIE = 1; 
}

void R_eeprom(char *pData,unsigned int addr,unsigned char DataLen)
{
  EEADRH = hibyte(addr);
  EEADR = lobyte(addr);
  EECON1bits.EEPGD=0;	// Point to DATA memory
  EECON1bits.CFGS=0;
  INTCONbits.GIE = 0; 
  for (k = 0; k < DataLen; k++)
  {
  	EECON1bits.RD=1;
	temp1 = EEDATA;
	pData[k] = temp1;
	EEADR++;
  }
  INTCONbits.GIE = 1; 
}

void Proc_signalled(void)
{
	LampDelay++;
	switch(SigQua)
	{
		case 1:
			if(bitFL==0)
				{
					if(LampDelay==10)
						{
							bitFL=1;
							LampDelay=0;
							SignalLed=CLOSE;
						}
					else 
						SignalLed=LIGHT;
				}
			else
				{
					if(LampDelay==30)
						{
							bitFL=0;
							LampDelay=0;
							SignalLed=LIGHT;
						}
					else
						SignalLed=CLOSE;
				}
			break;
		case 2:
			if(bitFL==0)
				{
					if(LampDelay==20)
						{
							bitFL=1;
							LampDelay=0;
							SignalLed=CLOSE;
						}
					else 
						SignalLed=LIGHT;
				}
			else
				{
					if(LampDelay==20)
						{
							bitFL=0;
							LampDelay=0;
							SignalLed=LIGHT;
						}
					else
						SignalLed=CLOSE;
				}
			break;
		case 3:
			if(bitFL==0)
				{
					if(LampDelay==30)
						{
							bitFL=1;
							LampDelay=0;
							SignalLed=CLOSE;
						}
					else 
						SignalLed=LIGHT;
				}
			else
				{
					if(LampDelay==10)
						{
							bitFL=0;
							LampDelay=0;
							SignalLed=LIGHT;
						}
					else
						SignalLed=CLOSE;
				}
			break;
		case 4:
			SignalLed=LIGHT;
			LampDelay=0;
			break;
		default:  
			SignalLed=CLOSE;
			LampDelay=0;
			break;
	}
}


void Proc_TimerOver(void)
{
	unsigned int tOT1;
	OtherFlags.Bit.TimerOver = 0;

	cMinute++;
  	temp2 = lobyte(cMinute);
  	if(hibyte(cMinute) >= hibyte(t1use))	//整数只比较高字节!,BUG!
  	{
	  if(temp2 > lobyte(t1use))
	  {
		cMinute = 0; 
		Proc_min();
	  }
  	}

  	if(ByteReceived >0)
  	{
  		OverTimeMeter++;
	    tOT1 = FiveSeconds;			//等待FiveSeconds秒
//	   	if(OverTimeMeter >= tOT1) 		
	   	if(OverTimeMeter >= 100) 	//5秒(一次中断50ms)	
	   	{
			ClearMeterREG();
	   	}
  	}
  	if(ByteRecvUART2 >0)
  	{
  		OverTimeGPRS++;
//	    tOT1 = FiveSeconds;		//等待FiveSeconds秒
//	   	if(OverTimeGPRS >600) 	//30秒(一次中断50ms)
	   	if(OverTimeGPRS >300) 	//15秒(一次中断50ms)
	   	{
			ClearGPRSREG();
	   	}
  	}
    Proc_signalled();     //庄,信号强度灯处理
}

void Proc_min(void)
{
  	MinCounter++;
  	Minute++;
  	temp1 = Minute & 0x0F;
  	if(temp1 == 0x0A)
  	{
  		Minute += 0x06;			//convert to BCD code
		if(Minute >= 0x60)		//到60分
		{
			Minute = 0;
			ReadTime();
//看看是否到0点0分开始抄电表数据
//----------------------------------------------

//----------------------------------------------
		}
  	}
	if(OtherFlags.Bit.TCPLink == 0x01)
	{//已连接上
		if(MinCounter >= BT)
			SendBeatPack();

	/*	OnLineTime++;
		if(OnLineTime>10)
		{
			OnLineTime = 0;
			OtherFlags.Bit.TCPLink = 0;
			OnlineLed = HIGH;			//关闭在线灯
		//	SignalLed = HIGH;			//关闭信号强度灯
			ModulFlags.ModuleBYTE = 0;
			Close_Shut();
			Nop();
		}*/
		
	}
//  	if(Minute >= 0x56 && OtherFlags.Bit.TCPLink == 0x00)	//57分,58分,59分请求连接三次
//	temp1 = Minute & 0x0F;	//每10,20,30,40,50,00分钟连一次。
	if(OtherFlags.Bit.TCPLink == 0x00)
	{
		Load_SigQua();  //信号强度灯:庄
		Close_Shut();
		Nop();
		ConnectIP();
	}
}

void DTUNO2Str(void)
{
	for(k=0;k<4;k++)
	{
		temp1 = DTU_Number[k] & 0xF0;
		temp3 = temp1 >>4;
		EnergyDataUCS2[k+k] = temp3 + 0x30;
		temp2 = DTU_Number[k] & 0x0F;
		EnergyDataUCS2[k+k+1] = temp2 + 0x30;
	}
}

void ConvertTime(void)
{  			
  		Text1 = RecvFromMS[16];		//日高位
  		Text2 = RecvFromMS[17];		//日低位
  		temp2 = Text1 - 0x30;
  		temp1 = temp2<<4;

  		temp3 = Text2 - 0x30;
  		Date = temp1 + temp3;

  		Text1 = RecvFromMS[19];		//小时高位
  		Text2 = RecvFromMS[20];		//小时低位
  		temp2 = Text1 - 0x30;
  		temp1 = temp2<<4;

  		temp3 = Text2 - 0x30;
  		Hour = temp1 + temp3;

  		Text1 = RecvFromMS[22];		//分高位
  		Text2 = RecvFromMS[23];		//分低位
  		temp2 = Text1 - 0x30;
  		temp1 = temp2<<4;

  		temp3 = Text2 - 0x30;
  		Minute = temp1 + temp3;

  		Text1 = RecvFromMS[25];		//秒高位
  		Text2 = RecvFromMS[26];		//秒低位
  		temp2 = Text1 - 0x30;
  		temp1 = temp2<<4;
  		temp3 = Text2 - 0x30;
  		Second = temp1 + temp3;
}

void ReadTime(void)
{
	LoadCMD_CCLK();
	WaitReturn = 2;
	SendToModule (CCLK_SIZE);
	DelaySeconds(5);

	if(ModulFlags.Bit.EchoModule == 1)
	{
		ConvertTime();
	}
	ClearGPRSREG();
}

void Read_IP(void)
{
	EEADRH = 0;
	EEADR = IPAddress;
	EECON1bits.EEPGD = 0;	// Point to DATA memory
	EECON1bits.CFGS = 0;
	LengthIPDNS = 0;
	for (k = 0; k < 16; k++)
	{
		EECON1bits.RD=1;
		temp1 = EEDATA;
		if(temp1 == 0x0D || temp1 == 0x00 || temp1 == 0xFF) break;
		Ip_start_buf2[k] = temp1;
		EEADR++;
		LengthIPDNS++;
	}
	Nop();
}

void Read_APN(void)
{
	TranToMS[0] = _A;
	TranToMS[1] = _T;
	TranToMS[2] = _PLUS;
	TranToMS[3] = _C;
	TranToMS[4] = _S;
	TranToMS[5] = _T;
	TranToMS[6] = _T;
	TranToMS[7] = _EQUAL;
	TranToMS[8] = _QUOTE;

	EEADRH = 0;				//1K空间共有4页:000~3FFH
	EEADR = APNAddr;
	EECON1bits.EEPGD = 0;	// Point to DATA memory
	EECON1bits.CFGS = 0;
	temp2 = 9;				//读出字节计数
	for (k = 0; k < 16; k++)
	{
		EECON1bits.RD=1;
		temp1 = EEDATA;
		if(temp1 == 0x00) break;
		TranToMS[k+9] = temp1;
		EEADR++;
		temp2++;
	}
	TranToMS[temp2] = _QUOTE;
	temp2++;
	TranToMS[temp2] = _COMMA;
	temp2++;
	TranToMS[temp2] = _QUOTE;
	temp2++;
	TranToMS[temp2] = _QUOTE;
	temp2++;
	TranToMS[temp2] = _COMMA;
	temp2++;
	TranToMS[temp2] = _QUOTE;
	temp2++;
	TranToMS[temp2] = _QUOTE;
	temp2++;
	TranToMS[temp2] = _CR;
	temp2++;
}

void ConvertToUCS2(void)
{
	for(tt=0;tt<36;tt++)
	{
		EnergyDataUCS2[tt] = 0x30;
	}
//先转高三个字节
	for(k=3;k>0;k--)
	{
	//字节高四位
		temp1 = EnergyData[k] & 0xF0;
		temp2 = temp1 >> 4;
		temp3 = temp2 + 0x30;

		temp1 = temp3 & 0xF0;
		temp2 = temp1 >> 4;
		tt = (3-k)<<3;
		tt = tt + 2;
		EnergyDataUCS2[tt] = temp2 + 0x30;
		temp1 = temp3 & 0x0F;
		tt = (3-k)<<3;
		tt = tt + 3;
		EnergyDataUCS2[tt] = temp1 + 0x30;
	//字节低四位
		temp1 = EnergyData[k] & 0x0F;
		temp3 = temp1 + 0x30;

		te

⌨️ 快捷键说明

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