📄 zjq_bc.c
字号:
IE=0x82;
if (IP!=2)
IP=2;
if (EIP!=1)
EIP=1; // 外部中断2 为高级中断
if (TR0!=1)
TR0 = 1; // 启动 T0 定时器
if (LED_LCD!=0)
LED_LCD=0; // 关显示使能重置
}
/**************************************************************************************
*
* FUNCTION: txdbyte
*
* DESCRIPTION: 一字节串口发送函数
*
* PARAMETERS:
* in: dachar——要发送的1字节数据
* out: none
*
*
* RETURNED: none
*
*************************************************************************************/
void txdbyte(uchar dachar)
{
SBUF=dachar;
ystxd=10;
// 500毫秒钟发送不成功退出
while(!TI)
{
if(ystxd==0)
break;
}
TI=0;
}
/**************************************************************************************
*
* FUNCTION: ys
*
* DESCRIPTION: 延时程序 ( 延时115us )
*
* PARAMETERS: none
*
*
* RETURNED: none
*
*************************************************************************************/
void ys(void)
{
uchar data i;
i=0;
for (i=0;i<30;i++);
i++;
}
/**************************************************************************************
*
* FUNCTION: zb_pro
*
* DESCRIPTION: 载波接收数据包后的处理函数
* 1. 进行数据包的校验和合法性判断
* 2. 点亮上传指示灯
* 3. 进行数据包的向上转发
* 4. COM_Buf[]
*
* PARAMETERS: in: plmrxd=1 ; COM_Buf[]接收到的数据
* out: none
*
*
* RETURNED: none
*
*************************************************************************************/
void zb_pro(void)
{
uchar data i;
uchar data j;
//uint data K;
uchar data k;
uchar data Len_Receive;
uint data CRC_H;
uint data CRC_L;
uint data CRC_Count;
uint data CRC_Receive;
EIE=0x01; // 打开载波中断
plmrxd=0;
CRC_H=0;
CRC_L=0;
CRC_Count=0;
CRC_Receive=0;
if(D_F_Sign==0)
goto D_FL_DESIGN;
else
goto F_FL_DESIGN;
D_FL_DESIGN:
i=COM_Buf[0]&0x20;
if(i==0) // 下行命令
{
j=COM_Buf[0]&0x18;
k=COM_Buf[0]&0x07;
if(j==0x00) // 设置表底
Len_Receive=14;
else if(j==0x08) // 设置表号
Len_Receive=8;
else if(j==0x10) // 实时抄表
Len_Receive=8+(2*k);
else if(j==0x18) // 冻结抄表
Len_Receive=8+(2*k);
else
return;
}
else
Len_Receive=14; // 上行命令
CRC_H=0x0;
CRC_L=0x0;
for (i=0; i<(Len_Receive-2); i++)
{
CRC_L+=COM_Buf[i];
CRC_H^=COM_Buf[i];
}
CRC_L=CRC_L&0x0FF; // 屏蔽掉高位,只保留低8位
if(COM_Buf[ (Len_Receive-1) ]==CRC_L) // 单费率校验判断
{
if(COM_Buf[ (Len_Receive-2) ]==CRC_H)
goto send_data;
else
return;
}
else
return;
F_FL_DESIGN:
Len_Receive=COM_Buf[4];
Len_Receive+=5;
CRC_Count=0x0;
for (i=0;i<Len_Receive;i++)
{
CRC_Count+=COM_Buf[i];
}
CRC_Receive=COM_Buf[i+1]*256+COM_Buf[i];
if(CRC_Receive==CRC_Count) // 复费率校验判断
{
Len_Receive+=2;
goto send_data;
}
else
return;
send_data:
{ // 向上传送
led=0;
up_ok_txd=0; // 开显示和置向上标志 P35
x=0;
n=0; // 停止串口接收
txdbyte(0XFF);
ys();
txdbyte('D');
ys();
txdbyte('A');
ys();
txdbyte('T');
ys();
txdbyte( Len_Receive );
for(i=0 ; i<Len_Receive ; i++)
{
ys();
txdbyte(COM_Buf[i]);
}
up_ok_txd=1; // 向上标志结束 P35
}
for(i=0;i<60;i++)
COM_Buf[i]=0;
led=1; // P05
}
/**************************************************************************************
*
* FUNCTION: upok_zbpog
*
* DESCRIPTION: 下级数据包向上转发函数
* 1. 进行下级数据包的转发
*
* PARAMETERS: in: up_ok_txd=0
* out: none
*
*
* RETURNED: none
*
*************************************************************************************/
void upok_zbpog(void)
{
if(up_ok_rxd==0) // 下级有数据发送,进行转发 P32
{
x=0;
n=0; // 停止串口接收
up_ok_txd=0; // 置向上传送指示 P35
while(!up_ok_rxd) // P32
{
if(txd_up==0) // 下级数据接收口 P34
up_txd_10=0;
else
up_txd_10=1;
}
up_ok_txd=1; // 清向上传送指示 P35
}
}
/**************************************************************************************
*
* FUNCTION: jzqrxd_pro
*
* DESCRIPTION: 接收及载波转发设置处理函数
* 1. 接收集中器下发的串口数据包并做载波转发设置
*
* PARAMETERS: in: RI=1
* out: none
*
*
* RETURNED: none
*
*************************************************************************************/
void jzqrxd_pro(void)
{
}
/**************************************************************************************
*
* FUNCTION: main
*
* DESCRIPTION: 主程序
*
* PARAMETERS: none
*
* RETURNED: none
*
*************************************************************************************/
void main(void)
{
uchar data i;
uchar data j;
uchar data k;
uchar data h;
D_F_Sign=1;
for(i=0;i<10;i++)
{
WDT_RST=0xa1; // 清看门狗
for(j=0;j<255;j++);
}
if(D_F_Sign==0)
D_LED_DISPLAY();
else
F_LED_DISPLAY();
initsys();
x=0;
n=0;
plmrxd=0;
r_x=0;
YS_SET_DF=0;
while(1)
{
wdi=0x9a;
initsys_ref(); // 设置重置
up_ok_txd=1; // 向上OK发设置 P35
up_ok_rxd=1; // 向上OK收设置接收判断 P32
up_txd_10=1; // 重置串口
rxd_10=1;
txd_up=1;
if(up_ok_rxd==0) // 下级有数据发送,进行转发
upok_zbpog(); // 下级接收数据包向上转发函数
if(plmrxd)
zb_pro(); // 载波接收处理
}
}
/**************************************************************************************
*
* FUNCTION: D_LED_DISPLAY
*
* DESCRIPTION: 单费率程序开机指示
* 指示灯闪烁一次
*
* PARAMETERS: none
*
* RETURNED: none
*
*************************************************************************************/
void D_LED_DISPLAY()
{
uchar data i;
uchar data j;
uchar data k;
led=0; // 开机指示灯P0^5打开
for(i=0;i<4;i++)
{
for(j=0;j<250;j++)
{
WDT_RST=0xa1; // 清看门狗
for(k=0;k<0xff;k++);
}
}
led=1; // 开机指示灯P0^5关闭
for(i=0;i<4;i++)
{
for(j=0;j<250;j++)
{
WDT_RST=0xa1; // 清看门狗
for(k=0;k<0xff;k++);
}
}
}
/**************************************************************************************
*
* FUNCTION: F_LED_DISPLAY
*
* DESCRIPTION: 复费率程序开机指示
* 指示灯闪烁三次
*
* PARAMETERS: none
*
* RETURNED: none
*
*************************************************************************************/
void F_LED_DISPLAY()
{
uchar data i;
uchar data j;
uchar data k;
uchar data h;
for(h=0;h<3;h++)
{
led=0; // 开机指示灯闪耀 P05
for(k=0;k<4;k++)
{
for(j=0;j<250;j++)
{
WDT_RST=0xa1; // 清看门狗
for(i=0;i<0xff;i++);
}
}
led=1;
for(k=0;k<4;k++)
{
for(j=0;j<250;j++)
{
WDT_RST=0xa1; // 清看门狗
for(i=0;i<0xff;i++);
}
}
} // P05
}
// 复费率规约数据格式如下:
/* 44 41 54 ( 3位报文头 )
* 1F ( 1位报文总长度 )
* 09 AF ( 2位载波同步字节 )
* BB BB BB ( 3位集中器地址 )
* 81 ( 1位控制码 )
* 16 ( 1位规约数据长度 )
* 1F 90 ( 2为规约数据项 )
* 25 25 00 0F 00 39 00 00 00 12 00 00 00 13 00 00 00 14 00 00 ( 规约数据体内容 )
* 42 04 ( 2位校验码 )
*/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -