📄 bcan1.asm
字号:
;间隔定时发送数据,连续中断接收报文,成功,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 + -