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

📄 bcan1.asm

📁 实现CAN总线的接收,发送,故障处理,处理器采用的是STC89C58RD,是中央空调控制系统的下位机程序的一部分.
💻 ASM
📖 第 1 页 / 共 2 页
字号:
;间隔定时发送数据,连续中断接收报文,成功,01.28   14:51
;中断连续接收报文通过,01.28  10:41
;有效性通过
;修改波特率设置后通过。01.27   22:26,现可以和PC机通信,要进一步验证接收数据的有效性。
;;;;*************查询方式接收*********************成功了15:17
REG_CONTROL       EQU  00H        ;内部控制寄存器地址;其内容可改变      *
REG_COMMAND       EQU  01H        ;内部命令寄存器地址;                  *
REG_STATUS        EQU  02H        ;内部状态寄存器地址;                  *
REG_INTERRUPT     EQU  03H        ;内部中断寄存器地址;                  *
REG_ACR           EQU  04H        ;内部验收代码寄存器地址;              *
REG_AMR           EQU  05H       ;内部验收屏蔽寄存器地址;              * 
REG_BTR0          EQU  06H        ;总线定时寄存器0       ;              * 
REG_BTR1          EQU  07H        ;总线定时寄存器1       ;              * 
BIT_SAM           EQU  80H        ;采样模式位
REG_OCR           EQU  08H        ;输出控制寄存器                        *
REG_TEST          EQU  09H
;************************************************************************
;*发送缓冲区(内部地址0AH--13H)                                          *
;************************************************************************
REG_TxBuffer1   EQU   0AH          ;发送缓冲区1
REG_TxBuffer2   EQU   0BH          ;发送缓冲区2
REG_TxBuffer3   EQU   0CH          ;发送缓冲区3
REG_TxBuffer4   EQU   0DH          ;发送缓冲区4
REG_TxBuffer5   EQU   0EH          ;发送缓冲区5
REG_TxBuffer6   EQU   0FH          ;发送缓冲区6
REG_TxBuffer7   EQU   010H         ;发送缓冲区7
REG_TxBuffer8   EQU   011H         ;发送缓冲区8
REG_TxBuffer9   EQU   012H         ;发送缓冲区9
REG_TxBuffer10  EQU   013H         ;发送缓冲区10

;************************************************************************
;*接收缓冲区(内部地址014H--01DH)                                        *
;************************************************************************
REG_RxBuffer1   EQU   014H          ;接收缓冲区1
REG_RxBuffer2   EQU   015H          ;接收缓冲区2
REG_RxBuffer3   EQU   016H          ;接收缓冲区3
REG_RxBuffer4   EQU   017H          ;接收缓冲区4
REG_RxBuffer5   EQU   018H          ;接收缓冲区5
REG_RxBuffer6   EQU   019H          ;接收缓冲区6
REG_RxBuffer7   EQU   01AH          ;接收缓冲区7
REG_RxBuffer8   EQU   01BH          ;接收缓冲区8
REG_RxBuffer9   EQU   01CH          ;接收缓冲区9
REG_RxBuffer10  EQU   01DH          ;接收缓冲区10

REG_CDR         EQU  01FH         ;时钟分频寄存器
;***************************************************************************
;***************************自己加的************
;*******************************************
DATA_BUF0     EQU  030H   ;发送数据CPU内部RAM首地址
;*********************************************

ORG  0000H
LJMP  MAIN

ORG  000BH
LJMP T0_INTERRUPT;T0入口地址
ORG  0003H
LJMP CPU_INTERRUPT0;中断1入口地址


ORG  0050H
MAIN:
    ;内部RAM 清零
    MOV  R0,#20H
CLEAR_RAM:
    CLR  A
    MOV  @R0,A
    INC  R0
    CJNE R0,#0FFH,CLEAR_RAM
    MOV  SP,#60H  ;设置SP
   
SJA1000_INIT0:
    ;MOV           ErrorCount,#020H        ;32次,报错
    LCALL         BCAN_CREATE_COMMUNATION ;调用SJA1000接口测试函数
    JB            F0,SJA1000_INIT0        ;接口正常,初始化SJA1000
    ;DJNZ          ErrorCount,SJA1000_INIT0;接口不正常,再检测
	;MOV           ERROR_STATUS,#SJA_INTFACE_ERR 
    ;LJMP          ERROR_HANDLE            ;错误处理
BCAN_RET:                                 ;进入复位模式
    LCALL BCAN_ENTER_RETMODEL
    JB  F0,BCAN_RET
SJA1000_INIT1: 
    
;设置接收任何类型的标志符,波特率1000Kbps(16MHZ的晶体),关闭CLKOUT则,
;ACR=任何值,AMR=0FFH,BTR0=084H,BTR1=0A7H,OC==0aaH,CDR=048H 

;首先设置参数
    
    MOV           R7,#05H
	;MOV           ErrorCount,#020H          ;32次,报错
    LCALL         BCAN_SET_BANDRATE         ;设置波特率为250k          
    JB            F0,SJA1000_INIT1          ;判断设置是否成功
	;DJNZ          ErrorCount,SJA1000_INIT1  ;接口不正常,再检测
	;MOV           ERROR_STATUS,#SJA_INITBTR_ERR 
    ;LJMP          ERROR_HANDLE   
        

        
SJA1000_INIT2:
   ;设置输出控制、时钟分频
   ; MOV          ErrorCount,#020H       ;32次,报错   
    MOV           R7,#0AAH              ;正常输出模式
    MOV           R6,#048H              ;使能内部比较器、禁止CLKOUT
    LCALL         BCAN_SET_OUTCLK       ;
    JB            F0,SJA1000_INIT2      ;判断设置是否成功
	;DJNZ          ErrorCount,SJA1000_INIT2
	;MOV           ERROR_STATUS,#SJA_INITOCLK_ERR 
    ;LJMP          ERROR_HANDLE 
SJA1000_INIT3:   
   ;设置接收报文ID
    ;MOV           ErrorCount,#020H       ;32次,报错
    MOV           R7,#00H
    MOV           R6,#22H
    LCALL         BCAN_SET_OBJECT
    JB            F0,SJA1000_INIT3       ;判断设置是否成功
	;DJNZ          ErrorCount,SJA1000_INIT2
	;MOV           ERROR_STATUS,#SJA_INITOBJ_ERR 
    ;LJMP          ERROR_HANDLE                         
SJA1000_INIT4: 
    ;MOV           ErrorCount,#020H       ;32次,报错          
    LCALL         BCAN_QUIT_RETMODEL     ;退出复位状态
    JB            F0,SJA1000_INIT4       ;判断设置是否成功
    ;DJNZ          ErrorCount,SJA1000_INIT4
	;MOV           ERROR_STATUS,#0FEH     ;#SJA_INIT_ERR 
    ;LJMP          ERROR_HANDLE           
SJA1000_INIT5:   
	MOV	    DPTR,#REG_CONTROL 	;开SJA1000内部功能中断
	MOVX	A,@DPTR	            ;接收中断关闭
	ORL     A,#02H
	MOVX	@DPTR,A
	NOP
	MOVX    A,@DPTR
	JNB     ACC.1,SJA1000_INIT5;ACC.1=1,开通SJA1000接收中断
;定时500MS发送报文到上位机PC
    MOV     TMOD,#01H       ;选择T0工作在方式16位 定时器
    MOV     TH0,#03CH       ;500ms定时
    MOV     TL0,#0AFH
    
    SETB    ET0
    SETB	PX0 			;设置外部中断0为最高优先级
	SETB	IT0 			;设置外部中断位边缘触发
	SETB  	EX0      		;开放中断EXO,总中断位EA
	SETB    EA 
	SETB    TR0             ;定时器开始计时 
;********************************************************************
;****************接收数据帧******************************************
    LOOP:
    NOP
    AJMP LOOP

T0_INTERRUPT:
    CLR   EA
    CLR   TR0
    PUSH ACC
    PUSH DPL
    PUSH DPH
    
    MOV  30H,#66H
    MOV  31H,#08H
    MOV  32H,#01H
    MOV  33H,#02H
    MOV  34H,#03H
    MOV  35H,#04H
    MOV  36H,#05H
    MOV  37H,#07H
    MOV  38H,#07H
    MOV  39H,#08H
    
BCAN_SENT_DATA:
    MOV  R0,#DATA_BUF0
    LCALL BCAN_DATA_WRITE;向SJA1000写入数据
    JB   F0,BCAN_SENT_DATA
    BCAN_START_SENT:
    LCALL BCAN_CMD_01     ;发送数据
    JB F0,BCAN_START_SENT
    
    POP  DPH
    POP  DPL
    POP  ACC
    MOV  TH0,#00H       ;500ms定时
    MOV  TL0,#00H
    SETB TR0
    SETB  EA
    RETI
      

CPU_INTERRUPT0:
    CLR   EA
    PUSH ACC
    PUSH DPL
    PUSH DPH
    
    MOV   R0,#40H          ;存放接收数据的CPU内部RAM首地址
    LCALL BCAN_DATA_RECEIVE
    MOV   DPTR,#REG_COMMAND;释放接收缓冲器
    ORL   A,#04H
    MOVX  @DPTR,A
    POP  DPH
    POP  DPL
    POP  ACC
    SETB EA 
    RETI   

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;**********************子程序*******************************************
BCAN_CREATE_COMMUNATION:     
      MOV            DPTR,   #REG_TEST                  ;对测试寄存器进行读写测试  
      MOVX           A,      @DPTR
      MOV            A,      #0AAH                      ;写入值0AAH 
      MOVX           @DPTR,  A                           
      SETB           F0  
      MOVX           A,      @DPTR                      ;读出值
      CJNE           A,      #0AAH,BCAN_CM_QUIT         ;测试写入读出是否正确
      MOV            A,      #055H                      ;再次测试
      MOVX           @DPTR,  A                          ;写入055H
      MOVX           A,      @DPTR
      CJNE           A,      #055H,BCAN_CM_QUIT         ;测试写入读出是否正确    
      CLR            A                                  ;清零测试寄存器                                     
      MOVX           @DPTR,  A 

⌨️ 快捷键说明

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