📄 user.c
字号:
P0=di8_15;
P0=di8_15;
inled8_15=1;
inled8_15=0;
}
/*==================================================================================================================*/
/* 主程序 */
/*------------------------------------------------------------------------------------------------------------------*/
void main ()
{
UBYTE data i,j,k,x,y,count,frist;
UWORD data nw,nn;
UBYTE xdata * data p; /* xdata指针 */
UBYTE data address; /*---------从站地址 ---------*/
UBYTE data re_er; /*---------字符偶校验错 ---------*/
UBYTE data br_num; /*---------串口波特率号 ---------*/
UBYTE data error; /*---------校验和错 ---------*/
UBYTE xdata rebox[113]; /*---------串口接收缓冲 ---------*/
UBYTE xdata trbox[113]; /*---------串口发送缓冲 ---------*/
UBYTE xdata pb_out[112]; /*---------PROFIBUS输出数据区 ---------*/
UBYTE xdata pb_in[112]; /*---------PROFIBUS输入数据区 ---------*/
UBYTE xdata user_prm[41]; /*---------PROFIBUS用户参数区 ---------*/
UBYTE data data_in_len; /*---------数据交换输入(实验板发送)数据长度 ---------*/
UBYTE data dil; /*---------不包括校验和的data_in_len长度 ---------*/
UBYTE data data_out_len; /*---------数据交换输出(实验板接收)数据长度 ---------*/
UBYTE data dol; /*---------不包括校验和的data_out_len长度 ---------*/
UBYTE data user_prm_len; /*---------用户参数长度 ---------*/
UBYTE data se_er; /*---------OEM2-SE接收数据错误类型号 ---------*/
P1=0xff;
P0=0;
P2=0xf0;
di0_7=di8_15=0;
steout0_7(0); /*---------输出指示灯Q0-Q7清零 ---------*/
steout8_15(0); /*---------输出指示灯Q8-Q15清零 ---------*/
steinled0_7(0); /*---------输入键指示灯ILED0-ILED7清零 ---------*/
steinled8_15(0); /*---------输入键指示灯ILED8-ILED15清零 ---------*/
/*======================================================= =====================*/
/* 以下是实验板上电后,检测P89C51RD2单片机内部RAM的一段输出演示程序; */
/* 这段程序与PROFIBUS接口板SE通信无关,用户可跳过此段程序。 */
/*-----------------------------------------------------------------------------*/
/* 这段程序在仿真器上运行的话内存检查始终不正确 */
p=0;
x=1;
k=1;
//共检查 24*32字节内存
for (j=0;j<32;j++)
{
for (i=0;i<24;i++)
{
*(p+i)=0xaa;
};
y=0;
for (i=0;i<24;i++)
{
count=*(p+i);
if (count!=0xaa) { y=1; };
};
if (y==0) /* 该段内存正确,跑流水灯 */
{
switch (k)
{
case 1:{ steout0_7(x);};break;
case 2:{ steout8_15(x);};break;
case 3:{ steinled0_7(x);};break;
case 4:{ steinled8_15(x);};break;
default:break;
};
if (x<255) {x=x*2+1;}else{x=1;k++;};
}
else /* 该段内存不正确,四块灯全闪 */
{
for (;;)
{
for (nw=0;nw<6000;nw++)
{
steout0_7(0);
steout8_15(0);
steinled0_7(0);
steinled8_15(0);
};
for (nw=0;nw<6000;nw++)
{
steout0_7(0xff);
steout8_15(0xff);
steinled0_7(0xff);
steinled8_15(0xff);
};
};
};
p=p+24;
for (nw=0;nw<18000;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;
/*--------------------------------------------------------------------------------------*/
/* 例2 半握手通信方式 */
/*======================================================================================*/
while (REQ_IT==1) /* 定义REQ_IT=P1^7=P1.7=P17S_CTS,输入,连接OEM2-SE-REQ_IT,见实验板原理图CONNECT-16 ---*/
{
/*====================================================================================*/
/* 形成接口板的初始化报文 */
/* 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; /*----置校验和 ---------*/
/*====================================================================================*/
/* 发送接口板的初始化报文、接收接口板的回答,初始不成功继续发初始化报文 */
/*------------------------------------------------------------------------------------*/
while (S_RTS==1) {}; /*---- P1.6=S_RTS=1:SE没有准备好接收 ---------*/
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) {};
};
while (S_RTS==0) { }; /*---- SE 没有接收完毕 ---------*/
/*---------发送完毕、等待接收回答-----------------------------------------------------*/
RI=0;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -