📄 kjj19-mn.c
字号:
bmoks=0;
bms=10;
bmok=0;
while(i!=0x44) //CRC码发送结束
{
if (bmok==1)
break;
i=Z85C30_JCQRD(0X00); //读取寄存器中的数据
i=i&0x44;
}
Z85C30_KZJCQ(0x05,0x61); //挂起发送
SIOAB=1; //设置控制字A路接收
Z85C30_init_A(); //A路接受设置
SIOAB=0;
fzhybj=0; //置接口回应标记
}
/************************************************************************
串口数据处理:1、设置参数填如参数数组。
2、分站上传数据填入数据数组。
************************************************************************/
void cl232(void)
{
uchar a,b;
if(RIbuf[0]==0x55 && RIbuf[1]==0xAA) //数据包正确
{
if(RIbuf[2]==0xFF && RIbuf[3]==0x00) //如果是设置信息
{
switch ( RIbuf[4]) //判断命令字
{
case 1: //设置清空置0
IE=0X90; //T0中断,INTO中断禁止
dzzs=0;
wxfzh[0]=0XFF;
HY232(1);
break;
case 2: //添加分站
a=dzzs*4;
wxfzh[dzzs]=RIbuf[6]; //设置分站地址
wxfzcs[a]=RIbuf[7]; //设置分站参数
wxfzcs[a+1]=RIbuf[8];
wxfzcs[a+2]=RIbuf[9];
wxfzcs[a+3]=RIbuf[10];
dzzs=dzzs+1;
HY232(2);
break;
case 3: //设置结束
if(dzzs==RIbuf[5])
{
eeprom_clr(0x20,0x00); //擦除FALSH
for(a=0;a<32;a++) //存8个分站的参数
{
eeprom_w(0x20,a,wxfzcs[a]);
}
for(a=32;a<40;a++) //存8个分站的地址
{
eeprom_w(0x20,a,wxfzh[a-32]);
}
eeprom_w(0x20,40,dzzs); //存设置分站数
a=0xff-dzzs;
eeprom_w(0x20,41,a); //存设置分站数反码
HY232(3);
}
r_count=0;
IE=0X93; //T0中断,INTO中断开放
break;
default:
break;
}
}
else //分站上传来的数据
if(RIbuf[2]==wxfzh[wxh]) //如果分站号为刚才巡检的分站号
{
a=wxh*8;
for(b=0;b<8;b++)
{
fzsj[a+b]=RIbuf[b+3];
}
}
}
}
/************************************************************************
模拟串口对无线接口的查询9个字节(0X55+0XAA+命令+1字节分站号+4字节参数+1字节累加和)
对设置的回应
/***********************************************************************/
void HY232(uchar ml) //对无线接口的查询
{
uchar i;
uchar ljh;
ljh=0;
TIbuf[0]=0x55; //数据包头0X55AA
ljh=ljh+TIbuf[0];
TIbuf[1]=0xAA;
ljh=ljh+TIbuf[1];
TIbuf[2]=ml; //命令
ljh=ljh+TIbuf[2];
switch (ml)
{
case 1,2,3: //对设置的回应
TIbuf[0]=0xFF; //数据包头0XFF00
ljh=ljh+TIbuf[0];
TIbuf[1]=0x00;
ljh=ljh+TIbuf[1];
TIbuf[2]=ml; //命令
ljh=ljh+TIbuf[2];
TIbuf[3]=0X55;
TIbuf[4]=0;
TIbuf[5]=0;
TIbuf[6]=0;
TIbuf[7]=0;
TIbuf[8]=ljh+0X55;
break;
case 4: //下发巡检指令
TIbuf[3]=wxfzh[wxh]; //分站号
ljh=ljh+TIbuf[3];
i=(wxh-1)<<2;
TIbuf[4]=wxfzcs[i]; //4个参数
ljh=ljh+TIbuf[4];
i=i+1;
TIbuf[5]=wxfzh[i];
ljh=ljh+TIbuf[5];
i=i+1;
TIbuf[6]=wxfzh[wxh];
ljh=ljh+TIbuf[6];
i=i+1;
TIbuf[7]=wxfzh[wxh];
ljh=ljh+TIbuf[7];
TIbuf[8]=ljh;
break;
case 5: //下发断电指令
TIbuf[3]=ddfz; //断电分站
ljh=ljh+ddfz;
TIbuf[4]=ddcs; //断电参数
ljh=ljh+ddcs;
TIbuf[5]=0;
TIbuf[6]=0;
TIbuf[7]=0;
TIbuf[8]=ljh;
break;
case 6: //下发总清指令
TIbuf[3]=0;
TIbuf[4]=0;
TIbuf[5]=0;
TIbuf[6]=0;
TIbuf[7]=0;
TIbuf[8]=ljh;
break;
default:
break;
}
SBUF=TIbuf[0]; //串口发送
tsum=1;
}
/**********************************************************************************
* function: delay_ms() 24M 500us延迟
* use: delay x ms(Max 65535ms,)
* input parameter: unsigned int delay_counter
* output parameter: none
***********************************************************************************/
void delay_ms(uint delay_counter)
{
unsigned int data i;
while(delay_counter--)
{
i=81;
while(i--);
}
}
/***********************************************************************************
* function: Z85C30_KZJCQ()
* use: 控制寄存器设置
* input parameter: none
* output parameter: none
***********************************************************************************/
void Z85C30_KZJCQ(uchar KZJCQH,uchar KZSJ)
{
SIOCS=1;
SIORD=1;
SIOWR=1;
SIODC=0; //选择控制
P0=KZJCQH;
SIOCS=0;SIOWR=0; //选择寄存器
_nop_();
SIOWR=1;SIOCS=1;
P0=KZSJ;
SIOCS=0;SIOWR=0;
_nop_();
SIOWR=1; SIOCS=1;
}
/***********************************************************************************
* function: Z85C30_WR0()
* use: 控制寄存器0设置
* input parameter: none
* output parameter: none
***********************************************************************************/
void Z85C30_WR0(uchar KSJ)
{
SIOCS=1;
SIORD=1;
SIOWR=1;
P0=KSJ;
SIODC=0; //选择控制
SIOCS=0;SIOWR=0;
_nop_();
SIOWR=1;SIOCS=1;
_nop_();
}
/***********************************************************************************
* function: Z85C30_JCQRD()
* use: 控制寄存器读取
* input parameter:none
* output parameter: none
***********************************************************************************/
uchar Z85C30_JCQRD(uchar JCQH)
{
uchar a;
SIOCS=1;
SIORD=1;
SIOWR=1;
SIODC=0; //选择控制
if(JCQH!=0)
{
P0=JCQH;
SIOCS=0;SIOWR=0; //选择寄存器
_nop_();
SIOWR=1;SIOCS=1;
}
SIOCS=0;SIORD=0;
_nop_();
a=P0; //读取寄存器中的数据
SIORD=1;SIOCS=1;
return a;
}
/*********************************************************************************
* function: Z85C30_init()
* use: Z85C30初始化
* input parameter: none
* output parameter: none
*********************************************************************************/
void Z85C30_init(void)
{
SIOAB=1; //设置控制字A路接收
Z85C30_KZJCQ(0x09,0x80); //强制复位
Z85C30_KZJCQ(0x02,0x00); //WR2 中断向量00H
Z85C30_KZJCQ(0x04,0x20); //WR4 SDLC模式
Z85C30_KZJCQ(0x01,0x10); //WR1 接收所有字符和特征字符中断
Z85C30_KZJCQ(0x87,0x7E); //WR7 SDLC同步场,复位TX_CRC生成器
Z85C30_KZJCQ(0x46,0x00); //WR6 SDLC地址场00H,复位RX_CRC生成器
Z85C30_KZJCQ(0x0A,0x80); //WR10 A通道CRC预置FF,NRZ模式
Z85C30_KZJCQ(0x0B,0x08); //WR11 接收时钟/RTXC,发送时钟为/RTXC
Z85C30_KZJCQ(0x0E,0x20); //WR14 进入地址搜索模式
Z85C30_WR0(0x10);
Z85C30_WR0(0x38); // 复位IUS
Z85C30_KZJCQ(0x09,0x2A); //WR9 INTACK允许
Z85C30_KZJCQ(0x03,0xC9); //WR3 接收8个字符,RX_CRC允许,地址搜索模式,同步字符禁止装入,RX允许
SIOAB=0; //设置控制字B路
Z85C30_KZJCQ(0x09,0x40); //强制复位
Z85C30_KZJCQ(0x02,0x00); //WR2 中断向量00H
Z85C30_KZJCQ(0x04,0x20); //WR4 SDLC模式
Z85C30_KZJCQ(0x01,0x00); //WR1 接收不中断
Z85C30_KZJCQ(0x87,0x7E); //WR7 SDLC同步场,复位TX_CRC生成器
Z85C30_KZJCQ(0x06,0x00); //WR6 SDLC地址场00H,复位RX_CRC生成器
Z85C30_KZJCQ(0x0A,0x80); //WR10 CRC预置FF,NRZ模式
Z85C30_KZJCQ(0x0B,0x08); //WR11 接收时钟/RTXC,发送时钟为/RTXC
Z85C30_KZJCQ(0x0E,0x20); //WR14 进入地址搜索模式
Z85C30_WR0(0x10);
Z85C30_WR0(0x38); // 复位IUS
Z85C30_KZJCQ(0x09,0x0A); //WR9 INTACK允许
Z85C30_KZJCQ(0x03,0xCC); //WR3 接收8个字符,RX_CRC允许,地址搜索模式,同步字符禁止装入,RX允许*/RX不允许
}
/*********************************************************************************
* function: Z85C30_init_A()
* use: Z85C30初始化-A路接收
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -