📄 wqy.c
字号:
{
steout0_7(0xff);
steout8_15(0xff);
steinled0_7(0xff);
steinled8_15(0xff);
};
};
};
p=p+24;
for (nw=0;nw<8000;nw++)
{};
};
/*---------------------------------------------------------------------*/
/* 实验板输出演示程序结束。 */
/*=====================================================================*/
steout0_7(0); /*---------输出指示灯Q0-Q7清零 ---------*/
steout8_15(0); /*---------输出指示灯Q8-Q15清零 ---------*/
steinled0_7(0); /*---------输入键指示灯ILED0-ILED7清零 ---------*/
steinled8_15(0); /*---------输入键指示灯ILED8-ILED15清零 ---------*/
/*==============================================================*/
/* 清串口输入缓冲区trbox[i],清串口输出缓冲区rebox[i] */
/*--------------------------------------------------------------*/
for (i=0;i<113;i++)
{
rebox[i]=trbox[i]=0;
};
for (i=0;i<112;i++)
{
pb_in[i]=pb_out[i]=0;
};
address=rd_address(); /*---------读实验板上拨码开关,作为站号---------*/
/*======================================================================*/
/* 以下是串口初始化程序 */
/*----------------------------------------------------------------------*/
br_num=5; /*---------实验板波特率选择5,115.2K-------------*/
switch (br_num) /*---------根据波特率号设置T2--------------------*/
{
case 1:{ TH2=0x0ff; TL2=0x0a0;RCAP2H=0x0ff;RCAP2L=0x0a0;};break; /*---9.6K---*/
case 2:{ TH2=0x0ff; TL2=0x0d0;RCAP2H=0x0ff;RCAP2L=0x0d0;};break; /*---19.2K--*/
case 3:{ TH2=0x0ff; TL2=0x0e8;RCAP2H=0x0ff;RCAP2L=0x0e8;};break; /*---38.4K--*/
case 4:{ TH2=0x0ff; TL2=0x0f0;RCAP2H=0x0ff;RCAP2L=0x0f0;};break; /*---57.6K--*/
case 5:{ TH2=0x0ff; TL2=0x0f8;RCAP2H=0x0ff;RCAP2L=0x0f8;};break; /*---115.2K-*/
case 6:{ TH2=0x0ff; TL2=0x0fc;RCAP2H=0x0ff;RCAP2L=0x0fc;};break; /*---230.4K-*/
case 7:{ TH2=0x0ff; TL2=0x0fe;RCAP2H=0x0ff;RCAP2L=0x0fe;};break; /*---460.8K-*/
default:break;
};
/*---------------------------------------------------------------------------------------*/
/* 注意:本例基于PHILIP P89C51RD2单片机: */
/* 波特率=14745600/16/(65536-T) */
/* 各种波特率9600: T=0xffa0, 19.2K: T=0xffd0, 38.4K: T=0xffe8, */
/* 57.6K: T=0xfff0, 115.2K:T=0xfff8, 230.4k:T=0xfffc, 460.8k=0xfffe */
/*---------------------------------------------------------------------------------------*/
PCON=0;
T2CON=0x34; /*----RCLK=1; TCLK=1; TR2=1; C/T2=0 --------------------*/
/*--------------------------------------------------------------------------------------*/
/*串口设置成模式3 即:1 个启始位、8个数据位、1个偶校验位、1个停止位; */
/* 0xd0=11010000B; SM0SM1=11; SM2=0; REN=1;TB8=0; RB8=0; TI=0; RI=0 */
/*--------------------------------------------------------------------------------------*/
SCON=0x0d0;
/*--------------------------------------------------------------------------------------*/
/* 以下是串口初始化程序 */
/*======================================================================================*/
/*====================================================================================*/
/* 形成接口板的初始化报文 */
/* rebox[]是串口发送数组,格式见《SE手册》 */
/*------------------------------------------------------------------------------------*/
data_in_len=48+1+1; /*---- 输入数据报文长度=48+1+1=50; ---------*/
user_prm_len=0; /*---- 用户参数长度=0 ---------*/
data_out_len=48+1+1; /*---- 输入数据报文长度=48+1+1=50; ---------*/
trbox[0]=address; /*---- BYTE0=从站地址 ---------*/
trbox[1]=0x06; /*---- BYTE1=ID号高位 ---------*/
trbox[2]=0x0fa; /*---- BYTE2=ID号低位 ---------*/
/*====================================================================================*/
/* 以下形成I/O配置数据 */
/* 本例:I/O配置数据长度=6;I/O配置数据:0x1f,0x2f,0x1f,0x2f,0x1f,0x2f */
/* 共:48bytes input+48bytes output */
/*------------------------------------------------------------------------------------*/
trbox[3]=6; /*----BYTE3=I/O配置数据长度=6 ---------*/
trbox[4]=0x1f; /*----BYTE4=I/O配置数据:0x1f ---------*/
trbox[5]=0x2f; /*----BYTE5=I/O配置数据:0x2f ---------*/
trbox[6]=0x1f; /*----BYTE6=I/O配置数据:0x1f ---------*/
trbox[7]=0x2f; /*----BYTE7=I/O配置数据:0x2f ---------*/
trbox[8]=0x1f; /*----BYTE8=I/O配置数据:0x1f ---------*/
trbox[9]=0x2f; /*----BYTE9=I/O配置数据:0x2f ---------*/
trbox[24]=data_in_len; /*----BYTE24=data_in_len输入数据报文长度 ---------*/
trbox[25]=data_out_len; /*----BYTE25=data_out_len输出数据报文长度 ---------*/
trbox[26]=user_prm_len; /*----BYTE26=user_prm_len用户参数长度 ---------*/
x=0;
for (i=0;i<48;i++)
{
x=x+trbox[i]; /*----求校验和 ---------*/
};
trbox[48]=x; /*----置校验和 ---------*/
/*====================================================================================*/
/* 发送接口板的初始化报文、接收接口板的回答,初始不成功继续发初始化报文 */
/*------------------------------------------------------------------------------------*/
y=0; /*---- 清初始化成功标志 ---------*/
while (y==0)
{
REN=0;
for (i=0;i<49;i++) /*---- 发送一次初始化报文共49字节 ---------*/
{
TI=0;
ACC=trbox[i];
TB8=P; /*---- 形成偶校验位 ---------*/
SBUF=trbox[i];
while (TI==0) {};
};
/*---------发送完毕、等待接收回答-----------------------------------------------------*/
RI=0;
REN=1; /*---- 允许接收 ---------*/
re_er=0; /*---- re_er偶校验错标志 ---------*/
for (j=0;j<49;j++)
{ /*---- 接受回答报文共49个字节 ---------*/
nw=0;
while (RI==0) {}; /*---- 等待接收一个字符 ---------*/
ACC=SBUF;
if (P!=RB8) { re_er=1;}; /*---- 偶校验错,置偶校验错标志 ---------*/
rebox[j]=SBUF; /*---- 接收一个字符送串口输入缓冲区 ---------*/
RI=0;
};
/*--------------- 接收回答报文结束 -------------------------------------------*/
/*--------------- 以下分析接口板SE的回答报文 -----------------------------------------*/
if (re_er==0) /*---- 没有字符偶校验错? ---------*/
{
x=0;
for (i=0;i<48;i++) /*---- 求校验和 ---------*/
{
x=x+rebox[i];
};
if (x==rebox[48])
{ /*---- 校验和正确? ----------*/
if (rebox[0]==br_num) /*---- 返回的波特率号是5? ----------*/
{
if (rebox[1]==0) /*---- 初始化报文错误号N=0? ----------*/
{
x=0;
for (i=2;i<48;i++) /*---- byte2~byte47都是0xaa? ----------*/
{
if (rebox[i]!=0xaa)
{
x=1;
};
};
if (x==0)
{
y=1; /*---- byte2~byte47都是0xaa,初始化成功,y=1,准备退出while (y==0) ----*/
}
else
{x=0x11;}; /*---- byte2~byte47不都是0xaa!错误标记=0x11; ----*/
}
else
{x=rebox[1];}; /*---- 初始化报文错误号N<>0,错误标记=返回错误号 ----*/
}
else
{x=0x77;}; /*---- 返回的波特率号不是5, 错误标记=0x77; ----*/
}
else
{x=0xff;}; /*---- 校验和不正确正确, 错误标记=0xff; ----*/
}
else
{
x=0xee;
}; /*---- 发生了字符偶校验错 错误标记=0xee; ----*/
if (y==0)
{ /*---- 初始化失败 ----*/
for (nw=0;nw<10000;nw++)
{
steout0_7(br_num); /*---- 显示返回波特率号 ----*/
steout8_15(x); /*---- 显示返回错误号 ----*/
};
};
}; /*---- 如果y==0,返回while (y==0) ----*/
/*==================================================================================================*/
/* 实验板对PROFIBUS接口板初始化成功,进数据交换状态的无限循环中 */
/* trbox[]/rebox[]是串口发送/接收数组,发送/接收格式见《SE手册》 */
/*--------------------------------------------------------------------------------------------------*/
dil=data_in_len-1; /*---- data_in_len=50, dil=49 ----*/
dol=data_out_len-1; /*---- data_out_len==50, dol==49 ----*/
for (i=0;i<data_in_len;i++)
{
trbox[i]=0; /*---- 清发送、接收缓冲区 ----*/
};
for (i=0;i<data_out_len;i++)
{
rebox[i]=0; /*---- 清发送、接收缓冲区 ----*/
};
/*=============================== 进数据交换状态的无限循环中 =======================================*/
for (;;)
{
trbox[0]=req_com=0; /*---- 没有用户参数,请求数据命令永远是req_com=0,只请求A型报文 ------*/
trbox[1]=di0_7; /*---- di0_7是输入键输入I0~I7当前值,作为PROFIBUS输入的第1字节 ------*/
trbox[2]=di8_15; /*---- di8_15是输入键输入I8~I15当前值,作为PROFIBUS输入的第2字节 ------*/
for (i=3;i<dil;i++)
{
trbox[i]=0x5a; /*---- 其它PROFIBUS输入数据(3~48)本例定为0x5a ------*/
};
x=0;
for (i=0;i<dil;i++) /*---- 求校验和 ------*/
{
x=x+trbox[i];
};
trbox[dil]=x; /*---- 置校验和 ------*/
REN=0;
for (i=0;i<data_in_len;i++) /*---- 发送数据交换报文共50字节 ------*/
{
TI=0;
ACC=trbox[i];
TB8=P; /*---- 形成偶校验位 ------*/
SBUF=trbox[i];
while (TI==0) {};
};
/*=============================发送数据交换报文结束,等待接收接口板SE的回答。=========================*/
re_er=0; /*------ re_er偶校验错标志 ------*/
RI=0;
REN=1; /*------ 允许接收 ------*/
for (j=0;j<data_out_len;j++ ) /*------ 等待接收接口板的回答数据交换报文共50字节 ------*/
{
while (RI==0) {}; /*------ 等待接收一个字符 ------*/
ACC=SBUF;
if (P!=RB8) {re_er=1;}; /*------ 偶校验错,置偶校验错标志 ------*/
rebox[j]=SBUF; /*------ 接收一个字符送串口输入缓冲区 ------*/
RI=0;
};
/*=============================接收完毕===============================================================*/
if (re_er==0)
{ /*------ 无偶校验错 ------*/
x=0;
for (i=0;i<dol;i++)
{
x=x+rebox[i]; /*------ 求校验和 ------*/
};
if (x==rebox[dol])
{
y=dol-1; /*------ y=49-1=48,PROFIBUS输出数据长度 ------*/
for (i=1;i<dol;i++)
{
pb_out[i-1]=rebox[i]; /*------ 接收到的48个PROFIBUS输出数据送数据区pb_out[0~47] ------*/
};
}
else
{
error=0x81; /*------ 校验和错 ------*/
};
}
else
{
error=0x83; /*------ 偶校验错 ------*/
};
/*====================================================================================================*/
/*-----------------------------显示部分---------------------------------------------------------------*/
/*----------------------------------------------------------------------------------------------------*/
scanin(); /*------ 输入键扫描 ------*/
steout0_7(pb_out[0]); /*------ PROFIBUS输出数据第一个字节送Q0-Q7显示 ------*/
steout8_15(pb_out[1]); /*------ PROFIBUS输出数据第一个字节送Q0-Q7显示 ------*/
};/*for(;;)*/
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -