📄 main.c
字号:
//ewq int3=0;//qqqqqqqqqq
//int2=0; // 设置为红外接收状态
//buf_ptr=(HBUF xdata *)BUF_ADD; // 指针指向接收绶冲首地址
buf_ptr=(HBUF *)BUF_ADD; // 指针指向接收绶冲首地址
ysrxd=240;time=0; // 初始化1分钟标识
while(1)
{
//P1=0xF4;P1=0xF1;
ledstm(0xf7);
if(ysrxd==0){ysrxd=240;time++;} // 12秒没有接收到信息 time标识加1
if(time>=5) break; // 5个12秒(1分钟)退出红外接收程序
//if(RI==0) continue; // 没有接收信息,继续计时
if((rUTRSTAT0&0x1)==0) continue;
//buf_ptr=(HBUF xdata *)BUF_ADD;
buf_ptr=(HBUF *)BUF_ADD;
begin_rev_flag=0;rev_falg_num=0;ysrxd=40;
while(ysrxd) // 开始接收信息包
{
//if(RI==1)
if((rUTRSTAT0&0x1)==1)
{
//cush_char=SBUF;
cush_char=rURXH0;
if(begin_rev_flag)
{
buf_ptr->buf0[++rev_falg_num]=cush_char;
if(cush_char==0xDD) break;
}
else
{
if(cush_char==0xEA)
{
buf_ptr->buf0[rev_falg_num]=cush_char;
begin_rev_flag=1;
}
}
//RI=0;
}
//P1=0xf4; P1=0xff;
//qwe
}
if(rev_falg_num<10){//RI=0;
continue;} // 接收数据超时
if(buf_ptr->buf0[3]!=carr_svr_name[1] ||
buf_ptr->buf0[4]!=carr_svr_name[0]){//RI=0;
continue;}// 非本机指令
info_check=0;
for(cyc_flag=0;cyc_flag<=(7+buf_ptr->buf0[5]);cyc_flag++)
{info_check+=buf_ptr->buf0[cyc_flag];}
if((info_check%0x0100)!=buf_ptr->buf0[cyc_flag++] ||
(info_check/0x0100)!=buf_ptr->buf0[cyc_flag]){//RI=0;
continue;}// 校验出错
ass_flag=buf_ptr->buf0[2];send_num=0;
ledstm(0xe7);
ys(0x01);
ledstm(0xf7);
switch(ass_flag)
{
case 0x01: // <读取集中器设置>--震旦公司增加协议
send_num=readsettings();break;
case 0x02: // 读取集中器时钟
send_num=readclock();break;
case 0x04: // 指定某表号实时抄表(点抄)
send_num=point_excerption();break;
case 0x05: // 设置集中器时钟
send_num=setclock();break;
case 0x06: // 向集中器下载主控程序
send_num=downpro();break;
case 0x07: // 清空集中器抄表数据
send_num=clear_data();break;
case 0x09: // 读取集中器运行主控版本号
send_num=readversion();break;
case 0x0C: // 向集中器下载电表局编号(*)<加载集中器抄表数据>
send_num=loaddata();break;
case 0x0D: // <加载集中器设置>--震旦公司增加协议
send_num=loadsettings();break;
case 0x0E: // 由集中器上装当月抄表数据(*)<抄录实时表底>
send_num=realtime(0x8E);break;
case 0x0F: // 由集中器上装当日抄表数据(*)<抄录实时表底>
send_num=realtime(0x8F);break;
case 0x10: // 集中器复位
send_num=ser_reposition();
ledstm(0xd7);
for(cyc_flag=0;cyc_flag<=send_num;cyc_flag++)
{txdbyte(buf_ptr->buf0[cyc_flag]);}
while(1);break;
case 0x2C: // 向集中器下载电表局编号(*)<加载集中器抄表数据>--有后继帧
send_num=loaddata();break;
default:{//RI=0;
continue;} // 接收非法指令
}
ysrxd=240;time=0; // 初始化1分钟标识
if(send_num==0){//RI=0;
continue;}
ledstm(0xd7);
for(cyc_flag=0;cyc_flag<=send_num;cyc_flag++)
{txdbyte(buf_ptr->buf0[cyc_flag]);}
//RI=0;
}
ledstm(led_data);
// int2=1;
//ewq int3=1; // 设置显示状态//qqqqqqqqqqqqqq
}
// 红外接收==Test==End=====
// 月零抄 冻结
void frozen_all(void)
{
//uint data j,dat_len;
U16 j,dat_len;
//jzq_ptr=(JZQ_HEAD xdata *)JZQ_ADD;
jzq_ptr=(JZQ_HEAD *)JZQ_ADD;
//dat_ptr=(DAT_ITEM xdata *)(JZQ_ADD+DAT_ADD);
dat_ptr=(DAT_ITEM *)(JZQ_ADD+DAT_ADD);
//P1=0xf1;
dat_len=jzq_ptr->meter_num;
for(j=0;j<dat_len;j++,dat_ptr++)
{
dat_ptr->r_base[0]=dat_ptr->s_base[0]; //总
dat_ptr->r_base[1]=dat_ptr->s_base[1];
dat_ptr->r_base[2]=dat_ptr->s_base[2];
dat_ptr->r_base[3]=dat_ptr->s_base[3];
dat_ptr->r_base2[0]=dat_ptr->s_base2[0];
dat_ptr->r_base2[1]=dat_ptr->s_base2[1];
dat_ptr->r_base2[2]=dat_ptr->s_base2[2];
dat_ptr->r_base2[3]=dat_ptr->s_base2[3];
dat_ptr->r_base3[0]=dat_ptr->s_base3[0];
dat_ptr->r_base3[1]=dat_ptr->s_base3[1];
dat_ptr->r_base3[2]=dat_ptr->s_base3[2];
dat_ptr->r_base3[3]=dat_ptr->s_base3[3];
dat_ptr->r_base4[0]=dat_ptr->s_base4[0];
dat_ptr->r_base4[1]=dat_ptr->s_base4[1];
dat_ptr->r_base4[2]=dat_ptr->s_base4[2];
dat_ptr->r_base4[3]=dat_ptr->s_base4[3];
dat_ptr->r_xq[0]=dat_ptr->s_xq[0];
dat_ptr->r_xq[1]=dat_ptr->s_xq[1];
dat_ptr->r_xq[2]=dat_ptr->s_xq[2];
dat_ptr->r_time[0]=dat_ptr->s_time[0];
dat_ptr->r_time[1]=dat_ptr->s_time[1];
dat_ptr->r_time[2]=dat_ptr->s_time[2];
dat_ptr->r_time[3]=dat_ptr->s_time[3];
dat_ptr->r_qdx=dat_ptr->s_qdx;
dat_ptr->r_mon=time_ptr->month;
}
//P1=0xff;
}
// 日零抄 冻结
void frozen_day(void)
{
//uint data j,dat_len;
U16 j,dat_len;
//jzq_ptr=(JZQ_HEAD xdata *)JZQ_ADD;
jzq_ptr=(JZQ_HEAD *)JZQ_ADD;
//dat_ptr=(DAT_ITEM xdata *)(JZQ_ADD+DAT_ADD);
dat_ptr=(DAT_ITEM *)(JZQ_ADD+DAT_ADD);
//P1=0xf1;
dat_len=jzq_ptr->meter_num;
for(j=0;j<dat_len;j++,dat_ptr++)
{
dat_ptr->z_base[0]=dat_ptr->s_base[0]; //总
dat_ptr->z_base[1]=dat_ptr->s_base[1];
dat_ptr->z_base[2]=dat_ptr->s_base[2];
dat_ptr->z_base[3]=dat_ptr->s_base[3];
dat_ptr->z_base2[0]=dat_ptr->s_base2[0];
dat_ptr->z_base2[1]=dat_ptr->s_base2[1];
dat_ptr->z_base2[2]=dat_ptr->s_base2[2];
dat_ptr->z_base2[3]=dat_ptr->s_base2[3];
dat_ptr->z_base3[0]=dat_ptr->s_base3[0];
dat_ptr->z_base3[1]=dat_ptr->s_base3[1];
dat_ptr->z_base3[2]=dat_ptr->s_base3[2];
dat_ptr->z_base3[3]=dat_ptr->s_base3[3];
dat_ptr->z_base4[0]=dat_ptr->s_base4[0];
dat_ptr->z_base4[1]=dat_ptr->s_base4[1];
dat_ptr->z_base4[2]=dat_ptr->s_base4[2];
dat_ptr->z_base4[3]=dat_ptr->s_base4[3];
dat_ptr->z_xq[0]=dat_ptr->s_xq[0];
dat_ptr->z_xq[1]=dat_ptr->s_xq[1];
dat_ptr->z_xq[2]=dat_ptr->s_xq[2];
dat_ptr->z_time[0]=dat_ptr->s_time[0];
dat_ptr->z_time[1]=dat_ptr->s_time[1];
dat_ptr->z_time[2]=dat_ptr->s_time[2];
dat_ptr->z_time[3]=dat_ptr->s_time[3];
dat_ptr->z_qdx=dat_ptr->s_qdx;
dat_ptr->z_mon=time_ptr->day;
}
//P1=0xff;
}
void zbsnd(uchar lensnd,uchar lsnd)//qh 发命令帧
{
//uchar idata j,t;
uchar j,t;
for(j=0;j<3;j++) if(wr_82502('S')) break;
for(j=0;j<3;j++) if(wr_82502('N')) break;
for(j=0;j<3;j++) if(wr_82502('D')) break;
for(j=0;j<3;j++) if(wr_82502(lensnd)) break; // 发长度
for(t=0;t<6;t++)
{for (j=0;j<3;j++) if(wr_82502(0xff)) break;}
for(j=0;j<3;j++) if(wr_82502(0x09)) break;
for(j=0;j<3;j++) if(wr_82502(0xaf)) break;
for(t=0;t<lsnd;t++)
{for(j=0;j<3;j++) if(wr_82502(buf_ptr->buf0[t])) break;}
for(j=0;j<3;j++) if(wr_82502(0)) break;
}
void zbdat(uchar ys)
{
//uchar idata i,j,t,w,sp1;
uchar i,j,t,w,sp1;
//uchar xdata *pl;
uchar *pl;
yszb=ys;
i=0;j=0;
//buf_ptr = (HBUF xdata *)BUF_ADD;
buf_ptr = (HBUF *)BUF_ADD;
//qh 清缓冲区
buf_ptr->buf1[0]=buf_ptr->buf1[1]=buf_ptr->buf1[2]=buf_ptr->buf1[3]=buf_ptr->buf1[4]=0xff;
buf_ptr->buf1[5]=buf_ptr->buf1[6]=buf_ptr->buf1[7]=buf_ptr->buf1[8]=buf_ptr->buf1[9]=0xff;
while (yszb)//qh 判断超时否
{
w=rd_82502();//qh 接收载波信息
if(w=='D')
{buf_ptr->buf1[0]=w; break;}
datrxd=0;
//sp1=P1;P1=0xf4;P1=sp1; // 清狗
//qwe
}
j=1;
if(w=='D')
{
yszb=10; //qh
while(yszb)
{
w=rd_82502();//qh 接收载波信息
if (datrxd==1)
{
datrxd=0;
buf_ptr->buf1[j]=w; j++;
if(j==4) t=buf_ptr->buf1[3];
if(j>4){t--;if(t==0)return;}
}
//sp1=P1;P1=0xf4;P1=sp1; // 清狗
//qwe
}
}
}
// zbtype 接收命令类型
//bit dat_int (uchar zbtype)
U8 dat_int (uchar zbtype)
{
//uint idata cc;
U16 cc;
//uchar sp1,d_type,dsh;
U8 sp1,d_type,dsh;
//uchar xdata *pl;
U8 *pl;
//buf_ptr = (HBUF xdata *)BUF_ADD;
buf_ptr = (HBUF *)BUF_ADD;
if (buf_ptr->buf1[0]=='D' && buf_ptr->buf1[1]=='A' && buf_ptr->buf1[2]=='T')
{ sp1=buf_ptr->buf1[3]; cc=0;
if (sp1>100) goto dat_end; // 长度限制
sp1=sp1-2;
for (d_type=0;d_type<sp1;d_type++)
cc=buf_ptr->buf1[d_type+4]+cc;
sp1=(char)cc; cc=cc>>8; dsh=(char)cc; // 判断累加和
if ((sp1==buf_ptr->buf1[d_type+4])&&(dsh==buf_ptr->buf1[d_type+5]))
goto dat_st;
else goto dat_end;
dat_st:
if (buf_ptr->buf1[4]!=0xbb) goto dat_end; // 集中器号判断
if (buf_ptr->buf1[5]!=0xbb) goto dat_end;
if (buf_ptr->buf1[6]!=0xbb) goto dat_end;
if (buf_ptr->buf1[7]!=0x81) goto dat_end; // 返回命令码 C 判断
cc=comp(c_zb);
//dat_ptr=(DAT_ITEM xdata *)(JZQ_ADD+cc*DAT_ADD) ;
dat_ptr=(DAT_ITEM *)(JZQ_ADD+cc*DAT_ADD) ;
if (dat_ptr->s_no[0]!=buf_ptr->buf1[11]) goto dat_end1; // 表号判断
if (dat_ptr->s_no[1]!=buf_ptr->buf1[12]) goto dat_end1;
if (dat_ptr->s_no[2]==buf_ptr->buf1[13])
{ if ((buf_ptr->buf1[9]>=0x10)&&(buf_ptr->buf1[9]<=0x1f))
goto dat_r;
dat_r:
//pl=0x1fff; sp1=P1; P1=0xf6; *pl=led_data&0xef; P1=sp1; // 置显示锁存状态
ledstm(led_data&0xef);
if (( (rUTRSTAT0&0x01) == 1 ))//||(int3==0))
{ //pl=0x1fff; sp1=P1; P1=0xf6; *pl=led_data; P1=sp1;
ledstm(led_data);
return(0); } // 置显示锁存状态
d_type=dat_ptr->d_type;
//time_ptr = (TIME xdata *)TIME_ADD;
time_ptr = (TIME *)TIME_ADD;
if (zbtype==1) goto zbs1; // 抄当前总电能
if (zbtype==2) goto zbs2; // 抄昨日总电能
if (zbtype==3) goto zbs3; // 抄上月有总电能
if (zbtype==4) goto zbs4; // 抄当前有功最大需量
if (zbtype==5) goto zbs5; // 抄当前有功最大需量发生时间
if (zbtype==6) goto zbs6; // 抄上月有功最大需量
if (zbtype==7) goto zbs7; // 抄上月有功最大需量发生时间
if (zbtype==8) goto zbs8; // 抄昨日有功最大需量
if (zbtype==9) goto zbs9; // 抄昨日有功最大需量发生时间
goto zbend;
zbs1:
dat_ptr->s_qdx=buf_ptr->buf1[14];
dat_ptr->s_base[0]=buf_ptr->buf1[15]; // 当前总电能
dat_ptr->s_base[1]=buf_ptr->buf1[16];
dat_ptr->s_base[2]=buf_ptr->buf1[17];
dat_ptr->s_base[3]=buf_ptr->buf1[18];
if ((d_type&0x0f)==0) goto zbs11; // 单费率表 不抄峰平谷
if (buf_ptr->buf1[9]!=0x1f)
{ dat_ptr->s_base2[0]=0; // 峰有功
dat_ptr->s_base2[1]=0;
dat_ptr->s_base2[2]=0;
dat_ptr->s_base2[3]=0;
dat_ptr->s_base3[0]=0; // 平有功
dat_ptr->s_base3[1]=0;
dat_ptr->s_base3[2]=0;
dat_ptr->s_base3[3]=0;
dat_ptr->s_base4[0]=0; // 谷有功
dat_ptr->s_base4[1]=0;
dat_ptr->s_base4[2]=0;
dat_ptr->s_base4[3]=0;
goto zbs11 ; // 返回的数据为单费率型式
}
dat_ptr->s_base2[0]=buf_ptr->buf1[19]; // 峰有功
dat_ptr->s_base2[1]=buf_ptr->buf1[20];
dat_ptr->s_base2[2]=buf_ptr->buf1[21];
dat_ptr->s_base2[3]=buf_ptr->buf1[22];
dat_ptr->s_base3[0]=buf_ptr->buf1[23]; // 平有功
dat_ptr->s_base3[1]=buf_ptr->buf1[24];
dat_ptr->s_base3[2]=buf_ptr->buf1[25];
dat_ptr->s_base3[3]=buf_ptr->buf1[26];
dat_ptr->s_base4[0]=buf_ptr->buf1[27]; // 谷有功
dat_ptr->s_base4[1]=buf_ptr->buf1[28];
dat_ptr->s_base4[2]=buf_ptr->buf1[29];
dat_ptr->s_base4[3]=buf_ptr->buf1[30];
zbs11:
rRTCCON=0x01;
time_ptr->min =rBCDMIN; time_ptr->hour =rBCDHOUR;
time_ptr->day =rBCDDAY; time_ptr->month=rBCDMON; // 读时钟
rRTCCON=0x00;
dat_ptr->c_mon =time_ptr->month;
dat_ptr->c_day =time_ptr->day;
dat_ptr->c_hour=time_ptr->hour;
dat_ptr->c_min =time_ptr->min;
goto zbs12;
zbs2:
dat_ptr->z_qdx=buf_ptr->buf1[14];
dat_ptr->z_base[0]=buf_ptr->buf1[15]; // 日冻结总电能
dat_ptr->z_base[1]=buf_ptr->buf1[16];
dat_ptr->z_base[2]=buf_ptr->buf1[17];
dat_ptr->z_base[3]=buf_ptr->buf1[18];
if ((d_type&0x0f)==0) goto zbs21; // 单费率表 不抄峰平谷
if (buf_ptr->buf1[9]!=0x1f)
{ dat_ptr->z_base2[0]=0; // 日冻峰有功
dat_ptr->z_base2[1]=0;
dat_ptr->z_base2[2]=0;
dat_ptr->z_base2[3]=0;
dat_ptr->z_base3[0]=0; // 日冻平有功
dat_ptr->z_base3[1]=0;
dat_ptr->z_base3[2]=0;
dat_ptr->z_base3[3]=0;
dat_ptr->z_base4[0]=0; // 日冻谷有功
dat_ptr->z_base4[1]=0;
dat_ptr->z_base4[2]=0;
dat_ptr->z_base4[3]=0;
goto zbs21 ; // 返回的数据为单费率型式
}
dat_ptr->z_base2[0]=buf_ptr->buf1[19]; // 日冻峰有功
dat_ptr->z_base2[1]=buf_ptr->buf1[20];
dat_ptr->z_base2[2]=buf_ptr->buf1[21];
dat_ptr->z_base2[3]=buf_ptr->buf1[22];
dat_ptr->z_base3[0]=buf_ptr->buf1[23]; // 日冻平有功
dat_ptr->z_base3[1]=buf_ptr->buf1[24];
dat_ptr->z_base3[2]=buf_ptr->buf1[25];
dat_ptr->z_base3[3]=buf_ptr->buf1[26];
dat_ptr->z_base4[0]=buf_ptr->buf1[27]; // 日冻谷有功
dat_ptr->z_base4[1]=buf_ptr->buf1[28];
dat_ptr->z_base4[2]=buf_ptr->buf1[29];
dat_ptr->z_base4[3]=buf_ptr->buf1[30];
zbs21:
dat_ptr->z_mon=dat_ptr->z_tt=rBCDDAY;
goto zbs12;
zbs3:
dat_ptr->r_qdx=buf_ptr->buf1[14];
dat_ptr->r_base[0]=buf_ptr->buf1[15]; // 月冻结总电能
dat_ptr->r_base[1]=buf_ptr->buf1[16];
dat_ptr->r_base[2]=buf_ptr->buf1[17];
dat_ptr->r_base[3]=buf_ptr->buf1[18];
if ((d_type&0x0f)==0) goto zbs31; // 单费率表 不抄峰平谷
if (buf_ptr->buf1[9]!=0x1f)
{ dat_ptr->r_base2[0]=0; // 月冻峰有功
dat_ptr->r_base2[1]=0;
dat_ptr->r_base2[2]=0;
dat_ptr->r_base2[3]=0;
dat_ptr->r_base3[0]=0; // 月冻平有功
dat_ptr->r_base3[1]=0;
dat_ptr->r_base3[2]=0;
dat_ptr->r_base3[3]=0;
dat_ptr->r_base4[0]=0; // 月冻谷有功
dat_ptr->r_base4[1]=0;
dat_ptr->r_base4[2]=0;
dat_ptr->r_base4[3]=0;
goto zbs31 ; // 返回的数据为单费率型式
}
dat_ptr->r_base2[0]=buf_ptr->buf1[19]; // 月冻峰有功
dat_ptr->r_base2[1]=buf_ptr->buf1[20];
dat_ptr->r_base2[2]=buf_ptr->buf1[21];
dat_ptr->r_base2[3]=buf_ptr->buf1[22];
dat_ptr->r_base3[0]=buf_ptr->buf1[23];
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -