⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 sfbr.c

📁 规约转换 黄花河站四方博瑞小电流接地选线
💻 C
📖 第 1 页 / 共 2 页
字号:
/*黄花河站四方博瑞小电流接地选线*/
#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 + -