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

📄 bcan1.asm

📁 实现CAN总线的接收,发送,故障处理,处理器采用的是STC89C58RD,是中央空调控制系统的下位机程序的一部分.
💻 ASM
📖 第 1 页 / 共 2 页
字号:
      CLR            F0                                 ;接口正确
BCAN_CM_QUIT:
      RET                    


BCAN_ENTER_RETMODEL:
      MOV            DPTR,   #REG_CONTROL       ;控制寄存器访问  
      MOVX           A,      @DPTR              ;
      ORL            A,      #01H               ;置位复位请求
      MOVX           @DPTR,  A                              ;
      CLR            F0
      MOVX           A,      @DPTR              ;验证复位是否写入
      JB             ACC.0,  BCAN_ER_QUIT
      SETB           F0                         ;复位不成功
BCAN_ER_QUIT:
      RET



BCAN_QUIT_RETMODEL:
      MOV            DPTR,   #REG_CONTROL   ; 控制寄存器访问  
      MOVX           A,      @DPTR          ;
      ANL            A,      #0FEH          ;清零复位请求,进入工作状态
      MOVX           @DPTR,  A
      CLR            F0
      MOVX           A,      @DPTR           
      JNB            ACC.0,  BCAN_QR_QUIT   ;验证是否退出复位状态
      SETB           F0
BCAN_QR_QUIT:
      RET


BCAN_DATA_WRITE:
      MOV            DPTR,#REG_STATUS  ;读取状态寄存器
      MOVX           A,@DPTR        ;判断上次发送是否完成
      JNB            ACC.3,BCAN_DW_QUIT ;正在发送退出
      MOVX           A,@DPTR        ;判断发送缓冲区是否锁定,
      JNB            ACC.2,BCAN_DW_QUIT ;锁定则跳出                     
           
      INC            R0                   ;
      MOV            A,@R0          ;ID号的低3位 \RTR位 \数据长度DLC
      DEC            R0                   ;恢复指针指向发送数据的首地址
      MOV            DPTR,#REG_TxBuffer1;发送缓冲区首地址

      JB             ACC.4,BCAN_WYB     ;远程帧
      ;数据帧
      ANL            A,#0FH         ;计算发送数据的长度
      ADD            A,#02H
      MOV            R7,A
      AJMP           BCAN_WRTXBUF         ;
 
BCAN_WYB:
      MOV            R7,     #02H          ;写入发送缓冲区数据长度为2

BCAN_WRTXBUF:      
      MOV            A,      @R0          ;开始写入
      MOVX           @DPTR,  A
      SETB           F0
      MOVX           A,      @DPTR        ;校验写入的是否正确
      XRL            A,      @R0
      JNZ            BCAN_DW_QUIT         ;写入错误退出
      CLR            F0                   ;正确写入继续
      INC            R0
      INC            DPTR
      DJNZ           R7,     BCAN_WRTXBUF ;没有写完继续
        
BCAN_DW_QUIT: 
     
      RET 
BCAN_CMD_01:             ;发送报文命令01
    MOV  A,#01H
    MOV  DPTR,#REG_COMMAND
    MOVX @DPTR,A
    ;SETB  F0
    ;MOVX  A,@DPTR
    ;JB   ACC.0,BCAN_CMD_01        
    CLR  F0
    RET


BCAN_DATA_RECEIVE:
     MOV           DPTR,   #REG_STATUS
     MOVX          A,      @DPTR
     SETB          F0
     JNB           ACC.0,  BCAN_DR_QUIT   ;判断报文是否有效
     CLR           F0  

     MOV           DPTR,   #REG_RxBuffer2 ;接收报文的ID号的低3位 \RTR位 \数据长度DLC
     MOVX          A,      @DPTR
     MOV           DPTR,   #REG_RxBuffer1 ;接收缓冲区的首地址
     JB            ACC.4,  BCAN_RCVYB     ;接收到的是远程帧
     ;数据帧
     ANL           A,      #0FH           ;计算接收到的数据长度
     ADD           A,      #02H           ;计算报文的长度
     MOV           R7,     A
     AJMP          BCAN_RCVDATA

BCAN_RCVYB:
     MOV           R7,     #02H            ;远程帧

BCAN_RCVDATA:                             ;开始读取数据
     MOVX          A,      @DPTR
     MOV           @R0,    A
     INC           DPTR
     INC           R0
     DJNZ          R7,     BCAN_RCVDATA

BCAN_DR_QUIT:
     MOV DPTR,#REG_INTERRUPT
     MOVX A,@DPTR
     CLR A
       
     RET



BCAN_SET_BANDRATE:
    MOV      A,             R7          ;判断波特率的值是否存在
    CLR      CY
    SUBB     A,             #13H        ;
    SETB     F0
    JNC      BCAN_SETBR_QUIT            ;输入的值大于12则不正确 
    CLR      F0
    MOV      A,             R7 
    RL       A
    MOV      DPTR,          #BCAN_SETBR ;查表找出相应的预设第一个值
    MOVC     A,             @A+DPTR
    MOV      R5,            A           ;将数据保存
    MOV      A,             R7          ;找出第二个值 
    RL       A
    INC      A
    MOVC     A,             @A+DPTR
    MOV      R6,            A           ;保存值

    MOV      DPTR,          #REG_BTR0   ;装入波特率预设值,同步跳转宽度
                                        ;位宽度
    MOV      A,             R5            
    MOVX     @DPTR,         A
    SETB     F0
    MOVX     A,             @DPTR        
    XRL      A,             R5          ;判断写入是否正确
    JNZ      BCAN_SETBR_QUIT            ;不正确 
    CLR      F0
    INC      DPTR
    MOV      A,             R6
    MOVX     @DPTR,         A
    SETB     F0
    MOVX     A,             @DPTR
    XRL      A,             R6          ;判断写入是否正确
    JNZ      BCAN_SETBR_QUIT
    CLR      F0 
BCAN_SETBR_QUIT:
    RET 


BCAN_SETBR:
    DB 053H,     02FH                     ;20KBPS的预设值
    DB 01H,      18H                     ;40KBPS的预设值
    DB 01H,      18H                     ;50KBPS的预设值
    DB 01H,      18H                     ;80KBPS的预设值
    DB 01H,      18H                     ;100KBPS的预设值
    DB 01H,      18H                     ;125KBPS的预设值
    DB 01H,      18H                     ;200KBPS的预设值
    DB 01H,      18H                     ;250KBPS的预设值
    DB 01H,      18H                     ;400KBPS的预设值
    DB 01H,      18H                     ;500KBPS的预设值
    DB 080H,     0b6H                     ;666KBPS的预设值
    DB 00H,      016H                     ;800KBPS的预设值
    DB 00H,      014H                     ;1000KBPS的预设值
   



BCAN_SET_OBJECT:
    MOV      DPTR,      #REG_ACR      ;写ACR寄存器
    MOV      A,         R7
    MOVX     @DPTR,     A
    MOVX     A,         @DPTR
    SETB     F0
    XRL      A,         R7            ;检验写入是否正确
    JNZ      BCAN_SETO_QUIT
    CLR      F0
    INC      DPTR                     ;写AMR寄存器
    MOV      A,         R6
    MOVX     @DPTR,     A
    MOVX     A,         @DPTR
    SETB     F0
    XRL      A,         R6            ;检验写入是否正确
    JNZ      BCAN_SETO_QUIT
    CLR      F0
BCAN_SETO_QUIT:
    RET    



BCAN_SET_OUTCLK:
    MOV      DPTR,      #REG_OCR      ;写OCR寄存器
    MOV      A,         R7
    MOVX     @DPTR,     A
    MOV      B,         A
    MOVX     A,         @DPTR
    SETB     F0
    CJNE     A,         B,   BCAN_SETOC_QUIT ;检验写入是否正确
    CLR      F0
    MOV      DPTR,      #REG_CDR            ;写CDR寄存器
    MOV      A,         R6
    MOVX     @DPTR,     A
    MOV      B,         A
    MOVX     A,         @DPTR
    SETB     F0
    CJNE     A,         B,   BCAN_SETOC_QUIT ;检验写入是否正确
    CLR      F0
BCAN_SETOC_QUIT:
    RET    
    
    
    END

⌨️ 快捷键说明

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