?? can.asm
字號:
;******************以下為匯編程序*********************************************************************
;系統can地址為550,用于can系統測試,應用T0定時器每隔1s向can總線發送一組數據:數據長度為8個字節,
;首字節為05H,第二個字節為累加變量,每秒鐘數值增加1,
;*********************************************************************************************************
CONTROLLER_BASE EQU 0f00H ;SJA1000的片選地址
REG_CONTROL EQU 0f00H
REG_COMMAND EQU 0f01H
REG_STATUS EQU 0f02H
REG_INTERRUPT EQU 0f03H
REG_BTR0 EQU 0f06H
REG_ACR EQU 0f04H
REG_OCR EQU 0f08H
REG_CDR EQU 0f1fH
REG_TxBuffer1 EQU 0f0cH
REG_RxBuffer1 EQU 0f16H
REG_RxBuffer2 EQU 0f14H
RCV_GOOD BIT 0FH ;成功的接收一幀標志
SEC_FLAG BIT 010H ;一秒到標志
ERR_FLAG BIT 011H ;監測到錯誤標志
SAVE_INT_INFO DATA 032H ;保存SJA1000中斷寄存器的內容
SEND_DATA_BUF1 DATA 040H ;發送緩沖區
SEND_DATA_BUF2 DATA 041H
SEND_DATA_BUF3 DATA 042H
SEND_DATA_BUF4 DATA 043H
SEND_DATA_BUF5 DATA 044H
SEND_DATA_BUF6 DATA 045H
SEND_DATA_BUF7 DATA 046H
SEND_DATA_BUF8 DATA 047H
SEND_DATA_BUF9 DATA 048H
SEND_DATA_BUF10 DATA 049H
RCV_DATA_BUF1 DATA 050H ;接收緩沖區
RCV_DATA_BUF2 DATA 051H
RCV_DATA_BUF3 DATA 052H
RCV_DATA_BUF4 DATA 053H
RCV_DATA_BUF5 DATA 054H
RCV_DATA_BUF6 DATA 055H
RCV_DATA_BUF7 DATA 056H
RCV_DATA_BUF8 DATA 057H
RCV_DATA_BUF9 DATA 058H
RCV_DATA_BUF10 DATA 059H
ERROR_STATUS DATA 07CH ;錯誤狀態表示
TEST_DATA DATA 07FH ;測試發送數據
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;程序開始
ORG 0000H
LJMP MAIN ;運行主程序
ORG 0003H
LJMP BCAN_INT0 ;中斷方式訪問SJA1000程序
ORG 000BH
LJMP T0_INTERRUPT ;定時器0中斷
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
ORG 0100H ;程序開始
MAIN:
MOV R0,#07fH
CLR A
MOV @R0,A
DJNZ R0,$-1
MOV @R0,A
MOV SP,#60H ;設置SP
CLR P2.0 ;SJA1000退出硬件復位模式
LCALL SJA1000_INT0 ;初始化SJA1000
LCALL T0_INIT
CLR P1.4 ;點亮指示燈
SETB PX0
SETB IT0
SETB EX0
SETB ET0
SETB TR0
SETB EA
LOOPER:
JNB RCV_GOOD,LOOPER2 ;sja1000成功接收一幀,通知CPU處理,否則,轉到looper2
CLR RCV_GOOD
LCALL RCVDATA_PRG
LOOPER2:
JNB SEC_FLAG,LOOPER3 ;一秒時間到,每秒發送一次
CLR SEC_FLAG
CLR P1.5 ;點亮指示燈
LCALL SENDDATA_PRG
LOOPER3:
JNB ERR_FLAG,LOOPER4 ;錯誤標志,錯誤處理
CLR ERR_FLAG
LCALL ERR_PRG
LOOPER4:
SETb P1.5
setb P1.6
AJMP LOOPER
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;初始化SJA1000;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
SJA1000_INT0:
;LCALL BCAN_CREATE_COMMUNATION ;調用SJA1000接口測試函數
MOV R7, #04
LCALL BCAN_SET_BANDRATE ;設置波特率為100k
MOV R7, #0A8H ;設置接收報文ID
MOV R6, #0FFH
LCALL BCAN_SET_OBJECT
MOV R7, #0AAH ;設置輸出控制、時鐘分頻;正常輸出模式
MOV R6, #048H ;使能內部比較器、禁止CLKOUT
LCALL BCAN_SET_OUTCLK ;
LCALL BCAN_QUIT_RETMODEL ;退出復位狀態
MOV DPTR, #REG_CONTROL ;開放SJA1000內部功能中斷
MOV A, #01EH ;中斷開放
MOVX @DPTR, A
CLR F0
RET
;;;;;;;;;;;;;;;;;;;;;;錯誤信息處理;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
ERR_PRG:
LCALL BCAN_ENTER_RETMODEL ;進入復位模式
LCALL SJA1000_INT0 ;
MOV ERROR_STATUS,#0FCH
RET
;;;;;;;;;;;;;;;;;;;;;;;接收數據處理部分;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
RCVDATA_PRG:
MOV R0,# RCV_DATA_BUF1 ;微處理器接收首地址
LCALL BCAN_DATA_RECEIVE ;調用接收數據子程序
MOV R7,#04H ;釋放接收緩沖區
LCALL BCAN_CMD_PRG ;
RET
;;;;;;;;;;;;;;;;;;控制SJA1000向CAN總線發送數據處理部分;;;;;;;;;;;;;;;
SENDDATA_PRG:
MOV R0, #SEND_DATA_BUF1
MOV @R0, #02H
INC R0
MOV @R0, #08H
INC R0
MOV @R0, #05H
MOV A, TEST_DATA
INC R0
MOV @R0, A
MOV R0, #SEND_DATA_BUF1
LCALL BCAN_DATA_WRITE ;將要發送的數據送入發送緩沖區
MOV R7, #01
LCALL BCAN_CMD_PRG
RET
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;定時器0初始化;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
T0_INIT:
MOV A,TMOD
ANL A,#0F0H
ORL A,#01H
MOV TMOD,A;T0工作在方式1
MOV TH0,#0FCH ;定時周期1MS
MOV TL0,#066H
MOV 3AH,#00H
RET
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;外部中斷0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
BCAN_INT0:
push DPH
PUSH DPL
PUSH PSW ;PSW,ACC入棧
PUSH ACC
USING 3 ;應用寄存器第3組
MOV DPTR,#REG_INTERRUPT ;讀中斷寄存器
MOVX A,@DPTR ;
MOV SAVE_INT_INFO,A ;保存中斷寄存器的內容
JNB ACC.0,BCAN_INT1 ;接收中斷
SETB RCV_GOOD ;置位接收標志
BCAN_INT1:
MOV A,SAVE_INT_INFO
JNB ACC.2,BCAN_INT2 ;錯誤中斷
SETB ERR_FLAG ;置位錯誤標志
BCAN_INT2:
POP ACC
POP PSW
POP DPL
POP DPH
RETI
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;定時器0中斷;;;;;;;;;;;;;;;;
T0_INTERRUPT:
push DPH
PUSH DPL
PUSH PSW ;PSW、ACC入棧
PUSH ACC
USING 2
MOV TH0,#80H ;設置定時周期0.3S
MOV TL0,#26H
INC 3AH
MOV A,3AH
CJNE A,#23H,T0_QUIT ;判斷1秒時間是否到
MOV 3AH,#00H
INC TEST_DATA ;測試發送的數據,每1秒加1
SETB SEC_FLAG ;置位1秒到標志
T0_QUIT:
POP ACC
POP PSW
POP DPL
POP DPH
RETI
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
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -