📄 main12.c
字号:
// 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 + -