?? sja_bcandemo.asm.asm
字號:
$INCLUDE (SJA_BCANCONF.ASM) ;導入硬件定義文件
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
KEYLED_BUF EQU 0F900H ;鍵盤顯示緩沖區
KEYLED_MODE EQU 0F901H ;鍵盤顯示模式選擇,0為并行模式
;;;;;;;;;;;;;;;;定義錯誤字
;
;使用前變量定義
RCV_GOOD BIT 0FH ;成功的接收一幀標志
SEC_FLAG BIT 010H ;一秒到標志
ERR_FLAG BIT 011H ;監測到錯誤標志
OVER_FLAG BIT 012H ;超載標志
DS_END_FLAG BIT 013H ;SJA1000發送完成標志
WUI_FLAG BIT 014H ;喚醒SJA1000標志
TOIR BIT 015H ;定時器T0標志
;;;;;;;;;;;;;;;顯示閃爍標志區;;;;;;;;;;;;;;;;;;;;
FLIGHDISP DATA 02FH
FLIGHBIT0 BIT 07FH
FLIGHBIT1 BIT 07EH
FLIGHBIT2 BIT 07DH
FLIGHBIT3 BIT 07CH
FLIGHBIT4 BIT 07BH
FLIGHSYNC BIT 07AH
;;;;;;;;;;;;;;顯示位選選擇;;;;;;;;;;;;;;;;;;
EN_DISPBIT0 BIT P1.7
EN_DISPBIT1 BIT P1.6
EN_DISPBIT2 BIT P1.5
EN_DISPBIT3 BIT P1.4
EN_DISPBIT4 BIT P1.3
;;;;;;;;;;;;;;;顯示閃爍頻率計數;;;;;;;;;;;;;;;;;;;;
FLIGHCOUNT DATA 07EH
;;;;;;;;;;;;;;;顯示位選計數;;;;;;;;;;;;;;;;;;;;
DISP_POINT DATA 07DH
SEC_COUNT_L DATA 030H ;秒定時計數器
SEC_COUNT_H DATA 031H
SAVE_INT_INFO DATA 032H ;保存SJA1000中斷寄存器的內容
ERRORCOUNT DATA 033H ;錯誤計數
DISPLAYBUF0 DATA 034H ;顯示緩沖區34H--38H
;
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:
;內部RAM清零
MOV R0,#07fH
CLR A
MOV @R0,A
DJNZ R0,$-1
MOV @R0,A
MOV SP,#60H ;設置SP
LCALL DELAY ;延時
LCALL DELAY
LCALL UART_INIT ;串口初始化
SJA1000_INIT0:
MOV ErrorCount, #020H ;32次,報錯
LCALL BCAN_CREATE_COMMUNATION ;調用SJA1000接口測試函數
JNB F0, SJA1000_INIT1;接口正常,初始化SJA1000
DJNZ ErrorCount , SJA1000_INIT0 ;接口不正常,再檢測
MOV ERROR_STATUS,#SJA_INTFACE_ERR
LJMP ERROR_HANDLE ;錯誤處理
SJA1000_INIT1:
;設置接收任何類型的標志符,波特率1000Kbps(16MHZ的晶體),關閉CLKOUT則,
;ACR=任何值,AMR=0FFH,BTR0=084H,BTR1=0A7H,OC==0aaH,CDR=048H
;首先設置參數
MOV R7, #012
MOV ErrorCount, #020H ;32次,報錯
LCALL BCAN_SET_BANDRATE ;設置波特率為100k
JNB F0, SJA1000_INIT2 ;判斷設置是否成功
DJNZ ErrorCount , SJA1000_INIT1 ;接口不正常,再檢測
MOV ERROR_STATUS,#SJA_INITBTR_ERR
LJMP ERROR_HANDLE
SJA1000_INIT2:
;設置接收報文ID
MOV ErrorCount, #020H ;32次,報錯
MOV R7, #00
MOV R6, #0FFH
LCALL BCAN_SET_OBJECT
JNB F0, SJA1000_INIT3 ;判斷設置是否成功
DJNZ ErrorCount , SJA1000_INIT2
MOV ERROR_STATUS,#SJA_INITOBJ_ERR
LJMP ERROR_HANDLE
SJA1000_INIT3:
;設置輸出控制、時鐘分頻
MOV ErrorCount, #020H ;32次,報錯
MOV R7, #0AAH ;正常輸出模式
MOV R6, #048H ;使能內部比較器、禁止CLKOUT
LCALL BCAN_SET_OUTCLK ;
JNB F0, SJA1000_INIT4 ;判斷設置是否成功
DJNZ ErrorCount , SJA1000_INIT3
MOV ERROR_STATUS,#SJA_INITOCLK_ERR
LJMP ERROR_HANDLE
SJA1000_INIT4:
MOV ErrorCount, #020H ;32次,報錯
LCALL BCAN_QUIT_RETMODEL ;退出復位狀態
JNB F0, SJA1000_INIT5 ;判斷設置是否成功
DJNZ ErrorCount , SJA1000_INIT4
MOV ERROR_STATUS,#0FEH;#SJA_INIT_ERR
LJMP ERROR_HANDLE
SJA1000_INIT5:
MOV DPTR,#REG_CONTROL ;開放SJA1000內部功能中斷
MOV A,#01EH ;中斷開放
MOVX @DPTR,A
LCALL DISPLAY_INIT ;顯示初始化
LCALL T0_INIT ;初始化定時器0
SETB PX0 ;設置外部中斷0為最高優先級
SETB IT0 ;設置外部中斷位邊緣觸發
MOV IE,#083H ;開放中斷EXO,總中斷位EA,俄ET0
LOOPER:
JBC TOIR,MS_DEALPRG
LOOPER1:
JBC RCV_GOOD,RCVDATA_PRG ;sja1000成功接收一幀,通知CPU處理
LOOPER2:
JBC SEC_FLAG,SENDDATA_PRG ;一秒時間到,每秒發送一次
LOOPER3:
JBC ERR_FLAG,ERR_PRG ;錯誤標志,錯誤處理
LOOPER4:
JBC OVER_FLAG,DOVER_PRG ;超載處理
LOOPER5:
JBC DS_END_FLAG,DSEND_PRG ;報文發送完成
LOOPER6:
JBC WUI_FLAG,WOKE_PRG ;喚醒處理
AJMP LOOPER
MS_DEALPRG:
; LCALL DISPLAY_PRG
AJMP LOOPER1
;發現錯誤處理
ERR_PRG:
LCALL BCAN_ENTER_RETMODEL ;進入復位模式
MOV ERROR_STATUS,#SJA_SEND_ERR
;錯誤信息處理
ERROR_HANDLE:
LCALL DISP_ERROR
LJMP SJA1000_INIT0 ;現錯誤,根據實際情況處理
;數據超載處理
DOVER_PRG:
MOV R7,#08H ;清除數據超載
LCALL BCAN_CMD_PRG ;
LJMP LOOPER5
;上一次發送的數據發送完畢處理
DSEND_PRG:
LCALL DISP_OK
LJMP LOOPER6
;喚醒中斷處理
WOKE_PRG: ;喚醒處理
LJMP LOOPER
;接收數據處理部分
RCVDATA_PRG:
;LCALL UART_INIT
MOV R0,# RCV_DATA_BUF1 ;微處理器接收首地址
LCALL BCAN_DATA_RECEIVE ;調用接收數據子程序
MOV R7,#04H ;釋放接收緩沖區
LCALL BCAN_CMD_PRG ;
;將接收的數據發送至串口
MOV R0,# RCV_DATA_BUF2 ;計算接收數據長度判斷遠程幀、數據幀
MOV A,@R0
JB ACC.4,RD_PRG1 ;遠程幀
;數據幀
ANL A,#0FH ;計算數據數目
ADD A,#02H ;計算幀的數據長度
MOV R7, A
AJMP RD_UARTSD
RD_PRG1:
MOV R7,#02H
RD_UARTSD:
MOV R0,#RCV_DATA_BUF1 ;微處理器接收首地址
LCALL UART_SEND ;調用串口發送程序
LCALL DISP_OK
LJMP LOOPER2
;控制SJA1000向CAN總線發送數據處理部分
SENDDATA_PRG:
MOV R0, #SEND_DATA_BUF1
MOV @R0, #0AAH
INC R0
MOV A, TEST_DATA
MOV R7, #08
MOV A, #08
MOV @R0, A
RB_DATA:
MOV A, TEST_DATA
INC R0
MOV @R0, A
DJNZ R7, RB_DATA ;將特定格式的幀存入發送緩沖區
MOV R0, #SEND_DATA_BUF1
LCALL BCAN_DATA_WRITE ;將要發送的數據送入發送緩沖區
MOV R7, #01
LCALL BCAN_CMD_PRG
LJMP LOOPER3
;定時器0初始化
T0_INIT:
MOV A,TMOD
ANL A,#0F0H
ORL A,#01H
MOV TMOD,A;T0工作在方式1
MOV TH0,#0FCH ;定時周期1MS
MOV TL0,#066H
SETB ET0
MOV TCON,#055H ;啟動定時器
RET
;串口初始化
UART_INIT:
MOV SCON,#050H ;串口數據1個STOP,8個DATA,無校驗
MOV A,TMOD
ANL A,#0FH
ORL A,#020H
MOV TMOD,A ;用定時器1做波特率發生器
MOV TH1,#0FDH ;波特率9600bps
MOV TL1,#0FDH
SETB TR1
clr ES
CLR TI
RET
DISPLAY_INIT:
MOV DPTR,#KEYLED_MODE
CLR A
MOVX @DPTR,A
RET
;延時程序
DELAY:
MOV R7,#0FFH
D1: MOV R6,#0ffh
DJNZ R6,$
DJNZ R7,D1
RET
;串口發送子程序
UART_SEND:
CLR TI
MOV A,@R0
MOV SBUF,A
JNB TI,$
CLR TI
INC R0
DJNZ R7,UART_SEND
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.1,BCAN_INT2 ;發送中斷
SETB DS_END_FLAG ;發送完成處理
BCAN_INT2:
MOV A,SAVE_INT_INFO
JNB ACC.2,BCAN_INT3 ;錯誤中斷
SETB ERR_FLAG ;置位錯誤標志
BCAN_INT3:
MOV A,SAVE_INT_INFO
JNB ACC.3 ,BCAN_INT4 ;超載中斷
SETB OVER_FLAG ;置位超載標志
BCAN_INT4:
MOV A,SAVE_INT_INFO
JNB ACC.4,BCAN_INT5 ;喚醒中斷
SETB WUI_FLAG ;喚醒中斷處理標志
BCAN_INT5:
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,#0FCH ;設置定時周期1MS
MOV TL0,#066H
SETB TOIR
LCALL DISPLAY_PRG
MOV A,FLIGHDISP
JZ NOFLIGH
INC FLIGHCOUNT
MOV A,FLIGHCOUNT
CJNE A,#200,NOFLIGH1
MOV FLIGHCOUNT,#00
CPL FLIGHSYNC
AJMP NOFLIGH1
NOFLIGH:
CLR FLIGHSYNC
NOFLIGH1:
INC DISP_POINT
MOV A,DISP_POINT
CJNE A,#05,NOMOVEDISPBIT
MOVEDISPBIT:
MOV DISP_POINT,#00
AJMP NEXT_DISPBIT
NOMOVEDISPBIT:
JNC MOVEDISPBIT
NEXT_DISPBIT:
INC SEC_COUNT_L ;單位時間計數器
MOV A,SEC_COUNT_L
CJNE A,#200,T0_QUIT ;判斷1/5秒時間是否到
MOV SEC_COUNT_L,#00 ;重新計數
INC SEC_COUNT_H ;單位時間計數器
MOV A,SEC_COUNT_H
CJNE A,#6,T0_QUIT ;判斷1秒時間是否到
MOV SEC_COUNT_H,#00 ;重新計數
SETB SEC_FLAG ;置位1秒到標志
INC TEST_DATA ;測試發送的數據,每1秒加1
T0_QUIT:
POP ACC
POP PSW
POP DPL
POP DPH
RETI
;;;;;;;LED 送顯處理程序;;;;;;;;;;
DISPLAY_PRG:
MOV DPTR,#KEYLED_BUF
MOV A,#0FFH
MOVX @DPTR,A
ORL P1,#0F8H
;;;;;;;UP IS DISABLE DISPLAY;;;;;;;;;;
MOV A,#DISPLAYBUF0
ADD A,DISP_POINT
MOV R0,A
MOV A,@R0
MOV DPTR,#DISPSEG_TAB
MOVC A,@A+DPTR
MOV DPTR,#KEYLED_BUF
MOVX @DPTR,A
;;;;;;;;UP IS SEND SEG;;;;;
MOV A,DISP_POINT
RL A
MOV DPTR,#DISPBIT_TAB
JMP @A+DPTR
;LED段碼譯碼
DISPSEG_TAB:
DB 0C0H,0F9H,0A4H,0B0H,099H,092H,082H,0F8H ; //0X00--0X07
DB 080H,090H,088H,083H,0c6H,0a1H,086H,08eH ; //0X08--0X0f
DB 0c8H,08cH,0bfH ; //n, p, -
;LED位跳轉
DISPBIT_TAB:
JMP DISP_LED0
JMP DISP_LED1
JMP DISP_LED2
JMP DISP_LED3
JMP DISP_LED4
DISP_LED0:
CLR EN_DISPBIT0
JNB FLIGHBIT0,DISP_QUIT
JNB FLIGHSYNC,DISP_QUIT
SETB EN_DISPBIT0
AJMP DISP_QUIT
DISP_LED1:
CLR EN_DISPBIT1
JNB FLIGHBIT1,DISP_QUIT
JNB FLIGHSYNC,DISP_QUIT
SETB EN_DISPBIT1
AJMP DISP_QUIT
DISP_LED2:
CLR EN_DISPBIT2
JNB FLIGHBIT2,DISP_QUIT
JNB FLIGHSYNC,DISP_QUIT
SETB EN_DISPBIT2
AJMP DISP_QUIT
DISP_LED3:
CLR EN_DISPBIT3
JNB FLIGHBIT3,DISP_QUIT
JNB FLIGHSYNC,DISP_QUIT
SETB EN_DISPBIT3
AJMP DISP_QUIT
DISP_LED4:
CLR EN_DISPBIT4
JNB FLIGHBIT4,DISP_QUIT
JNB FLIGHSYNC,DISP_QUIT
SETB EN_DISPBIT4
DISP_QUIT:
RET
;;;;;;;;;;系統出錯時顯示
DISP_ERROR:
MOV R0,#DISPLAYBUF0
INC R0
MOV @R0,#0EH
INC R0
MOV @R0,#12H
INC R0
MOV A,ERROR_STATUS
ANL A,#0F0H
SWAP A
MOV @R0,A
INC R0
MOV A,ERROR_STATUS
ANL A,#0FH
MOV @R0,A
MOV FLIGHDISP,#01FH
RET
;;;;;;;;;;CAN通訊正常時顯示
DISP_OK:
CLR A
MOV FLIGHDISP,A
MOV ERROR_STATUS,A
MOV R0,#DISPLAYBUF0+01
MOV @R0,#0
INC R0
MOV @R0,#12H
INC R0
MOV A,RCV_DATA_BUF3
ANL A,#0F0H
SWAP A
MOV @R0,A
INC R0
MOV A,RCV_DATA_BUF3
ANL A,#0FH
MOV @R0,A
RET
;
$INCLUDE (SJA_BCANFunc.ASM) ;導入子程序文件
END
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -