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

📄 can模块程序清单.asm

📁 sja的使用可以参考一下。。。。有一定的参考价值····
💻 ASM
📖 第 1 页 / 共 2 页
字号:

;********************************************************************
;子程序:      DATARECEIVE
;应用资源:  DPTR,ACC,R0,R7 ,F0
;参数说明:  R0,存放微处理器保存数据缓冲区的首地址
;返回值:    F0=0;接收成功
;           F0=1;接收失败
;说明:CAN控制器接收数据,仅限于接收数据
;********************************************************************
DATARECEIVE:
     MOV           A,      CANSTA
     SETB          F0
     JNB           ACC.0,  DRQUIT   ;判断报文是否有效
     CLR           F0
     MOV           CANADR, #RxBuffer2 ;接收报文的ID号的低3位 \RTR位 \数据长度DLC
     MOV           A,      CANDAT
     MOV           R1,     #RxBuffer1 ;接收缓冲区的首地址
     JB            ACC.4,  RCVYB     ;接收到的是远程帧
     ;数据帧
     ANL           A,      #0FH           ;计算接收到的数据长度
     ADD           A,      #02H           ;计算报文的长度
     MOV           R7,     A
     AJMP          RCVDATA
RCVYB:
     MOV           R7,     #02            ;远程帧
RCVDATA:                             ;开始读取数据
     MOV           CANADR, R1
     MOV           A,      CANDAT
     MOV           @R0,    A
     INC           R0
     INC           R1
     DJNZ          R7,     RCVDATA
DRQUIT:
     RET
;********************************************************************
;子程序:    SETBANDRATE
;应用资源:  DPTR,ACC,R5,R6,R7,F0
;参数说明:  R7            波特率(Kbit/s) BTR0     BTR1
;           0	            20              053H,    02FH
;           1	            40              087H,    0FFH
;           2	            50              047H,    02FH
;           3	            80              083H,    0FFH
;           4	            100             043H,    02fH
;           5	            125             03H,     01cH
;           6               200             081H,    0faH
;           7	            250             01H,     01cH
;           8	            400             080H,    0faH
;           9	            500             00H,     01cH
;           10	            666             080H,    0b6H
;           11	            800             00H,     016H
;           12	            1000            00H,     014H
;返回值:    F0,存放返回值
;           0 ;波特率设置成功
;           1 ;波特率设置失败
;说明:     设置CAN控制器通讯波特率.晶振为必须为16MHZ,其它晶体的频率的值的波特率,需自己计算 。该子程序只能用于复位模式
;********************************************************************
SETBANDRATE:
    MOV      A,             R7          ;判断波特率的值是否存在
    CLR      CY
    SUBB     A,             #13        ;
    SETB     F0
    JNC      SETBRQUIT            ;输入的值大于12则不正确
    CLR      F0
    MOV      A,             R7
    RL       A
    MOV      DPTR,          #SETBR ;查表找出相应的预设第一个值
    MOVC     A,             @A+DPTR
    MOV      R5,            A           ;将数据保存
    MOV      A,             R7          ;找出第二个值
    RL       A
    INC      A
    MOVC     A,             @A+DPTR
    MOV      R6,            A           ;保存值
    MOV      CANADR,        #BTR0   ;装入波特率预设值,同步跳转宽度
                                        ;位宽度
    MOV      A,             R5
    MOV      CANDAT,        A
    SETB     F0
    MOV      A,             CANDAT
    XRL      A,             R5          ;判断写入是否正确
    JNZ      SETBRQUIT                ;不正确
    CLR      F0
    MOV      CANADR,        #BTR1
    MOV      A,             R6
    MOV      CANDAT,        A
    SETB     F0
    MOV      A,             CANDAT
    XRL      A,             R6          ;判断写入是否正确
    JNZ      SETBRQUIT
    CLR      F0
SETBRQUIT:
    RET
SETBR:
    DB 053H,     02FH                     ;20KBPS的预设值
    DB 087H,     0FFH                     ;40KBPS的预设值
    DB 047H,     02FH                     ;50KBPS的预设值
    DB 083H,     0FFH                     ;80KBPS的预设值
    DB 043H,     02fH                     ;100KBPS的预设值
    DB 03H,      01cH                     ;125KBPS的预设值
    DB 081H,     0faH                     ;200KBPS的预设值
    DB 01H,      01cH                     ;250KBPS的预设值
    DB 080H,     0faH                     ;400KBPS的预设值
    DB 00H,      01cH                     ;500KBPS的预设值
    DB 080H,     0b6H                     ;666KBPS的预设值
    DB 00H,      016H                     ;800KBPS的预设值
    DB 00H,      014H                     ;1000KBPS的预设值
;********************************************************************
;子程序:    SETOBJECT
;应用资源:  DPTR,ACC,R6,R7,F0
;           R7:存放验收代码寄存器(ACR)的参数设置
;           R6:存放接收屏蔽寄存器(AMR)的参数设置
;返回值:    F0,存放返回值
;           0 ;通信对象设置成功
;           1 ;通信对象设置失败
;说明:      设置CAN节点的通讯对象,允许接收的报文ID号的高8位(D10--D3)。
;     允许接收的报文,是由AMR和ACR共同决定的.
;********************************************************************
SETOBJECT:
    MOV      CANADR,    #ACR      ;写ACR寄存器
    MOV      A,         R7
    MOV      CANDAT,    A
    MOV      A,         CANDAT
    SETB     F0
    XRL      A,         R7            ;检验写入是否正确
    JNZ      SETOQUIT
    CLR      F0
    MOV      CANADR,    #AMR
    MOV      A,         R6
    MOV      CANDAT,    A
    MOV      A,         CANDAT
    SETB     F0
    XRL      A,         R6
    JNZ      SETOQUIT
    CLR      F0
SETOQUIT:    RET
;********************************************************************
;子程序:    SETOUTCLK
;应用资源:  DPTR,ACC,R6,R7,F0,B
;           R7:存放输出寄存器(OCR)的参数设置
;返回值:    F0,存放返回值
;           0 ;设置成功
;           1 ;设置失败
;说明:      设置SJA1000的输出模式和时钟分频 。该子程序只能用于复位模式
;********************************************************************
SETOUTCLK:
    MOV      CANADR,    #OCR      ;写OCR寄存器
    MOV      A,         R7
    MOV      CANDAT,    A
    MOV      A,         CANDAT
    SETB     F0
    XRL      A,         R7
    JNZ      SETOCQUIT
    CLR      F0
SETOCQUIT :
    RET
;********************************************************************
;子程序:      CMDPRG
;应用资源:  DPTR,ACC,R7,F0
;参数说明:  R7,存放命令字
;           0x01          ;//发送请求命令
;           0x02          ;//夭折发送命令
;           0x04          ;//释放接收缓冲区
;           0x08          ;//清除超载状态
;           0x10          ;//进入睡眠状态命令
;返回值:    F0,存放返回值
;           0 ; 执行命令成功
;           1 ; 执行命令失败
;说明:      本子程序为命令执行程序
;********************************************************************
CMDPRG:
     MOV           A,      R7
     CJNE          A,      #01,   CMD1
     ;发送请求命令
     MOV           CANADR, #COMMAND; 地址指向命令寄存器
     MOV           CANDAT, A           ;写入命令字
     CLR           F0
     RET
CMD1:
     CJNE          A,      #02,    CMD2
     ;;//夭折发送命令
     MOV           A,      CANSTA       ;判断是否有正在发送的状态
     SETB          F0
     JNB           ACC.5,  CMDQUIT
     CLR           F0
CMDQUIT:
     RET
CMD2:
     CJNE          A,      #04,    CMD3
     ;释放接收缓冲区
     MOV           CANADR, #COMMAND; 地址指向命令寄存器
     MOV           CANDAT, A           ;写入命令字
     NOP
     NOP
     MOV           A,      CANSTA
     SETB          F0
     JB            ACC.0,  DBQUIT  ;不成功跳转
     CLR           F0
DBQUIT:
     RET
CMD3:
     CJNE          A,      #08,    CMD4
     ;清除超载状态
     MOV           CANADR, #COMMAND; 地址指向命令寄存器
     MOV           CANDAT, A           ;写入命令字
     NOP
     NOP
     MOV           A,      CANSTA
     SETB          F0
     JB            ACC.1,  DOVERQUIT  ;不成功跳转
     CLR           F0
DOVERQUIT:
     RET
CMD4:
     CJNE          A,      #10H,    CMD5
     ;进入睡眠状态命令
     MOV           CANADR, #COMMAND; 地址指向命令寄存器
     MOV           CANDAT, A           ;写入命令字
     CLR           F0
CMD5:
     RET
END

⌨️ 快捷键说明

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