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

📄 main.lst

📁 CAN转232及485的通讯卡程序,调试通过
💻 LST
📖 第 1 页 / 共 3 页
字号:
 431          void Changetoadr(void)
 432          {
 433   1              unsigned char i,temp[4];
 434   1              for(i=0;i<4;i++)
 435   1              temp[i]=TCandata[i+1];
 436   1              TCandata[1] = temp[0]>>3;
 437   1              TCandata[2] = (temp[0]<<5 | temp[1]>>3);
 438   1              TCandata[3] = (temp[1]<<5 | temp[2]>>3);
 439   1              TCandata[4] = (temp[2]<<5 | temp[3]>>3);
 440   1      } 
 441          
 442          /*
 443          *********************************************************************************************************
 444          * 
 445          * 函数名称:main
 446          *       
 447          * 输入变量:无
 448          * 
 449          * 输出变量:无
 450          * 
 451          * 功能描述:主循环函数,通常是一个无限循环
 452          *       
 453          *********************************************************************************************************
 454          */
 455          void main(void)
 456          {  
 457   1              unsigned char i;
 458   1              DisableInterrupt();
 459   1        AUXR = 0x00;
 460   1              CpuInit();
 461   1              SjaInit();      
 462   1              EnalbeInterrupt();
 463   1      
 464   1              AUXR = 0x01;
 465   1              ucCircle = 0;
 466   1              bSjaReceived = FALSE;
 467   1              int_flag_232 = 1;
 468   1              int_flag_485 = 1;
 469   1              int_232=0;
 470   1              int_485=0;
 471   1              rx_232=0;
 472   1              rx_232=0;
 473   1              rx_flag_232 = 0;
 474   1              rx_flag_485 = 0;
 475   1              length_485 = 0;
 476   1              length_232 = 0;
 477   1        Control485=0;
 478   1        LED=0;
 479   1              while (1)  
 480   1              {               
 481   2                      LED^=1; //喂狗
 482   2      /////////////////////////////从232接收,发送到can,485///////////////////////////////////
 483   2                      if (rx_flag_232 == 1 || RCount_232 > TCount_232)   //232接收完成或还存在没发送出去的数据
 484   2                      {        
 485   3              if(int_flag_485) //一帧完整的数据通过485发送完了吗?
 486   3                                      {
 487   4                                              Control485 = 1;    //485为发送模式;
 488   4                                              for(i=0;i<13;i++) 
C51 COMPILER V8.08   MAIN                                                                  01/04/2009 14:39:12 PAGE 9   

 489   4                                              TCandata[i]=rec_232_R[BagCount_T_232][i]; //把存在外RAM的232数据调到内RAM,供CAN,485发送用
 490   4                                              SjaSend(TCandata);  //继续发送232已经接收到的数据到CAN 
 491   4                                              Sendto485(TCandata);//继续发送232已经接收到的数据到485
 492   4                                              TCount_232++; //累计发送次数
 493   4                                              BagCount_T_232++; //成功发送了前一232的数据,数据指针加一,开始发送没发送出去的数据
 494   4                                              if(BagCount_T_232>BadLenght) //计数已到最大值,重新开始从第一位读取接收回来的232数据
 495   4                                              BagCount_T_232=0;
 496   4                                              int_flag_485=0;  //清484接收完成标志
 497   4                                      }
 498   3                                rx_flag_232 = 0; //清232接收完成标志                  
 499   3                } 
 500   2                else
 501   2          {
 502   3              TCount_232 = 0;
 503   3              RCount_232 = 0;
 504   3          }   
 505   2      ///232成功发送一字节数据//
 506   2          if(int_232)
 507   2          {
 508   3                              if((length_232--)>0)
 509   3                              {
 510   4                                      send_232++;  //发送指针指向下一要发送数据的地址
 511   4                                      SBUF=*send_232; //发送  
 512   4                              }
 513   3                              else
 514   3                              {
 515   4                                      int_flag_232=1;//一帧数据发送完成
 516   4                              }        
 517   3            int_232=0;
 518   3                }                     
 519   2                        
 520   2      ///232成功接收一字节数据//
 521   2          if(rx_232)
 522   2          {
 523   3              TR0=1; //开定时器0,(10MS后如果还没接收完13位数据就把之前接收的舍去)
 524   3                              rec_232_R[BagCount_R_232][length_232_R] = SBUF;  //接收数据到232数据缓冲区
 525   3                              length_232_R++;            //232接收个数加1
 526   3                              if(length_232_R == 13)     //接收完13个数据?(数据包括:4位ID, 1位的CAN数据长度,8位的CAN数据)
 527   3                                      {
 528   4                                              TR0=0;  //关定时器0,已经接收到13位数据了
 529   4                                        TH0  = 0Xdc;  //10MS定时赋初值
 530   4                                              TL0  = 0X00; 
 531   4                                              rx_flag_232 = 1;      //成功接收,,置232成功接收标志,可以对CAN ,485发送了
 532   4                                              length_232_R = 0;     //232接收个数计数清0;
 533   4                                              RCount_232++;
 534   4                                              BagCount_R_232++;         //数据包计数加1
 535   4                                              if(BagCount_R_232>BadLenght)   //232接收缓冲区已满,调回到第一个区继续接收;
 536   4                                              BagCount_R_232=0;
 537   4                                      }                       
 538   3                              rx_232=0;
 539   3                }
 540   2                   
 541   2      
 542   2                 
 543   2            
 544   2      //////////////////////////////从485接收,发送到can,232///////////////////////////////////
 545   2                      if (rx_flag_485 == 1 || RCount_485 > TCount_485 ) //485接收完成或485成功接收回来的数据都发送出去了吗?
 546   2                      {       
 547   3                                      if(int_flag_232) //一帧完整的数据通过232发送完了吗?
 548   3                                      {
 549   4                                              for(i=0;i<13;i++) 
 550   4                                              TCandata[i]=rec_485_R[BagCount_T_485][i]; 
C51 COMPILER V8.08   MAIN                                                                  01/04/2009 14:39:12 PAGE 10  

 551   4                                              SjaSend(TCandata);  //继续发送485已经接收到的数据到CAN 
 552   4                                              Sendto232(TCandata);//继续发送485已经接收到的数据到232
 553   4                                              TCount_485++; 
 554   4                                              BagCount_T_485++; //成功发送了前一485的数据,数据指针加一,开始发送没发送出去的数据
 555   4                                              if(BagCount_T_485>BadLenght)
 556   4                                              BagCount_T_485=0;
 557   4                                              int_flag_232=0;  //清232接收完成标志
 558   4                                      }
 559   3                                rx_flag_485 = 0; //清485接收完成标志
 560   3                      }    
 561   2          else
 562   2          {
 563   3              TCount_485 = 0;
 564   3              RCount_485 = 0;
 565   3          }
 566   2      ///485成功发送一帧数据//
 567   2                if(int_485)
 568   2                {
 569   3                      if((length_485--)>0)
 570   3                              {
 571   4                                      send_485++;  //发送指针指向下一要发送数据的地址
 572   4                                      SBUF1 = *send_485; //发送
 573   4                              }
 574   3                              else
 575   3                              {
 576   4                                      int_flag_485 = 1;//发送完成,允许发送新数据      
 577   4                                      Control485 = 0;    //485已经把数据发送完毕,把模式转为接收;
 578   4                                      length_485_R = 0;
 579   4                              }
 580   3                      int_485=0;
 581   3                }
 582   2                
 583   2      ///485成功接收一字节数据//      
 584   2          if(rx_485)
 585   2          {
 586   3              TR0=1;   //开定时器0,(10MS后如果还没接收完13位数据就把之前接收的舍去)
 587   3              rec_485_R[BagCount_R_485][length_485_R] = SBUF1;  //接收数据到485数据缓冲区
 588   3              length_485_R++; //485接收个数加1      
 589   3                              if(length_485_R == 13)     //接收完13个数据?(数据包括4位ID, 1位的CAN数据长度,8位的CAN数据)
 590   3                              {
 591   4                                        TR0=0; //关定时器0,已经接收到13位数据了
 592   4                                        TH0  = 0Xdc;  //10MS定时赋初值
 593   4                                              TL0  = 0X00; 
 594   4                                              rx_flag_485 = 1;      //成功接收,可以发送了,置485成功接收标志
 595   4                                              length_485_R = 0;      //485字节接收数清0;
 596   4                                              RCount_485++;          //485帧计数加1;
 597   4                                              BagCount_R_485++;         //数据包计数加1
 598   4                                              if(BagCount_R_485>BadLenght)   //485接收缓冲区已满,调回到第一个区继续接收;
 599   4                      BagCount_R_485=0;
 600   4                              }       
 601   3                              rx_485=0;               
 602   3                      }               
 603   2           
 604   2       
 605   2                           
 606   2      ///////////////////从can接收,发送到485,232////////////////////////
 607   2                      if (bSjaReceived ||RCount_CAN > TCount_CAN ) 
 608   2                      { 
 609   3                              if(int_flag_232&&int_flag_485) //485,232把一帧完整的数据发送完成了吗?
 610   3                              {
 611   4                                      Control485 = 1;    //485为发送模式;
 612   4                                      for(i=0;i<13;i++)   //外RAM的CAN数据调到内RAM
C51 COMPILER V8.08   MAIN                                                                  01/04/2009 14:39:12 PAGE 11  

 613   4                                      TCandata[i]=Candata_R[Bagcount_T_CAN][i];
 614   4                                      Changetoadr();  //把CAN接收的地址转换为232,485能识别的地址
 615   4                                      Sendto232(TCandata);   //发送数据到232
 616   4                                      Sendto485(TCandata);   //发送数据到485
 617   4                                      TCount_CAN++;    //CAN发送次数加1
 618   4                                      Bagcount_T_CAN++;   //CAN发送指针加1
 619   4                                      if(Bagcount_T_CAN>BadLenght_can)  //CAN发送指针溢出
 620   4                                      Bagcount_T_CAN=0;  //重置CAN发送指针
 621   4                                      int_flag_232=0;   //清232发送完成标志
 622   4                                      int_flag_485=0;  //清485发送完成标志
 623   4                              }
 624   3                              bSjaReceived=0;         
 625   3                      }
 626   2          else
 627   2              {
 628   3                      RCount_CAN=0;
 629   3                      TCount_CAN=0;
 630   3              }
 631   2              }
 632   1      }
 633          
 634          


MODULE INFORMATION:   STATIC OVERLAYABLE
   CODE SIZE        =   1572    ----
   CONSTANT SIZE    =     37    ----
   XDATA SIZE       =    780    ----
   PDATA SIZE       =   ----    ----
   DATA SIZE        =     41       4
   IDATA SIZE       =     10    ----
   BIT SIZE         =   ----    ----
END OF MODULE INFORMATION.


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

⌨️ 快捷键说明

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