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

📄 user.c

📁 Philips单片机P89C51RD和西门子Profibus工业总线的接口程序,硬件是鼎实公司的实验板,使用的鼎实公司的总线桥.
💻 C
📖 第 1 页 / 共 3 页
字号:
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 + -