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

📄 basiccan_final1.lst

📁 设计了一个基于51单片机的CAN节点
💻 LST
📖 第 1 页 / 共 4 页
字号:
 397   2            return 1;
 398   2         }
 399   1         
 400   1         SJA_BCANAdr = REG_RxBuffer2;             //访问地址指向接收缓冲区2
 401   1         if((*SJA_BCANAdr&0x10)==0)               //如果是数据帧
 402   1         {
 403   2           TempCount=(*SJA_BCANAdr&0x0f)+2;       //计算报文中数据的个数
 404   2         }
 405   1         
 406   1         else
 407   1         {
 408   2          TempCount=2;
 409   2         }
 410   1         SJA_BCANAdr = REG_RxBuffer1;             //访问地址指向接收缓冲区1
 411   1         memcpy(RcvDataBuf,SJA_BCANAdr,TempCount);//读取接收缓冲区的报文
 412   1         return  0;
 413   1       }
 414          
 415          
 416          
 417          /************************************************************************
 418           *函数原型:  bit  BCAN_CMD_PRG(uchar cmd)             *
 419           *参数说明:  cmd:sja1000运行的命令字                                    *
 420           *             01:发送请求                                              *
 421           *             02:中止发送                                             *
 422           *             04:释放接收缓冲区                                       *
 423           *             08:清除超载状态                                         *
 424           *             0x10:进入睡眠状态                                        *
C51 COMPILER V6.23a  BASICCAN_FINAL1                                                       09/20/2008 12:27:03 PAGE 8   

 425           *                                                                      *
 426           *返回值:                                                               *
 427           *           0 ; 表示命令执行成功                                       *
 428           *           1 ; 表示命令执行失败                                       *
 429           *                                                                      * 
 430           *说明:      执行sja1000命令                                            * 
 431           ************************************************************************/ 
 432          
 433           bit  BCAN_CMD_PRG(uchar cmd)
 434           {
 435   1         SJA_BCANAdr=REG_COMMAND;            //访问地址指向命令寄存器
 436   1         *SJA_BCANAdr=cmd;                   //启动命令字
 437   1         switch(cmd)
 438   1         {
 439   2           case  TR_CMD:                     //发送请求命令
 440   2                 return    0;
 441   2                 break;
 442   2           case  AT_CMD:                     //夭折发送命令 
 443   2                 SJA_BCANAdr = REG_STATUS;   //访问地址指向状态寄存器   
 444   2                 if((*SJA_BCANAdr & 0x20)==0)//判断是否正在发送
 445   2                 {
 446   3                    return  0;
 447   3                 }
 448   2                 else
 449   2                 {
 450   3                    return  1;
 451   3                 }   
 452   2                 break; 
 453   2           case  RRB_CMD:                    //释放接收缓冲区 
 454   2                 SJA_BCANAdr = REG_STATUS;   //访问地址指向状态寄存器   
 455   2                 if((*SJA_BCANAdr & 0x01)==1)//判断是否释放成功
 456   2                 {
 457   3                   return  1;
 458   3                 }
 459   2                 else
 460   2                 {
 461   3                    return  0;
 462   3                 }   
 463   2                 break; 
 464   2        
 465   2           case  COS_CMD:                    //清除超载状态
 466   2                 SJA_BCANAdr = REG_STATUS;   //访问地址指向状态寄存器   
 467   2                 if((*SJA_BCANAdr & 0x02)==0)//判断清除超载是否成功
 468   2                 {
 469   3                   return  0;
 470   3                 }
 471   2                 else
 472   2                 {
 473   3                    return  1;
 474   3                 }   
 475   2                 break; 
 476   2           
 477   2           case  GTS_CMD:                    //进入睡眠状态命令 
 478   2                 return    0;
 479   2                 break; 
 480   2           default:
 481   2                   return  1;
 482   2                   break; 
 483   2         }
 484   1      
 485   1       }
 486          
C51 COMPILER V6.23a  BASICCAN_FINAL1                                                       09/20/2008 12:27:03 PAGE 9   

 487           void delay(unsigned int i)
 488          {
 489   1        unsigned int j;
 490   1        for(;i>0;i--)
 491   1        for(j=0;j<125;j++);  
 492   1      }
 493          
 494           
 495          void display(uint something)
 496          {       
 497   1              uchar gewei,shiwei,baiwei,qianwei;
 498   1      
 499   1              EA=0;
 500   1      
 501   1              gewei=something%10;
 502   1              shiwei=something/10%10;
 503   1              baiwei=something/100%10;
 504   1              qianwei=something/1000%10;
 505   1      
 506   1              if(qianwei!=0)
 507   1              {
 508   2                      P14=0;
 509   2                      P15=0;
 510   2                      P17=1;
 511   2                      P0=~dispbitcode[qianwei];
 512   2              P17=0;
 513   2              delay(5);
 514   2              }
 515   1              
 516   1              if((baiwei!=0)|((baiwei==0)&(qianwei!=0)))
 517   1              {
 518   2                      P14=1;
 519   2                      P15=0;
 520   2                      P17=1;
 521   2                      P0=~dispbitcode[baiwei];
 522   2              P17=0;
 523   2              delay(5);
 524   2              }
 525   1      
 526   1              if((shiwei!=0)|((shiwei==0)&((qianwei!=0)|(baiwei!=0))))
 527   1              {
 528   2                      P14=0;
 529   2                      P15=1;
 530   2                      P17=1;
 531   2                      P0=~dispbitcode[shiwei];
 532   2              P17=0;
 533   2              delay(5);
 534   2              }
 535   1      
 536   1              P14=1;
 537   1              P15=1;
 538   1              P17=1;
 539   1              P0=~dispbitcode[gewei];
 540   1          P17=0;
 541   1          delay(5);
 542   1              
 543   1              EA=1;
 544   1      }
 545          
 546          
 547          /*void u2_to_u10(uchar change_data)
 548          {
C51 COMPILER V6.23a  BASICCAN_FINAL1                                                       09/20/2008 12:27:03 PAGE 10  

 549                  dispbuf[3]=change_data/1000;//将change_data的个位,十位,百位,千位分别存放在SetSystemBuf中
 550                  change_data=change_data%1000;
 551                  dispbuf[2]=change_data/100;
 552                  change_data=change_data%100;
 553                  dispbuf[1]=change_data/10;
 554                  dispbuf[0]=change_data%10;
 555          }*/
 556          
 557          //初始化SJA_1000,设置相关参数
 558           uchar  SJA_1000_Init(void)
 559          { 
 560   1        uchar data status=0;
 561   1        delay(10);
 562   1      
 563   1        BandRateBuf = ByteRate_1000k;//默认波特率为1000k
 564   1      
 565   1        BCAN_ENTER_RETMODEL();//使CAN控制器进入复位工作模式
 566   1      
 567   1        if(BCAN_CREATE_COMMUNATION())//检测CAN控制器的接口是否正常,若返回1,则不正常
 568   1          {
 569   2          status = CAN_INTERFACE_ERR;
 570   2          return(status);
 571   2        }
 572   1      
 573   1        if(BCAN_SET_BANDRATE(BandRateBuf))//初始化系统默认值波特率1000kbps,若返回1,表示波特率未能设置
 574   1        {
 575   2              status=CAN_INITBTR_ERR;
 576   2              return(status);
 577   2        }
 578   1      
 579   1        if(BCAN_SET_OBJECT(0xaa,0xff))//设置检收代码寄存器(ACR)、接收屏蔽寄存器(AMR)的参数
 580   1                                      //0xff表示检收代码寄存器所有的位对检收滤波器是“无关的”
 581   1        {
 582   2          status =CAN_INITOBJECT_ERR;
 583   2          return(status);
 584   2        }
 585   1      
 586   1      //输出控制寄存器OCR=0xaa表示采用正常输出模式,TX1悬空,时钟分频寄存器CDR=0x48表示采用BasicCAN模式,CBP被
             -置位,
 587   1      //只有RX0起作用。CLOCK OFF置1使外部CLKOUT引脚失效 
 588   1        if(BCAN_SET_OUTCLK(0xaa,0x48))//设置SJA1000的输出模式和时钟分频
 589   1        {
 590   2          status =CAN_INITOUTCTL_ERR;
 591   2          return(status);
 592   2        }
 593   1      
 594   1        if(BCAN_QUIT_RETMODEL())//使CAN控制器退出复位工作模式
 595   1        {
 596   2          status = CAN_QUITRESET_ERR;
 597   2          return(status);
 598   2        }
 599   1        

⌨️ 快捷键说明

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