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

📄 wqy.c

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