📄 sfbr.c
字号:
===============================================*/
void enter_uart_int(void) interrupt 4 using 1
{
if(TI)
{
TI=0;
if(send_length!=0)
{
if((COMM_BPS&0xf0)==0x10)
{
SCON=0xc0;
ACC=uart_out[send_point++];
TB8=!P;
SBUF=ACC;
--send_length;
SCON=0xd0;
return;
}
else if((COMM_BPS&0xf0)==0x20)
{
SCON=0xc0;
ACC=uart_out[send_point++];
TB8=P;
SBUF=ACC;
--send_length;
SCON=0xd0;
return;
}
SCON=0x40; /* 无校验 */
ACC=uart_out[send_point++]; /* 取出欲发送数据 */
SBUF=ACC;
--send_length;
SCON=0x50;
return;
}
else
{
send_point=0;
ctrl_485_direct=0;
return;
}
}
else if(RI) /* 接收中断 */
{
pofc=(struct PIO_OUT xdata *)buf_send_pio;
RI=0;
ACC=SBUF;
if(rec_state==0) /*还没正确接收到报文前三个字节*/
{
uart_in[1]=SBUF;
if(uart_in[1]==0x06)
{
rec_point=2;
data_len=5;
rec_state=1;
}
if(uart_in[1]==0x12)
{
rec_point=2;
data_len=17;
rec_state=1;
}
if(uart_in[1]==0x20)
uart_in[0]=uart_in[1];
return;
}
else if((rec_state==1)&&(--data_len!=0)) /*开始接收数据报文*/
{
uart_in[rec_point++]=SBUF;
return;
}
if((rec_state==1)&&(data_len==0))
{
rec_state=0;
if(uart_in[1]==0x06) /*遥信报文, 无故障送状态字*/
{
pofc.cmd_xfer=CMD_XFER; /* 收到的数据送入网络发送缓冲区 */
pofc.LENGTH=15; /* LENGTH=length+2 */
pofc.nv_mode=NV_B;
pofc.length=13; /* Report length */
pofc.DATA[0]=0x0F;
pofc.DATA[1]=node_id;
pofc.DATA[2]=0x30;
pofc.DATA[3]=0x07;
pofc.DATA[4]=0x01;
pofc.DATA[5]=0x00;
pofc.DATA[6]=uart_in[4];
pofc.DATA[7]=0x00;
pofc.DATA[8]=0x00;
pofc.DATA[9]=0x00;
pofc.DATA[10]=0x00;
pofc.DATA[11]=0x00;
pofc.DATA[12]=pofc.length;
for(i=0;i<12;i++)
pofc.DATA[12]+=pofc.DATA[i]; /* CS */
rec_yx=1;
}
if(uart_in[1]==0x12)
{
pofc.cmd_xfer=CMD_XFER; /* 收到的数据送入网络发送缓冲区 */
pofc.LENGTH=15; /* LENGTH=length+2 */
pofc.nv_mode=NV_B;
pofc.length=13; /* Report length */
pofc.DATA[0]=0x0F;
pofc.DATA[1]=node_id;
pofc.DATA[2]=0x30;
pofc.DATA[3]=0x07;
pofc.DATA[4]=0x01;
pofc.DATA[5]=0x00;
pofc.DATA[6]=uart_in[4];
pofc.DATA[7]=0x00;
pofc.DATA[8]=0x00;
pofc.DATA[9]=0x00;
pofc.DATA[10]=0x00;
pofc.DATA[11]=0x00;
pofc.DATA[12]=pofc.length;
if(uart_in[7]==0xee)
{
switch(uart_in[8])
{
case 0xf1:pofc.DATA[7]+=0x01;break;
case 0xf2:pofc.DATA[7]+=0x02;break;
case 0xf3:pofc.DATA[7]+=0x04;break;
case 0xf4:pofc.DATA[7]+=0x08;break;
default: break;
}
}
if(uart_in[8]==0xff)
{ switch(uart_in[7])
{
case 0x1f: pofc.DATA[8]+=0x01;break;
case 0x2f: pofc.DATA[8]+=0x02;break;
case 0x3f: pofc.DATA[8]+=0x04;break;
case 0x4f: pofc.DATA[8]+=0x08;break;
case 0x5f: pofc.DATA[8]+=0x10;break;
case 0x6f: pofc.DATA[8]+=0x20;break;
case 0x7f: pofc.DATA[8]+=0x40;break;
case 0x8f: pofc.DATA[8]+=0x80;break;
case 0x9f: pofc.DATA[9]+=0x01;break;
case 0x10: pofc.DATA[9]+=0x02;break;
case 0x11: pofc.DATA[9]+=0x04;break;
case 0x12: pofc.DATA[9]+=0x08;break;
case 0x13: pofc.DATA[9]+=0x10;break;
case 0x14: pofc.DATA[9]+=0x20;break;
case 0x15: pofc.DATA[9]+=0x40;break;
case 0x16: pofc.DATA[9]+=0x80;break;
case 0x17: pofc.DATA[10]+=0x01;break;
case 0x18: pofc.DATA[10]+=0x02;break;
case 0x19: pofc.DATA[10]+=0x04;break;
case 0x20: pofc.DATA[10]+=0x08;break;
case 0x21: pofc.DATA[10]+=0x10;break;
case 0x22: pofc.DATA[10]+=0x20;break;
case 0x23: pofc.DATA[10]+=0x40;break;
case 0x24: pofc.DATA[10]+=0x80;break;
case 0x25: pofc.DATA[11]+=0x01;break;
case 0x26: pofc.DATA[11]+=0x02;break;
case 0x27: pofc.DATA[11]+=0x04;break;
case 0x28: pofc.DATA[11]+=0x08;break;
default: break;
}
}
for(i=0;i<12;i++)
pofc.DATA[12]+=pofc.DATA[i]; /* CS */
rec_yx=1;
return;
}
}
return;
}
}
void init_comm_baud(uchar bps)
{
TMOD=0x21;
TCON=0x50;
SCON=0xd0;
switch (bps)
{
case 0x11: TH1=0xa0; break; /* 300 bps */
case 0x12: TH1=0xd0; break; /* 600 bps */
case 0x13: TH1=0xe8; break; /* 1200 bps */
case 0x14: TH1=0xf4; break; /* 2400 bps */
case 0x15: TH1=0xfa; break; /* 4800 bps */
case 0x16: TH1=0xfd; break; /* 9600 bps */
case 0x21: TH1=0xa0; break; /* 300 bps */
case 0x22: TH1=0xd0; break; /* 600 bps */
case 0x23: TH1=0xe8; break; /* 1200 bps */
case 0x24: TH1=0xf4; break; /* 2400 bps */
case 0x25: TH1=0xfa; break; /* 4800 bps */
case 0x26: TH1=0xfd; break; /* 9600 bps */
case 0x31:
SCON=0x50;
TH1=0xa0;
break; /* 300 bps */
case 0x32:
SCON=0x50;
TH1=0xd0;
break; /* 600 bps */
case 0x33:
SCON=0x50;
TH1=0xe8;
break; /* 1200 bps */
case 0x34:
SCON=0x50;
TH1=0xf4;
break; /* 2400 bps */
case 0x35:
SCON=0x50;
TH1=0xfa;
break; /* 4800 bps */
case 0x36:
SCON=0x50;
TH1=0xfd;
break; /* 9600 bps */
default:
SCON=0x50;
TH1=0xe8;
break;
}
}
void write_node_id(void)
{
para_write_byte(CMD_XFER);
para_write_byte(5);
para_write_byte(0x42);
para_write_byte(3);
para_write_byte(node_id);
para_write_byte(node_id);
para_write_byte(node_id);
para_write_byte(EOM);
token=SLAVE;
}
void parallel_init()
{
uchar data c=0;
wait_0_hs();
do{
para_write_byte(CMD_RESYNC);
para_write_byte(EOM);
c=para_read_byte();
} while(c!=CMD_ACKSYNC);
wait_0_hs();
token=MASTER;
}
void wait_0_hs(void)
{
n3120_r_w_ctrl=1;
while(XBYTE[N3120_CTRL_PORT]&0x01);
}
void para_write_byte(uchar c)
{
wait_0_hs();
n3120_r_w_ctrl=0;
XBYTE[N3120_DATA_PORT]=c;
}
uchar para_read_byte(void)
{
wait_0_hs();
return(XBYTE[N3120_DATA_PORT]);
}
void watch_dog()
{
watchdog_clr=!watchdog_clr;
}
void delay_40ms()
{
uint data i=0x1000;
while(i--);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -