📄 sfbr.c
字号:
/*黄花河站四方博瑞小电流接地选线*/
#pragma debug oe code symbols
#include <reg51.h>
#include <stdio.h>
#include <absacc.h>
#define uchar unsigned char
#define uint unsigned int
#define BUFSIZE 250 /* 串口输入输出缓冲区大小 */
#define NETSIZE 50 /* 网络输入输出缓冲区大小 */
#define POLLING_TIME 200 /* 查询装置间隔时间1min=60000ms,60000/20=3000 */
/*#define yxbc_time 3000 /* 查询遥测间隔时间60秒,1min=60000ms,60000/20=3000 */
#define ask_time 200 /* 发送查询命令间隔时间15秒*/
#define TXZD_TIME 800 /* 保持通讯时间 */
#define COMM_BPS 0x35 /* 11:300 12:600 13:1200 14:2400 15:4800 16:9600 odd*/
/* 21:300 22:600 23:1200 24:2400 25:4800 26:9600 even*/
/* 31:300 32:600 33:1200 34:2400 35:4800 36:9600 none*/
/*#define RTUaddr 0x20 /*直流系统RTU地址*/
#define yc_len 0x15 /*需要遥测报文的长度*/
/*#define CSNaddr 0x10 /*与RTU通讯时CSN022的地址*/
#define CMD_XFER 1
#define CMD_NULL 0
#define CMD_RESYNC 0x5a
#define CMD_ACKSYNC 7
#define EOM 0
#define NV_A 0x41
#define NV_B 0x42
#define MASTER 1
#define SLAVE 0
#define MAX_IO_BUFFER 31
#define N3120_DATA_PORT 0xe000 /* 3120数据寄存器 */
#define N3120_CTRL_PORT 0xe001 /* 3120控制寄存器 */
sbit n3120_r_w_ctrl = P3^2;
sbit ctrl_485_direct = P1^3;
sbit watchdog_clr = P3^3;
bit idata rec_yx=0,rec_yc=0,rec_state=0,dian=1,ask=0;
typedef struct PIO_IN /*并口接收数据结构*/
{
unsigned char cmd_xfer;
unsigned char len;
unsigned char DATA[MAX_IO_BUFFER];
};
typedef struct PIO_OUT /*并口发送数据结构*/
{
unsigned char cmd_xfer;
unsigned char LENGTH;
unsigned char nv_mode;
unsigned char length;
unsigned char DATA[MAX_IO_BUFFER];
};
static uchar data i,sum,data_len,hjr,YcSendNum,YxSendNum,command,sgxh,sgxh1,addrl,times;
static uchar data token,node_id,open_485_delay,group;
static uchar data send_length,send_point,rec_length,rec_point;
static uint xdata tx_time,asktime,yxbctime,crc;
static uchar xdata buf_rec_pio[NETSIZE],buf_send_pio[NETSIZE];
static uchar xdata uart_in[BUFSIZE],uart_out[BUFSIZE];
static struct PIO_IN xdata *pifc;
static struct PIO_OUT xdata *pofc;
/*================== 函数原型 ==================*/
void delay_40ms();
void init_comm_baud(uchar bps);
void parallel_init(void);
void watch_dog(void);
void write_node_id(void);
void comm_with_device(void);
void comm_with_3120(void);
void para_write_byte(uchar c);
uchar para_read_byte(void);
void wait_0_hs(void);
void send_yx(void);
void send_yc(void);
void send_command(void);
void send_command1(void);
/*================================================
主 程 序
================================================*/
void main(void)
{
EA=0;
delay_40ms();
init_comm_baud(COMM_BPS);
TH0=0xb1;TL0=0xe0;
SP=0x60;
watch_dog();
PT0=1;
IE=0x12; /* 允许UART,T0中断 */
data_len=0;hjr=0;
send_length=rec_length=0;
YcSendNum=0;
YxSendNum=0;
command=0;
crc=0;
sgxh=0;
sgxh1=0;
times=0;
send_point=rec_point=0;
ctrl_485_direct=0; /* 485处于接收状态 */
yxbctime=0;
tx_time=TXZD_TIME;
asktime=ask_time;
parallel_init(); /* 并口初始化,与3120握手 */
node_id=~P1&0xf7;
write_node_id(); /* 将节点地址写入3120 EEPROM */
watch_dog();
for(;;)
{
EA=1;
comm_with_3120(); /* 与3120通讯 */
comm_with_device(); /* 与外设通讯 */
}
}
/*=================================================
89C51与N3120通讯程序
================================================*/
void comm_with_3120()
{
uchar data length,i,cmd;
watch_dog();
pofc=(struct PIO_OUT xdata *)buf_send_pio;
if (token==MASTER)
{
if(rec_yc==1)
{
tx_time=TXZD_TIME;
rec_yc=0;
pofc.cmd_xfer=CMD_XFER;
pofc.LENGTH=pofc.length+2;
pofc.nv_mode=NV_B;
para_write_byte(pofc.cmd_xfer);
para_write_byte(pofc.LENGTH);
para_write_byte(pofc.nv_mode);
para_write_byte(pofc.length);
for(i=0;i<pofc.length;i++)
para_write_byte(pofc.DATA[i]);
para_write_byte(EOM);
token=SLAVE;
return;
}
else if(rec_yx==1)
{
tx_time=TXZD_TIME;
rec_yx=0;
pofc.cmd_xfer=CMD_XFER;
pofc.LENGTH=pofc.length+2;
pofc.nv_mode=NV_B;
para_write_byte(pofc.cmd_xfer);
para_write_byte(pofc.LENGTH);
para_write_byte(pofc.nv_mode);
para_write_byte(pofc.length);
for(i=0;i<pofc.length;i++)
para_write_byte(pofc.DATA[i]);
para_write_byte(EOM);
token=SLAVE;
return;
}
else if(tx_time==0) /*避免通讯中断报警*/
{
tx_time=TXZD_TIME;
pofc.cmd_xfer=CMD_XFER;
pofc.LENGTH=13;
pofc.nv_mode=NV_B;
pofc.length=11;
pofc.DATA[0]=0x0F;
pofc.DATA[1]=node_id;
pofc.DATA[2]=0x30;
pofc.DATA[3]=0x0A;
pofc.DATA[4]=0x04;
pofc.DATA[5]=1;
for(i=6;i<10;i++)
pofc.DATA[i]=0;
pofc.DATA[10]=pofc.length;
for(i=0;i<10;i++)
pofc.DATA[10]+=pofc.DATA[i];
para_write_byte(pofc.cmd_xfer);
para_write_byte(pofc.LENGTH);
para_write_byte(pofc.nv_mode);
para_write_byte(pofc.length);
for(i=0;i<pofc.length;i++)
para_write_byte(pofc.DATA[i]);
para_write_byte(EOM);
token=SLAVE;
return;
}
else
{
para_write_byte(CMD_NULL); /* 传令牌 */
para_write_byte(EOM);
token=SLAVE;
return;
}
}
else
{
cmd=para_read_byte();
if(cmd==CMD_NULL)
{
wait_0_hs();
token=MASTER;
return;
}
if(cmd!=CMD_XFER) return; /*有nv_c数据?*/
{
pifc=(struct PIO_IN xdata *)buf_rec_pio;
pifc.cmd_xfer=CMD_XFER;
pifc.len=para_read_byte();
for (i=0;i<pifc.len;i++)
pifc.DATA[i]=para_read_byte();
wait_0_hs();
token=MASTER;
}
}
}
/*=================================================
与直流系统通讯程序
================================================*/
void comm_with_device()
{
watch_dog();
if (asktime==0) /*发送间隔时间到*/
{
asktime=POLLING_TIME;
if(times==0)
{
send_command();
}
/* else
{
send_command1();
} */
times++;
if(times>1)
times=0;
}
}
void send_command()
{
ctrl_485_direct=1; /* 485处于发送状态 */
open_485_delay=2;
for(;;)
{
if(open_485_delay==0) break;
}
watch_dog();
uart_out[0]=0x20;
uart_out[1]=0x05;
uart_out[2]=0xFA;
uart_out[3]=0x61;
uart_out[4]=0x80;
send_length=5; /* 欲发射命令长度 */
TI=1;
YxSendNum=0;
}
/* -----------------------------------------------
从RS232口发送查询命令
-----------------------------------------------
=================================================
ENTER 20<MS> TIMER INTERRUPT PROGRAM
================================================*/
void enter_20ms_int(void) interrupt 1 using 2
{
TH0=0xb1;
TL0=0xe0;
if(open_485_delay) --open_485_delay;
if(asktime) --asktime;
if(tx_time) --tx_time;
if(yxbctime) --yxbctime;
}
/*===============================================
ENTER SERIA UART INTERRUPT PROGRAM
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -