📄 czx167-145-v2.2.c
字号:
Send_Infrared_buf[i]=RS485_buf_bak[i];
Infrared_Data_Send(j); //红外发送
HW_ZB=0;
}
else if(HW_ZB=='Z') //载波读表数据
{
if(ZB_Read_Time=='Y') //判断载波是否读时间
{
if(RS485_buf_bak[11]==0xF3)
{
if(RS485_buf_bak[10]==0x43) //=C010 日期及周次的回答
{
Send_Carrier_buf[0]=ZJ_Add_buf[0];
Send_Carrier_buf[1]=ZJ_Add_buf[1];
Send_Carrier_buf[2]=ZJ_Add_buf[2];
Send_Carrier_buf[3]=0x81;
Send_Carrier_buf[4]=13;
Send_Carrier_buf[5]=0x12;
Send_Carrier_buf[6]=0xC0;
Send_Carrier_buf[7]=RS485_buf_bak[1];
Send_Carrier_buf[8]=RS485_buf_bak[2];
Send_Carrier_buf[9]=RS485_buf_bak[3]; // 载波地址
Send_Carrier_buf[10]=0x0F; // 继电器状态
Send_Carrier_buf[14]=RS485_buf_bak[12]-0x33;
Send_Carrier_buf[15]=RS485_buf_bak[13]-0x33;
Send_Carrier_buf[16]=RS485_buf_bak[14]-0x33;
Send_Carrier_buf[17]=RS485_buf_bak[15]-0x33;
for(i=0; i<100; i++) //延时15.08ms
{
WDT_RST=0xa1;
for(j=0; j<250; j++);
}
read_hms_frame(); //下发读时分秒485数据帧
}
else if(RS485_buf_bak[10]==0x44) //= C011 时间
{
Send_Carrier_buf[11]=RS485_buf_bak[12]-0x33;
Send_Carrier_buf[12]=RS485_buf_bak[13]-0x33;
Send_Carrier_buf[13]=RS485_buf_bak[14]-0x33;
ZB_Glob_Len=18;
zb_send_c();
ZB_Read_Time=0x0;
HW_ZB=0;
}
else
{
ZB_Read_Time=0x0;
HW_ZB=0;
}
}
else
{
ZB_Read_Time=0x0;
HW_ZB=0;
}
}
else
{
Send_Carrier_buf[0]=ZJ_Add_buf[0];
Send_Carrier_buf[1]=ZJ_Add_buf[1];
Send_Carrier_buf[2]=ZJ_Add_buf[2];
Send_Carrier_buf[3]=RS485_buf_bak[8];
Send_Carrier_buf[4]=RS485_buf_bak[9]+4;
if(RS485_buf_bak[9]==0)
{
Send_Carrier_buf[5]=RS485_buf_bak[1];
Send_Carrier_buf[6]=RS485_buf_bak[2];
Send_Carrier_buf[7]=RS485_buf_bak[3]; // 载波地址
Send_Carrier_buf[8]=0x0F;
ZB_Glob_Len=9;
zb_send_c();
}
else
{
Send_Carrier_buf[5]=RS485_buf_bak[10]-0x33;
Send_Carrier_buf[6]=RS485_buf_bak[11]-0x33;
j=RS485_buf_bak[9]+9;
ZB_Glob_Len=j;
for(i=11;i<j;i++)
Send_Carrier_buf[i]=RS485_buf_bak[i+1]-0x33;
Send_Carrier_buf[7]=RS485_buf_bak[1];
Send_Carrier_buf[8]=RS485_buf_bak[2];
Send_Carrier_buf[9]=RS485_buf_bak[3]; // 载波地址
Send_Carrier_buf[10]=0x0F;
zb_send_c();
}
HW_ZB=0;
}
}
else HW_ZB=0;
}
/**************************************************************************************
*
* FUNCTION: Infrared_Data_Send
*
* DESCRIPTION: 红外数据发送
*
*
* PARAMETERS: Buf[]: 等待发送的数据, Send_Len待发送数据的长度
*
* RETURNED: none
*
*************************************************************************************/
void Infrared_Data_Send(uchar Send_Len )
{
uchar i,j,k;
ES=0;
REN=0;
EXT_ADR=0X19;
EXT_DAT=0X20;
for( i=0; i<Send_Len; i++ )
{
ACC=Send_Infrared_buf[i];
TB8=PSW^0;
SBUF=Send_Infrared_buf[i];
Timer_HW=100;
// 500毫秒钟发送不成功退出
while(TI==0)
{
if(Timer_HW==0)
{
ES=1;
REN=1;
TI=0;
return;
}
}
TI=0;
for(k=0;k<3;k++)
for(j=0;j<200;j++);
}
REN=1;
ES=1;
TI=0;
EXT_ADR=0X19;
EXT_DAT=0X00;
}
/**************************************************************************************
*
* FUNCTION: RS485_Data_Send
*
* DESCRIPTION: RS485数据发送(都是读命令,因此固定发送14个字节)
* 68 A0 A1 A2 A3 A4 A5 68 01 02 Data_L Data_H CS 16
*
* PARAMETERS: none
*
* RETURNED: none
*
*************************************************************************************/
void RS485_Data_Send()
{
uchar i;
uchar j,k;
uchar Len;
EXT_ADR=0X19;
EXT_DAT=0X20;
ES1=0;
EREN=0;
Len=Send_RS485_buf[9]+12;
for( i=0; i<Len; i++ )
{
ACC=Send_RS485_buf[i];
ETB8=PSW^0;
SBUF1=Send_RS485_buf[i];
Timer_RS=20; // 100毫秒钟发送不成功退出
while(ETI==0)
{
if(Timer_RS==0)
{
ES1=1;
EREN=1;
ETI=0;
return;
}
}
ETI=0;
for(k=0;k<3;k++)
for(j=0;j<200;j++);
}
ES1=1;
EREN=1;
ETI=0;
EXT_ADR=0X19;
EXT_DAT=0X00;
RS485_Send_Sign='O';
Timer_RS_Answer=120; //600mS未收到第一个字节,认为该帧数据无应答
}
/**************************************************************************************
*
* FUNCTION: HW_Answer_Success
*
* DESCRIPTION: 红外应答设置成功
*
*
* PARAMETERS: none
*
* RETURNED: none
*
*************************************************************************************/
void HW_Answer_Success()
{
uchar i;
uchar Data_CRC;
for(i=0; i<4; i++)
Send_Infrared_buf[i]=0xFE;
for(i=4; i<12; i++)
Send_Infrared_buf[i]=Infrared_buf_bak[(i-4)];
Send_Infrared_buf[12]=0x84;
Send_Infrared_buf[13]=0x00;
Data_CRC=0;
for(i=4; i<14; i++)
{
Data_CRC+=Send_Infrared_buf[i];
}
Send_Infrared_buf[14]=Data_CRC;
Send_Infrared_buf[15]=0x16;
Infrared_Data_Send(16);
}
/**************************************************************************************
*
* FUNCTION: HW_Answer_MeterNO
*
* DESCRIPTION: 红外应答电表表号
*
*
* PARAMETERS: MeterNO: 电表序号
*
* RETURNED: none
*
*************************************************************************************/
void HW_Answer_MeterNO(uchar MeterNO)
{
uchar i;
uchar Data_CRC;
Send_Infrared_buf[0]=0x68;
for(i=1; i<7; i++) //变表号为终端所管理的表号
{
Send_Infrared_buf[i]=Son_Add_buf[MeterNO][(i-1)];
Send_Infrared_buf[(i+11)]=Son_Add_buf[MeterNO][(i-1)]+0x33;
}
Send_Infrared_buf[7]=0x68;
Send_Infrared_buf[8]=0x81;
Send_Infrared_buf[9]=0x08;
Send_Infrared_buf[10]=0x40+MeterNO+0x33;
Send_Infrared_buf[11]=0xC0+0x33;
Data_CRC=0;
for(i=0; i<18; i++)
Data_CRC+=Send_Infrared_buf[i];
Send_Infrared_buf[18]=Data_CRC;
Send_Infrared_buf[19]=0x16;
Infrared_Data_Send(20);
}
/**************************************************************************************
*
* FUNCTION: initsys
*
* DESCRIPTION: 初始化设置函数,
* 进行系统初始化设置
*
* PARAMETERS: none
*
* RETURNED: none
*
*************************************************************************************/
void initsys(void)
{
CKCON=0X3F; // 控制看门狗喂狗时间长度为832ms (0x8EH)
ALU_MOD=0; // 8位/16位运算模式选择位 ; 设置成8位运算模式 (D0H^1)
//载波通讯配置
PLM_SSC=1; // (D8H)使能载波通讯PLM_SSC(EXT_CFG.0)=1
EIE=0X01; // (A9H 使能INT2中断(EX2=1)
IT2=1; // (C8H) 为边沿触发方式(IT2=1)。
PLM_RS=0; // PLM_RS(EXT_CTRL.0)=1 为0时,载波处于接收状态
// T0设置为定时方式
TMOD=0x21; // 设 T/C1 为模式2,8 位自装载计数器 ;T/C0 为模式1, 定时方式,16 位计数器
TH0=0xF8; // 定时器0中断配置
TL0=0x30; // 定时 5ms 一个定时中断
TR0 =1; // 启动 T0 定时器
ET0 =1; // 允许定时器 T0 中断
//COM0通讯配置
PCON=0xC0; // COM0 和 COM1的波特率加倍
SCON=0xD0; // 串口0 的控制寄存器,方式3 11 位异步收发,波特率由定时器控制,允许接收。
TH1=0xEB;
TL1=0xEB; // 设定波特率为1200; 9.6(PL3105按9.6/2计算) 下数 EBH
TR1=1; // 启动定时器1
ES=1; // 允许串口0中断
IR_CNT1=0x1F; // 红外通讯使用38K频率
EXT_ADR=0xFE;
LED_LCD =0; // 打开液晶显示
IR38K =1; // 打开红外通讯
RS485 =0; // 关闭RS485通讯
//COM1通讯配置
SCON1=0xD0; // 串口1 的控制寄存器,方式3 11 位异步收发,波特率由定时器控制,允许接收。
TMOD1=0x02; // T2设置为模式2(8位自装载计数器 )
TH2=0xEB;
TL2=0xEB; // 设定波特率为1200; 9.6(PL3105按9.6/2计算) 下数 EBH
TR2=1; // 启动定时器2
ES1=1; // 允许串口1中断
// 中断级别设置
PT0=1; // 定时器 T0 中断为高级中断
EIP=1; // 外部中断2 为高级中断,载波中断优先
EA=1; // 开总中断
}
/**************************************************************************************
*
* FUNCTION: initsys_ref
*
* DESCRIPTION: 初始化重置函数,
* 进行系统初始化重置
*
* PARAMETERS: none
*
* RETURNED: none
*
*************************************************************************************/
void initsys_ref(void)
{
if(ALU_MOD!=0)
ALU_MOD=0;
//载波通讯重置
if(PLM_SSC!=1)
PLM_SSC=1;
if (EIE!=0x01)
EIE=0x01; // (A9H 使能INT2中断(EX2=0)
if(IT2!=1)
IT2=1; // (C8H) 为边沿触发方式(
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -