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

📄 user.lst

📁 Philips单片机P89C51RD和西门子Profibus工业总线的接口程序,硬件是鼎实公司的实验板,使用的鼎实公司的总线桥.
💻 LST
📖 第 1 页 / 共 3 页
字号:
 476   3         for (j=0;j<49;j++)
 477   3         {                                /*---- 接受回答报文共49个字节             ---------*/
 478   4           nw=0;
 479   4           while ((RI==0)&&(S_RTS==1)) {}; /*---- SE正在发送、实验板正在接收一个字符 ---------*/
 480   4           if (RI==1)
 481   4            {/*---- RI==1:实验板接收到一个字符 ---------*/
 482   5             ACC=SBUF;
 483   5             if (P!=RB8){ re_er=1;};           /*---- 偶校验错,置偶校验错标志           ---------*/           
 484   5             rebox[j]=SBUF;                    /*---- 接收一个字符送串口输入缓冲区       ---------*/
 485   5             RI=0;
 486   5            }
 487   4           else
 488   4            {/*---- (RI==0)&&(S_RTS==0):SE报文全部发送完毕而实验板还没有接收到预期的长度 ---------*/
 489   5             j=100;                            /*---- 退出等待接收                       ---------*/
 490   5            }
 491   4        };
 492   3        //WQY DEBUG:调试通过
 493   3        //pb_out[0]=rebox[0];
 494   3        //pb_out[1]=rebox[48];
 495   3        //steout0_7(pb_out[0]);
 496   3        //steout8_15(pb_out[1]);
 497   3        //for(;;) {};
 498   3      
 499   3      /*--------------- 接收回答报文结束         -------------------------------------------*/
 500   3      /*--------------- 以下分析接口板SE的回答报文 -----------------------------------------*/
 501   3      if (j==49)
 502   3      { /*---- (j==49):实验板接收回答报文长度正确 ---------*/
 503   4       if (re_er==0)                    /*---- 没有字符偶校验错?                  ---------*/
 504   4        {
 505   5          x=0;
 506   5          for (i=0;i<48;i++)            /*---- 求校验和                           ---------*/
 507   5          {
 508   6            x=x+rebox[i];
 509   6           };
 510   5          if (x==rebox[48])
 511   5           {                            /*---- 校验和正确?                       ----------*/
 512   6            if (rebox[0]==br_num)       /*---- 返回的波特率号是5?                ----------*/     
 513   6             { 
 514   7              if (rebox[1]==0)          /*---- 初始化报文错误号N=0?              ----------*/   
 515   7               {
 516   8                x=0;
 517   8                for (i=2;i<48;i++)      /*---- byte2~byte47都是0xaa?             ----------*/
 518   8                 {
 519   9                  if (rebox[i]!=0xaa)
 520   9                   {
 521  10                    x=1;
 522  10                   };
 523   9                 };
 524   8                if (x==0)
 525   8                 {                     
 526   9                 y=1;                 /*---- byte2~byte47都是0xaa,初始化成功,y=1,准备退出while (y==0) ----*/  
 527   9                 }
 528   8                else
 529   8                 {x=0x11;};            /*---- byte2~byte47不都是0xaa!错误标记=0x11;                   ----*/
C51 COMPILER V7.20   USER                                                                  01/23/2006 13:26:51 PAGE 10  

 530   8               }
 531   7              else
 532   7               {x=rebox[1];};          /*---- 初始化报文错误号N<>0,错误标记=返回错误号                ----*/
 533   7             }
 534   6            else
 535   6             {x=0x77;};                /*---- 返回的波特率号不是5, 错误标记=0x77;                      ----*/
 536   6           }
 537   5          else
 538   5           {x=0xff;};                  /*---- 校验和不正确正确,    错误标记=0xff;                      ----*/
 539   5         }
 540   4        else
 541   4        {x=0xee;};                     /*---- 发生了字符偶校验错   错误标记=0xee;                      ----*/
 542   4       }
 543   3      else
 544   3       {
 545   4        x=0xcc;                        /*---- j!=49发生了接收报文长度错   错误标记=0xee;               ----*/
 546   4       };
 547   3      
 548   3       if (y==0)
 549   3        {                              /*---- 初始化失败       ----*/
 550   4         for (nw=0;nw<10000;nw++)
 551   4         {
 552   5          steout0_7(br_num);           /*---- 显示返回波特率号 ----*/
 553   5          steout8_15(x);               /*---- 显示返回错误号   ----*/
 554   5         };
 555   4        }; 
 556   3              
 557   3       }; /*---- 如果y==0,返回while (y==0) ----*/
 558   2      
 559   2      //WQY DEBUG:运行正确时y=1,x=0。该段程序调试正确。
 560   2      //steout0_7(y);
 561   2      //steout8_15(x);
 562   2      //for(;;) {};
 563   2      
 564   2      
 565   2      
 566   2      
 567   2      
 568   2      
 569   2      /*==================================================================================================*/
 570   2      /*               实验板对PROFIBUS接口板初始化成功,进数据交换状态的无限循环中                       */
 571   2      /*               trbox[]/rebox[]是串口发送/接收数组,发送/接收格式见《SE手册》                      */
 572   2      /*--------------------------------------------------------------------------------------------------*/
 573   2      
 574   2      dil=data_in_len-1;                  /*---- data_in_len=50, dil=49                               ----*/
 575   2      dol=data_out_len-1;                 /*---- data_out_len==50, dol==49                            ----*/
 576   2      for (i=0;i<data_in_len;i++)
 577   2        {
 578   3          trbox[i]=0;                     /*---- 清发送、接收缓冲区                                   ----*/
 579   3        };
 580   2      for (i=0;i<data_out_len;i++)
 581   2        {
 582   3          rebox[i]=0;                     /*---- 清发送、接收缓冲区                                   ----*/
 583   3        };
 584   2       
 585   2      /*=============================== 进数据交换状态的无限循环中 =======================================*/
 586   2      while (REQ_IT==0) 
 587   2      { /*---- (REQ_IT==0):SE处在数据交换状态  ------*/
 588   3       trbox[0]=req_com=0;           /*---- 没有用户参数,请求数据命令永远是req_com=0,只请求A型报文  ------*/
 589   3       trbox[1]=di0_7;               /*---- di0_7是输入键输入I0~I7当前值,作为PROFIBUS输入的第1字节   ------*/
 590   3       trbox[2]=di8_15;              /*---- di8_15是输入键输入I8~I15当前值,作为PROFIBUS输入的第2字节 ------*/
 591   3       //WQY DEBUG
C51 COMPILER V7.20   USER                                                                  01/23/2006 13:26:51 PAGE 11  

 592   3       //trbox[1]=0x11;
 593   3       //trbox[2]=oxff;
 594   3      
 595   3       for (i=3;i<dil;i++)
 596   3        {
 597   4         trbox[i]=0x5a;              /*---- 其它PROFIBUS输入数据(3~48)本例定为0x5a                    ------*/
 598   4        };
 599   3      
 600   3       x=0;
 601   3       for (i=0;i<dil;i++)           /*---- 求校验和                                                  ------*/
 602   3        {
 603   4         x=x+trbox[i];
 604   4        };
 605   3       trbox[dil]=x;                 /*---- 置校验和                                                  ------*/
 606   3        
 607   3       REN=0;
 608   3       
 609   3       while (S_RTS==1) {};          /*---- S_RTS==1:接口板没有准备好接收数据                        ------*/ 
 610   3       
 611   3       for (i=0;i<data_in_len;i++)   /*---- 发送数据交换报文共50字节                                  ------*/
 612   3        {
 613   4          TI=0;
 614   4          ACC=trbox[i];
 615   4          TB8=P;                     /*---- 形成偶校验位                                              ------*/
 616   4          SBUF=trbox[i];
 617   4          while (TI==0) {};    
 618   4        };
 619   3      
 620   3       while (S_RTS==0) {};          /*---- SE 没有接收完毕                                           ------*/
 621   3      
 622   3      /*=============================发送数据交换报文结束,等待接收接口板SE的回答。=========================*/
 623   3      
 624   3      re_er=0;                            /*------ re_er偶校验错标志                                 ------*/
 625   3       RI=0;
 626   3       REN=1;                              /*------ 允许接收                                          ------*/
 627   3       for (j=0;j<data_out_len;j++ )       /*------ 等待接收接口板的回答数据交换报文共50字节          ------*/
 628   3       {
 629   4           while ((RI==0)&&(S_RTS==1)) {}; /*---- SE正在发送、实验板正在接收一个字符                  ------*/
 630   4           if (RI==1)
 631   4            {/*---- RI==1:实验板接收到一个字符 ---------*/
 632   5             ACC=SBUF;
 633   5             if (P!=RB8) {re_er=1;};       /*------ 偶校验错,置偶校验错标志                          ------*/
 634   5             rebox[j]=SBUF;                /*------ 接收一个字符送串口输入缓冲区                      ------*/
 635   5             RI=0;
 636   5            }
 637   4           else
 638   4            {/*---- (RI==0)&&(S_RTS==0):SE报文全部发送完毕而实验板还没有接收到预期的长度 ---------*/
 639   5             j=data_out_len+1;             /*---- 退出等待接收                       ---------*/
 640   5            };
 641   4        };
 642   3      
 643   3      //WQY DEBUG: 一次数据通信 
 644   3      //trbox[]中数据发送给接口板,从接口板接收数据至rebox[]
 645   3      //pb_out[0]=rebox[1];
 646   3      //pb_out[1]=rebox[2];
 647   3      //steout0_7(pb_out[0]);
 648   3      //steout8_15(pb_out[1]);
 649   3      //for(;;) {};
 650   3      
 651   3      
 652   3      
 653   3      /*=============================接收完毕===============================================================*/
C51 COMPILER V7.20   USER                                                                  01/23/2006 13:26:51 PAGE 12  

 654   3      
 655   3      if (j==data_out_len)
 656   3      {/*---- (j==data_out_len):实验板接收回答报文长度正确 ---------*/
 657   4       if (re_er==0)
 658   4        {                                  /*------ 无偶校验错                                        ------*/ 
 659   5            x=0;
 660   5            for (i=0;i<dol;i++)
 661   5             {
 662   6               x=x+rebox[i];               /*------ 求校验和                                          ------*/ 
 663   6             };
 664   5            if (x==rebox[dol])
 665   5             {
 666   6                y=dol-1;                   /*------ y=49-1=48,PROFIBUS输出数据长度                    ------*/
 667   6                for (i=1;i<dol;i++)
 668   6                 {
 669   7                  pb_out[i-1]=rebox[i];    /*------ 接收到的48个PROFIBUS输出数据送数据区pb_out[0~47]  ------*/ 
 670   7                 };
 671   6             }
 672   5            else
 673   5             {
 674   6              error=0x81;                  /*------ 校验和错                                          ------*/
 675   6             };
 676   5        }
 677   4       else
 678   4        {
 679   5          error=0x83;                      /*------ 偶校验错                                          ------*/
 680   5        };
 681   4       }
 682   3      else
 683   3       {
 684   4        error=0x84;                        /*------ 接收字符数不够                                   ------*/
 685   4       };
 686   3      /*====================================================================================================*/
 687   3      /*-----------------------------显示部分---------------------------------------------------------------*/
 688   3      /*----------------------------------------------------------------------------------------------------*/
 689   3       
 690   3       scanin();                           /*------ 输入键扫描                                        ------*/
 691   3       steout0_7(pb_out[0]);               /*------ PROFIBUS输出数据第一个字节送Q0-Q7显示             ------*/
 692   3       steout8_15(pb_out[1]);              /*------ PROFIBUS输出数据第一个字节送Q0-Q7显示             ------*/
 693   3        
 694   3      };/*---- while (REQ_IT==0):SE处在数据交换状态,返回数据交换状态的无限循环中  ------*/
 695   2      };/*---- (REQ_IT==1):SE退出数据交换状态,返回初始化                          ------*/
 696   1      }
*** WARNING C280 IN LINE 252 OF USER.C: 'frist': unreferenced local variable
*** WARNING C280 IN LINE 253 OF USER.C: 'nn': unreferenced local variable
*** WARNING C280 IN LINE 263 OF USER.C: 'user_prm': unreferenced local variable
*** WARNING C280 IN LINE 269 OF USER.C: 'se_er': unreferenced local variable
 697          
 698          
 699          
 700          
 701          
 702          
 703          
 704          
 705          
 706          
 707          


MODULE INFORMATION:   STATIC OVERLAYABLE
   CODE SIZE        =   1596    ----
C51 COMPILER V7.20   USER                                                                  01/23/2006 13:26:51 PAGE 13  

   CONSTANT SIZE    =   ----    ----
   XDATA SIZE       =   ----     491
   PDATA SIZE       =   ----    ----
   DATA SIZE        =      7      24
   IDATA SIZE       =   ----    ----
   BIT SIZE         =   ----    ----
END OF MODULE INFORMATION.


C51 COMPILATION COMPLETE.  4 WARNING(S),  0 ERROR(S)

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -