📄 pdemo_df.c
字号:
// 定时器0重置
if (TR0!=1) TR0 = 1; // 启动 T0 定时器
// 关显示使能重置
if (LED_LCD!=0) LED_LCD=0;
} // */
/////////////////////////////////
// 一字节串口发送函数
// 入口: 要发送的一字节数据
// 返回: 无
/////////////////////////////////
void txdbyte(uchar dachar) // 单片机串口发送
{
SBUF=dachar;
ystxd=10; // 500毫秒钟发送不成功退出
while(!TI)
{ if(ystxd==0) break;
}
TI=0;
}
//////////////////////////////////////////////
// 载波接收数据包后的处理函数
// 入口: plmrxd=1; pl_buf[]数据存入接收和数据
// 功能: 1。进行数据包的校验和合法性判断
// 2。点亮上传指示灯
// 3。进行数据包的向上转发
// 4。清pl_buf[]
// 返回: 无
//////////////////////////////////////////////
void zb_pro(void)
{ uchar data i;
EIE=0X00; // (A9H 使能INT2中断(EX2=1)
tlamp=0; // 发送指示灯亮
plmrxd=0;
x=0; n=0; // 停止串口接收
txdbyte('D'); txdbyte('A'); txdbyte('T');
r_len1=r_len1+2;
txdbyte(r_len1);
txdbyte(0x09); txdbyte(0xaf);
r_len1=r_len1-2;
for(i=0;i<r_len1;i++)
{ txdbyte(pl_buf[i]);
wdi=0x9a;
}
for(i=0;i<20;i++) pl_buf[i]=0;
tlamp=1; // 发送指示灯灭
EIE=0X01; // (A9H 使能INT2中断(EX2=1)
}
void zb_pro_d(void)
{ uchar data i;
EIE=0X00; // (A9H 使能INT2中断(EX2=1)
tlamp=0; // 发送指示灯亮
plmrxd=0;
x=0; n=0; // 停止串口接收
txdbyte(0XFF);
txdbyte('A'); txdbyte('N'); txdbyte('S');
txdbyte(r_len1);
for(i=0;i<r_len1;i++)
txdbyte(pl_buf[i]);
for(i=0;i<14;i++) pl_buf[i]=0;
tlamp=1; // 发送指示灯灭
EIE=0X01; // (A9H 使能INT2中断(EX2=1)
}
////////////////////////////////////////////////
// 接收及载波转发设置处理函数
// 入口:RI=1
// 功能:接收集中器下发的数据包并做载波转发设置
// 返回:无
////////////////////////////////////////////////
void jzqrxd_pro(void)
{ if(RI) // 有集中器下发命令处理
{ RI=0;
if((x==0)&&(SBUF=='S')) { x=1; n=1; goto qqq;}
if(((x==1)&&(SBUF=='N'))||((x==1)&&(SBUF=='E')))
{ x=2; n=1; goto qqq; }
if(x==1) { x=0; n=0; goto qqq; }
if(((x==2)&&(SBUF=='D'))||((x==2)&&(SBUF=='T')))
{ x=3; n=1; goto qqq; }
if(x==2) { x=0; n=0; goto qqq; }
if(x==3)
{ x=4; ti_len=SBUF; // 接收长度
if ((ti_len==0)||(ti_len>240))
{ x=0; rlamp=1; goto qqq; }
n=0;
rlamp=0; // 接收指示灯亮
goto qqq;
}
if(x==4)
{ r[n]=SBUF; n++; x=5;
goto qqq;
}
if(x==5)
{ r[n]=SBUF; n++;
if (n>=ti_len)
{ x=6; rlamp=1; // 接收指示灯灭
goto qqq;
}
if (n>40) { x=0; rlamp=1; // 接收指示灯灭
goto qqq; }
goto qqq;
}
}
qqq:;
}
void jzqrxd_pro_d(void)
{ if(RI) // 有集中器下发命令处理
{ RI=0;
if((x==0)&&(SBUF=='S')) { x=1; n=1; goto qqq;}
if(((x==1)&&(SBUF=='N'))||((x==1)&&(SBUF=='E')))
{ x=2; n=1; goto qqq; }
if(x==1) { x=0; n=0; goto qqq; }
if(((x==2)&&(SBUF=='D'))||((x==2)&&(SBUF=='T')))
{ x=3; n=1; goto qqq; }
if(x==2) { x=0; n=0; goto qqq; }
if(x==3)
{ x=4; ti_len=SBUF; // 接收长度
if ((ti_len==0)||(ti_len>40))
{ x=0; rlamp=1; goto qqq; }
n=0;
//n=6;
rlamp=0; // 接收指示灯亮
goto qqq;
}
if(x==4)
{ r[n]=SBUF; n++; x=5;
goto qqq;
}
if(x==5)
{ r[n]=SBUF; n++;
//if (n>=ti_len+6)
if (n>=ti_len)
{ x=6; rlamp=1; // 接收指示灯灭
goto qqq;
}
if (n>40) { x=0; rlamp=1; // 接收指示灯灭
goto qqq; }
goto qqq;
}
}
qqq:;
}
/////////////////////////////////////
// 主程序
/////////////////////////////////////
void main(void)
{ uchar data i,j,h;
for(h=0;h<0xff;h++);
d_f=1; d_f_x=0; x_09af=0;
for(i=0;i<3;i++)
{ if(d_f==1)
{ for(h=0;h<0xff;h++);
if(d_f==1) { d_f_x='F'; goto f_led; }
}
else
{ for(h=0;h<0xff;h++);
if(d_f==0)
{ d_f_x='D'; goto d_led; }
}
}
d_f_x='F';
f_led: // 复费率开机显示
for(h=0;h<3;h++)
{ rlamp=0; tlamp=0; // 开机指示灯闪耀 P05
for(j=0;j<255;j++)
{ WDT_RST=0xa1; // 清看门狗
for(i=0;i<0xff;i++);
for(i=0;i<0x80;i++);
}
rlamp=1; tlamp=1;
for(j=0;j<255;j++)
{ WDT_RST=0xa1; // 清看门狗
for(i=0;i<0xff;i++);
for(i=0;i<0x80;i++);
}
}
initsys();
txdbyte('O'); txdbyte('K'); txdbyte('F');
x=0; n=0; plmrxd=0; plmtxd=0; r_x=0;
goto main_lp;
d_led: // 单费率开机显示
rlamp=0; tlamp=0; // 开机指示灯闪耀 P05
for(j=0;j<240;j++)
{ WDT_RST=0xa1; // 清看门狗
for(i=0;i<0xff;i++);
}
rlamp=1; tlamp=1;
initsys();
txdbyte('O'); txdbyte('K'); txdbyte('D');
x=0; n=0; plmrxd=0; plmtxd=0; r_x=0;
main_lp: // 主循环
while(1)
{ d_f=1;
while(1)
{ if(d_f==1)
{ for(h=0;h<0x60;h++);
if(d_f==1)
if(d_f_x=='F') goto f_lp;
}
else
{ for(h=0;h<0x60;h++);
if(d_f==0)
if(d_f_x=='D') goto d_lp;
}
}
f_lp: // 复费率循环
wdi=0x9a; // 清看门狗
initsys_ref(); // 设置重置
txd=1; // 重置串口
rxd=1;
if(plmrxd)
zb_pro(); // 载波接收处理
if(RI) // 有集中器串口下发命令判断
jzqrxd_pro(); // 接收及载波转发设置处理函数
if(x==6)
{ // 设置载波发送起始数据
x=7;
ti_len++;
pl_data=r[0]; // 送发送首字节
pl_len=0; // 发送字节计数
pl_8=0; // 发送位计数
plmtxd=1; // 置正在发送标志
plret_l=0; // 清载波复位计数器
// 设置载波发送态
PLM_RST=0xa2; // 复位发送计数器
PLM_RS=1; // 置载波发送态
tlamp=0; // 发送指示灯亮
}
if(x==7)
{ if(plmtxd==0)
x=0; // 判断载波是否发送完; 发送完将 x=0;
}
continue;
d_lp: // 单费率循环
wdi=0x9a; // 清看门狗
initsys_ref(); // 设置重置
txd=1; // 重置串口
rxd=1;
if(plmrxd)
zb_pro_d(); // 载波接收处理
if(RI) // 有集中器串口下发命令判断
jzqrxd_pro_d(); // 接收及载波转发设置处理函数
if(x==6)
{ // 设置载波发送起始数据
x=7;
pl_data=r[0]; // 送发送首字节
pl_len=0; // 发送字节计数
pl_8=0; // 发送位计数
plmtxd=1; // 置正在发送标志
// 设置载波发送态
PLM_RST=0xa2; // 复位发送计数器
PLM_RS=1; // 置载波发送态
tlamp=0; // 发送指示灯亮
}
if(x==7)
{ if(plmtxd==0)
x=0; // 判断载波是否发送完; 发送完将 x=0;
}
}
}
//
//}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -