📄 gd485-08.c
字号:
}
else
{
recv[9]=0xc4;
trxPkg();
}
}
else
{
recv[9]=0xc4;
trxPkg();
}
}
}
else if(recv[12]==0xc0)
{
if(recv[11]==0x10) /**日期及星期**/
{
if(KRES_bz)
{
Time.day=BCD2HEX(recv[18]);
Time.month=BCD2HEX(recv[19]);
Time.year=BCD2HEX(recv[20]);
minute_bz=1;
}
recv[9]=0x84;
trxPkg();
}
else if(recv[11]==0x11) /**时间**/
{
if(KRES_bz)
{
IE_bit.ET1=0;
KYREG=0xEA;
SEC=BCD2HEX(recv[17]);
MIN=BCD2HEX(recv[18]);
HOUR=BCD2HEX(recv[19]);
IE_bit.ET1=1;
minute_bz=1;
}
recv[9]=0x84;
trxPkg();
}
else if(recv[11]==0x28)
{ if((recv[13]==0))
readEE(MIMAADD0,4);
else
readEE(MIMAADD,4);
if((EEbuf[1]==recv[14])&&(EEbuf[2]==recv[15])&&(EEbuf[3]==recv[16]))
{
if((recv[17]==0x55)&&(recv[18]==0x33)) //off
{ Db_S_Jdq=0xf1;
EEbuf[0]=Db_S_Jdq;
writeEE(JDQADD,1);
if((PulTime[0]>PulT_ib)&&(PulTime[1]>PulT_ib))
{poweroff();Db_S_Jdq|=0x04;MOTOR_FLAG=0x99;MOTOR_Timer=0;}
else {MOTOR_FLAG=0x0f;} //wait
recv[9]=0x84;
trxPkg();
}
else if((recv[17]==0x66)&&(recv[18]==0x99)) //on
{ EEbuf[0]=0;
writeEE(JDQADD,1);
poweron();
MOTOR_Timer=0;
MOTOR_FLAG=0x99;
Db_S_Jdq=0;
recv[9]=0x84;
trxPkg();
}
else
{
recv[9]=0xc4;
trxPkg();
}
}
else
{
recv[9]=0xc4;
trxPkg();
}
}
else
{
recv[9]=0xc4;
trxPkg();
}
}
else if((recv[12]==0xc1)&&(recv[11]==0x17)) /**chao biao ri**/
{
EEbuf[0]=recv[18];
writeEE(AUTOREADDAYADD,1);
recv[9]=0x84;
trxPkg();
}
else
{
recv[9]=0xc4;
trxPkg();
}
}
break;
case 0x08: /****广播校时***/
if(recv[10]==6)
{ if((Time.year==BCD2HEX(recv[16]))&&(Time.month==BCD2HEX(recv[15]))&&(Time.day==BCD2HEX(recv[14])))
{
ucA=BCD2HEX(recv[13]); //hour 10-24
ucB=BCD2HEX(recv[12]); //minute
if(SetTimeFlag==0)
{
// Time.second=BCD2HEX(recv[11]); // s & 0x7f
IE_bit.ET1=0;
// Time.second=BCD2HEX(recv[11]); // s & 0x7f
ucA=BCD2HEX(recv[11]);
Time.second=(ucA>>1);
Time.minute=BCD2HEX(recv[12]); // m & 0x7f
Time.hour=BCD2HEX(recv[13]); // h & 0x3f
IE_bit.ET1=1;
SetTimeFlag=1;
}
}
else
{TimeErr_bz=1;
}
}
SCON_bit.REN=1;//LCDDATA10|=0x80;
break;
case 0x0a:
{ if(KRES_bz)
{
if((recv[10]==6))
{ ucB=0;
for(ucA=0;ucA<6;ucA++)
{EEbuf[ucA]=recv[ucA+11];
MeterID[ucA]=recv[11+ucA];
recv[2+ucA]=recv[11+ucA];
}
writeEE(YHIDADD,6); //002005005728 fe
// EEbuf[3]=Month;EEbuf[2]=Day;EEbuf[1]=Hour;EEbuf[0]=Minute;
// writeEE(XUL,PROGRAMTIMEADD,4);
recv[9]=0x8a;
trxPkg();
}
}
else {SCON_bit.REN=1;}// LCDDATA10|=0x80;}
}
break;
case 0x0f: //写编程密码
{ if(KRES_bz)
{
{// readEE(CSHU,MIMAADD,4);
// if((EEbuf[0]==recv[11])&& (EEbuf[1]==recv[12])&&(EEbuf[2]==recv[13])&&(EEbuf[3]==recv[14]))
for(ucA=0;ucA<4;ucA++)
{EEbuf[ucA]=recv[ucA+15];
}
// memmove(EEbuf,&recv[15],4);
if(recv[15]==0)
writeEE(MIMAADD0,4);
else if(recv[15]==1)
writeEE(MIMAADD,4);
recv[9]=0x8f;
recv[11]=recv[15];
recv[12]=recv[16];
EEbuf[0]=EEbuf[2];
EEbuf[1]=EEbuf[3];
trxLong=2;
trxPkg();
// else {CREN=1;} //错误码
}
}
else
{ if(recv[15]==0)
readEE(MIMAADD0,4);
else if(recv[15]==1)
readEE(MIMAADD,4);
if((EEbuf[0]==recv[11])&& (EEbuf[1]==recv[12])&&(EEbuf[2]==recv[13])&&(EEbuf[3]==recv[14]))
{if(recv[15]==0)
writeEE(MIMAADD0,4);
else if(recv[15]==1)
writeEE(MIMAADD,4);
recv[9]=0x8f;
recv[11]=recv[15];
recv[12]=recv[16];
EEbuf[0]=EEbuf[2];
EEbuf[1]=EEbuf[3];
trxLong=2;
trxPkg();
}
else {SCON_bit.REN=1;}//LCDDATA10|=0x80;}
}
}
break;
default:
// trxLong=0xfe;
// recv[10]=recv[10]+0xc0;
// trxPkg();
// RCIE=1;
SCON_bit.REN=1;
// LCDDATA10|=0x80;
break;
}
}
/********************************************
** 函数原型: void SIOservice(void); **
** 功 能: 串口接受程序 **
** 接受完整一帧并完成校验码和 **
** 余三码处理,置位接收有效 **
** SIOrecvFlag **
********************************************/
void SIORECV( void )
{
uchar ucA,ucB;
ucA=SBUF;
SCON_bit.RI=0;
if(!StartFlag){
if(ucA!=STX){
return;
}
else {
CheIDFlag=0;SR_P=1;IP_bit.PX1=1;IE_bit.EX1=1;
SRTIME=0;StartFlag=1;SR_STAT=1;
recv[1]=0x68;
return;
}
}
if(!CheIDFlag){
SR_P++;
if(SR_P<8)
{
SRTIME=0;
recv[SR_P]=SBUF;
return;
}
if(SR_P==8)
{ if((recv[2]==0x99)&&(recv[3]==0x99)&&(recv[4]==0x99)&&(recv[5]==0x99)&&(recv[6]==0x99)&&(recv[7]==0x99))
goto MeterIDOK;
for(ucB=0;ucB<6;ucB++)
{
if((recv[2+ucB]!=MeterID[0+ucB])&&(recv[2+ucB]!=0xaa))
{ goto sioend;}
}
MeterIDOK: if(ucA==STX)
{recv[8]=0x68;
StartFlag=1;CheIDFlag=1;SRTIME=0;IP_bit.PX1=0; IE_bit.EX1=0;
return;
}
else{ /* 否则,继续监听 */
goto sioend;
}
}
}
recv[++SR_P]=ucA;
SRTIME=0;
if(SR_P==10)
{ if(recv[10]>MaxL) goto sioend;}
if(SR_P>10)
{
if(SR_P>=recv[10]+12)
{
if(recv[recv[10]+12]==0x16)
{ ucB=0;
for(ucA=1;ucA<=(10+recv[10]);ucA++) { ucB+=recv[ucA]; } /**计算检验和CS**/
if(ucB!=recv[ucA]) { goto sioend;} /** 校验和正确与否 **/
for(ucA=11;ucA<recv[10]+11;ucA++) { recv[ucA]-=0x33; } /**余三码处理**/
StartFlag=0;CheIDFlag=0; SCON_bit.REN=0;
SIOrecvFlag=1;SR_STAT=0;SRTIME=0;
goto siorecvend;
}
else { goto sioend;
}
}
else {
return;
}
}
return;
sioend:
SCON_bit.REN=1;
IE_bit.EX1=0;
IP_bit. PX1=0;
StartFlag=0;CheIDFlag=0;SR_P=0;SR_STAT=0;
return;
siorecvend: RS485Rcv;
}
/********************************************
** 函数原型: void SIOservice(void); **
** 功 能: 串口发送程序 **
** 发送完整一帧并完成校验码和 **
** 余三码处理,置位接收有效 **
** SIOTXFlag **
********************************************/
void SIOTX()
{
uchar ucA,ucB;
SCON_bit.TI=0;
// Delay(2);
if(recv[0]<64)
{
if(trxLong<recv[0])
{
trxLong++;
SCON_bit.TB8=JY(recv[trxLong]);
SBUF=recv[trxLong];
goto sioend1;
}
else //关红外载波和发送中断
{
Delay3ms();
SCON_bit.REN=1;
RS485Rcv;
SIOtrFlag=0;
// LCDDATA10|=0x80;
// SR_STAT=1;
// SRTIME=0;
// INTF=0;
// INTE=1;
goto sioend1;
}
}
else
{
if(trxLong<recv[0])
{
trxLong++;
if(trxLong<31)
{
SCON_bit.TB8=JY(recv[trxLong]);
SBUF=recv[trxLong];
}
else
{
if(ZH_n==18)
{ ZH_n=0;
ZH_x++;
ucA=ZH_x&0x0f;
if(ucA<0x08)
{
if(ZH_x<0xa4)
{
for(ucB=0;ucB<18;ucB++)
{
// EEbuf[ucB]=zhval[ucA*18+ucB];
}
}
else
{ zhtake(ZH_x); }
for(ucB=0;ucB<18;ucB++)
{
recv[13+ucB]=EEbuf[ucB]+0x33;
// recv[13+ucA]+=0x33;
recv[31]+=recv[13+ucB];
}
}
else
{
ZH_n=18;
}
}
SCON_bit.TB8=JY(recv[ZH_n+13]);
SBUF=recv[ZH_n+13];
ZH_n++;
}
goto sioend1;
}
else
{
Delay3ms();
// TXIE=0;
//IRCLK=0;
// CCP2CON=0;
// PR2=0X9c; // 20ms
// TMR2IF=0;
// TMR2IE=1;
// T2CON=0X3E; //128分频,TMR2ON=1;
SCON_bit.REN=1;
RS485Rcv;
SIOtrFlag=0;
// LCDDATA10|=0x80;
// SR_STAT=1;
// SRTIME=0;
// INTF=0;
// INTE=1;
goto sioend1;
}
}
sioend1:
SCON_bit.REN=1;
}
#pragma vector=0x0B
__interrupt void timer0(void)
{
if((TCON_bit.TF0==1)&&(IE_bit.ET0))
{
TCON_bit.TR0=0; // 定时器重新赋值h:217 l:30-----10ms
// TH0=243;
TH0=120;
TL0=0;
TCON_bit.TF0=0;
TCON_bit.TR0=1;
WDT_bz=0;
t2flg=1;
if(SR_STAT)
{
SRTIME++;
if(SRTIME>=12)
{
SR_STAT=0;
StartFlag=0;CheIDFlag=0;SR_P=0;SRTIME=0;
SCON_bit.REN=1;
}
}
T0Timer++;
if(++Xulon>160)
{Xulon=160; PulTime[0]=160;PulTime[1]=160;}
if(T0Timer>=50) // 是否到3秒
{
if(++DisTime>=123) {DisTime=0;S_timeFlag=1;}
T0Timer=0;
}
if(MOTOR_FLAG==0x99) //OFF执行中
{
MOTOR_Timer++;
if(MOTOR_Timer>=8)
{
MOTOR_Timer=0;OUTA=0;OUTB=0;
if((Db_S_Jdq&0xf1)==0xf1)
{Db_S_Jdq|=0x03;MOTOR_FLAG=0x66;OFFRXD=0;}
else
{MOTOR_FLAG=0;Db_S_Jdq=0;}
}
}
}
}
void Write_ADE_SFR(char ByteM, char ByteL, char Register)
{
MDATM = ByteM;
MDATL = ByteL;
MADDPT = 0x80 | Register;
return;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -