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

📄 basicmainl.asm

📁 ,片选接到p1.5 复位端 p1.4 中断端接到 int0 82c250工作在斜率模式下
💻 ASM
📖 第 1 页 / 共 4 页
字号:
      NOP
      MOVX           A,@R0                                  ;读出值
      CJNE           A,#0AAH,BCAN_CM_QUIT                   ;测试写入读出是否正确
      MOV            A,#055H                                ;再次测试
      MOVX           @R0,A                                  ;写入055H
      NOP
      NOP
      MOVX           A,@R0
      CJNE           A,#055H,BCAN_CM_QUIT                   ;测试写入读出是否正确
      CLR            A                                      ;清零测试寄存器
      MOVX           @R0,A
      CLR            F0                                     ;接口正确
BCAN_CM_QUIT:
      RET

;************************************************************************
;*函数:      BCAN_ENTER_RETMODEL                                        *
;*应用资源:  DPTR,ACC,F0                                                *
;*参数说明:  无                                                         *
;*返回值:    F0,存放返回值                                              *
;*           0 ; 表示成功进入复位工作模式                               *
;*           1 ; 表示不能进入复位工作模式                               *
;*                                                                      *
;*说明:CAN控制器进入复位工作模式                                        *
;************************************************************************
;*子程序调用示例:                                                       *
;* USER_CODE:                          ;;用户代码                       *
;*    -----   -----                                                     *
;*    LCALL   BCAN_ENTER_RETMODEL      ;;调用子程序                     *
;*    JNB     F0,      USER_CODE1      ;;继续用户代码                   *
;*    LJMP    ERROR_PRG                ;;复位请求不成功跳到错误处理     *
;*                                                                      *
;* USER_CODE1:                                                          *
;*    -----   -----                    ;;用户代码                       *
;************************************************************************
BCAN_ENTER_RETMODEL:
      MOV            R0,   #REG_CONTROL       ;控制寄存器访问
      MOVX           A,      @R0              ;
      ORL            A,      #01H               ;置位复位请求
      MOVX           @R0,  A                              ;
      CLR            F0
      MOVX           A,      @R0              ;验证复位是否写入
      JB             ACC.0,  BCAN_ER_QUIT
      SETB           F0                         ;复位不成功
BCAN_ER_QUIT:
      RET


;************************************************************************
;*函数:      BCAN_QUIT_RETMODEL                                         *
;*应用资源:  R0,ACC,F0                                                *
;*参数说明:  无                                                         *
;*返回值:    F0,存放返回值                                              *
;*           0 ; 表示成功退出复位工作模式                               *
;*           1 ; 表示不能退出复位工作模式                               *
;*                                                                      *
;*说明:CAN控制器退出复位工作模式,进入工作模式                          *
;************************************************************************
;*子程序调用示例:                                                       *
;* USER_CODE:                          ;;用户代码                       *
;*    -----   -----                                                     *
;*    LCALL   BCAN_QUIT_RETMODEL       ;;调用子程序                     *
;*    JNB     F0,      USER_CODE1      ;;继续用户代码                   *
;*    LJMP    ERROR_PRG                ;;不能退出复位模式跳到错误处理   *
;*                                                                      *
;* USER_CODE1:                                                          *
;*    -----   -----                    ;;用户代码                       *
;************************************************************************
BCAN_QUIT_RETMODEL:
      MOV            R0,#REG_CONTROL            ; 控制寄存器访问
      MOVX           A,@R0                      ;
      ANL            A,#0FEH                    ;清零复位请求,进入工作状态
      NOP
      MOVX           @R0,  A
      CLR            F0
      MOVX           A,@R0
      JNB            ACC.0,  BCAN_QR_QUIT       ;验证是否退出复位状态
      SETB           F0
BCAN_QR_QUIT:
      RET

;************************************************************************
;*函数:      BCAN_DATA_WRITE                                            *
;*应用资源:  DPTR,ACC,R0,R7                                             *
;*参数说明:                                                             *
;*    R0:存放待发送特定帧各式的数据的首地址                             *
;*                                                                      *
;*返回值:    F0,存放返回值                                              *
;*           0 ; 表示将数据成功的送至发送缓冲区                         *
;*           1 ; 表示上一次的数据正在发送,                             *
;*             ; 表示发送缓冲区被锁定,不能写入数据                     *
;*             ; 表示写入数据错误                                       *
;*                                                                      *
;*说明: 将待发送特定帧各式的数据,送入SJA1000发送缓存区中,然后启动     *
;*        SJA1000发送。                                                 *
;*      特定帧格式为:开始的两个字节存放 '描述符' ,以后的为数据          *
;*   描述符包括11位长的ID(标志符)\1位RTR\4位描述数据长度的DLC共16位    *
;*                                                                      *
;*注:本函数的返回值仅指示,将数据正确写入SJA1000发送缓存区中与否。     *
;*    不指示SJA1000将该数据正确发送到CAN总线上完毕与否,要向总线发送请在*
;*    本子程序后调用发送命令                                            *
;************************************************************************
;*子程序调用示例:                                                       *
;* USER_CODE:                          ;;用户代码                       *
;*    -----   -----                                                     *
;*    MOV     R0,      #DATA_BUF0      ;;装入微处理器要发送数据的首地址 *
;*    LCALL   BCAN_DATA_WRITE          ;;调用子程序                     *
;*    JNB     F0,      USER_CODE1      ;;继续用户代码                   *
;*    LJMP    ERROR_PRG                ;;写入发送缓冲区错跳到错误处理   *
;*                                                                      *
;* USER_CODE1:                                                          *
;*    -----   -----                    ;;用户代码                       *
;************************************************************************
BCAN_DATA_WRITE:
      MOV            DPTR,   #REG_STATUS  ;读取状态寄存器
      MOVX           A,      @DPTR        ;判断上次发送是否完成
      SETB           F0
      JNB            ACC.3,  BCAN_DW_QUIT ;正在发送退出
      CLR            F0               
      MOVX           A,      @DPTR        ;判断发送缓冲区是否锁定,
      SETB           F0 
      JNB            ACC.2,  BCAN_DW_QUIT ;锁定则跳出                     
      CLR            F0     
           
      INC            R0                   ;
      MOV            A,      @R0          ;ID号的低3位 \RTR位 \数据长度DLC
      DEC            R0                   ;恢复指针指向发送数据的首地址
      MOV            R1,   #REG_TxBuffer1 ;发送缓冲区首地址

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

BCAN_WRTXBUF:      
      MOV            A,      @R0          ;开始写入
      MOVX           @R1,  A
      SETB           F0
      MOVX           A,      @R1        ;校验写入的是否正确
      XRL            A,      @R0
      JNZ            BCAN_DW_QUIT         ;写入错误退出
      CLR            F0                   ;正确写入继续
      INC            R0
      INC            R1
      DJNZ           R7,     BCAN_WRTXBUF ;没有写完继续
        
BCAN_DW_QUIT:      
      RET 

;************************************************************************
;*函数:      BCAN_DATA_RECEIVE                                          *
;*应用资源:  R0,ACC,R1,R7,F0                                         *
;*参数说明:  R0,存放微处理器保存数据缓冲区的首地址                      *
;*返回值:    F0=0;接收成功                                              *
;*           F0=1;接收失败                                              *
;*说明:CAN控制器接收数据,仅限于接收数据                                 *
;************************************************************************
;*子程序调用示例:                                                       *
;* USER_CODE:                          ;;用户代码                       *
;*    -----   -----                                                     *
;*    MOV     R1,      #DATA_BUF0      ;;装入微处理器要发送数据的首地址 *
;*    LCALL   BCAN_DATA_RECEIVE        ;;调用子程序                     *
;*    JNB     F0,      USER_CODE1      ;;成功,继续用户代码             *
;*    LJMP    ERROR_PRG                ;;失败,跳到错误处理             *
;*                                                                      *
;* USER_CODE1:                                                          *
;*    -----   -----                    ;;用户代码                       *
;************************************************************************
BCAN_DATA_RECEIVE:
     MOV           R0,     #REG_STATUS
     MOVX          A,      @R0
     SETB          F0
     JNB           ACC.0,  BCAN_DR_QUIT   ;判断报文是否有效
     CLR           F0

     MOV           R0,     #REG_RxBuffer2 ;接收报文的ID号的低3位 \RTR位 \数据长度DLC
     MOVX          A,      @R0
     MOV           R0,     #REG_RxBuffer1 ;接收缓冲区的首地址
     JB            ACC.4,  BCAN_RCVYB     ;接收到的是远程帧

;//数据帧
     ANL           A,      #0FH           ;计算接收到的数据长度
     ADD           A,      #02H           ;计算报文的长度
     MOV           R7,     A
     AJMP          BCAN_RCVDATA

BCAN_RCVYB:
     MOV           R7,     #02            ;远程帧

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

BCAN_DR_QUIT:

     RET

;************************************************************************
;*子程序:    BCAN_SET_BANDRATE                                          *
;*应用资源:  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控制器SJA1000通讯波特率.SJA1000的晶振为必须为16MHZ,       *
;*     其它晶体的频率的值的波特率,需自己计算 。该子程序只能用于        *
;*     复位模式                                                         *
;************************************************************************
;*子程序调用示例:                                                       *
;* USER_CODE:                          ;;用户代码                       *
;*    -----   -----                                                     *
;*    MOV     R7,      #06             ;;设置波特率100KBPS              *
;*    LCALL   BCAN_SET_BANDRATE        ;;调用子程序                     *
;*    JNB     F0,      USER_CODE1      ;;成功,继续用户代码             *
;*    LJMP    ERROR_PRG                ;;失败,跳到错误处理             *
;*                                                                      *
;* USER_CODE1:                                                          *
;*    -----   -----                    ;;用户代码                       *

⌨️ 快捷键说明

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