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

📄 红外收发成功.c

📁 透明传输的DTU。实现配置:microchip 18F6520,协议DL/T645。 全部C源码文件。
💻 C
📖 第 1 页 / 共 5 页
字号:
	  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_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();
	   	}
  	}
}

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分请求连接三次
	if(OtherFlags.Bit.TCPLink == 0x00)
  	{
		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 == 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;

		temp1 = temp3 & 0xF0;
		temp2 = temp1 >> 4;
		tt = (3-k)<<3;
		tt = tt + 6;
		EnergyDataUCS2[tt] = temp2 + 0x30;
		temp1 = temp3 & 0x0F;
		tt = (3-k)<<3;
		tt = tt + 7;
		EnergyDataUCS2[tt] = temp1 + 0x30;
	}

	//转小数点
		EnergyDataUCS2[26] = 0x32;
		EnergyDataUCS2[27] = 0x45;
		//转小数0.1位
		temp1 = EnergyData[0] & 0xF0;
		temp2 = temp1 >> 4;
		temp3 = temp2 + 0x30;

		temp1 = temp3 & 0xF0;
		temp2 = temp1 >> 4;
		EnergyDataUCS2[30] = temp2 + 0x30;
		temp1 = temp3 & 0x0F;
		EnergyDataUCS2[31] = temp1 + 0x30;
	//转小数0.01位
		temp1 = EnergyData[0] & 0x0F;
		temp3 = temp1 + 0x30;

		temp1 = temp3 & 0xF0;
		temp2 = temp1 >> 4;
		EnergyDataUCS2[34] = temp2 + 0x30;
		temp1 = temp3 & 0x0F;
		EnergyDataUCS2[35] = temp1 + 0x30;
}
void TimeDataToUCS2(void)
{
	for(tt=0;tt<68;tt++)	//(17*4=68)
	{
		SMS_Return[EnergyDataAddr+tt] = 0x30;	//数据转换区全清为30H
	}
//先转高三个字节
	for(k=0;k<17;k++)	//17个字节:05/05/23,14:49:00,字符方式
	{
	//高半字节
		temp1 = RecvFromMS[0x0A + k] & 0xF0;
		temp2 = temp1 >> 4;
		temp3 = temp2 + 0x30;
		tt = k<<2;
		tt = tt + 2;
	//低半字节
		SMS_Return[EnergyDataAddr+tt] = temp3;
		temp1 = RecvFromMS[0x0A + k] & 0x0F;
		tt = k<<2;
		tt = tt + 3;
		SMS_Return[EnergyDataAddr+tt] = temp1 + 0x30;
		k +=1;
//下一字节:
	//高半字节
		temp1 = RecvFromMS[0x0A + k] & 0xF0;
		temp2 = temp1 >> 4;
		temp3 = temp2 + 0x30;
		tt = k<<2;
		tt = tt + 2;
	//低半字节
		SMS_Return[EnergyDataAddr+tt] = temp3;
		temp1 = RecvFromMS[0x0A + k] & 0x0F;
		tt = k<<2;
		tt = tt + 3;
		SMS_Return[EnergyDataAddr+tt] = temp1 + 0x30;
		k +=1;
	}
	//转符号
		SMS_Return[EnergyDataAddr+0x0A] = 0x32;
		SMS_Return[EnergyDataAddr+0x0B] = _F;
		SMS_Return[EnergyDataAddr+22] = 0x32;
		SMS_Return[EnergyDataAddr+23] = _F;
		SMS_Return[EnergyDataAddr+34] = 0x32;
		SMS_Return[EnergyDataAddr+35] = _C;
		SMS_Return[EnergyDataAddr+46] = 0x33;
		SMS_Return[EnergyDataAddr+47] = _A;
		SMS_Return[EnergyDataAddr+58] = 0x33;
		SMS_Return[EnergyDataAddr+59] = _A;
}

void SMS_Energy(void)
{
	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;

//计算出UDL...
	//总:---------------------------------------------------
	EnergyDataAddr = UDLAddr+2;
	if(EnergyOfMonth == 0x00)	//取当前电量
	{
		for(tt=0;tt<Energy_Length;tt++)
		{
			SMS_Return[EnergyDataAddr+tt] = TotalE[tt];		//装载 有功总:
		}
	}
	else 	//取上月电量
	{
		for(tt=0;tt<Energy_Length;tt++)
		{
			SMS_Return[EnergyDataAddr+tt] = LMTotalE[tt];		//装载 上月总:
		}
	}
	for(tt=0;tt<5;tt++)	//找到第一个68H,定位帧头
	{
		if(BUF_METER[tt] == 0x68)
			break;
	}
	TotalE_Addr = tt + 0x0C;
	EnergyData[0] = BUF_METER[TotalE_Addr] - 0x33;
	EnergyData[1] = BUF_METER[TotalE_Addr+1] - 0x33;
	EnergyData[2] = BUF_METER[TotalE_Addr+2] - 0x33;
	EnergyData[3] = BUF_METER[TotalE_Addr+3] - 0x33;
	ConvertToUCS2();
//填入总电量UCS2数据............
	for(tt=0;tt<PerEnergyDataLength;tt++)
	{
		SMS_Return[EnergyDataAddr+Energy_Length+tt] = EnergyDataUCS2[tt];
	}

	//峰:---------------------------------------------------
	NowPosition = EnergyDataAddr + Energy_Length + PerEnergyDataLength;//=0x54
	for(tt=0;tt<TABChar_Length;tt++)
	{
		SMS_Return[NowPosition+tt] = PeakE[tt];
	}
	PeakE_Addr = TotalE_Addr + 4;
	EnergyData[0] = BUF_METER[PeakE_Addr] - 0x33;
	EnergyData[1] = BU

⌨️ 快捷键说明

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