?? test3.asm
字號(hào):
$INCLUDE (SJA_BCANCONF.ASM) ;導(dǎo)入硬件定義文件
;;;;;;;;;;;;;;;;定義錯(cuò)誤字
;
;使用前變量定義
RCV_GOOD BIT 0FH ;成功的接收一幀標(biāo)志
SEC_FLAG BIT 010H ;一秒到標(biāo)志
ERR_FLAG BIT 011H ;監(jiān)測(cè)到錯(cuò)誤標(biāo)志
OVER_FLAG BIT 012H ;超載標(biāo)志
DS_END_FLAG BIT 013H ;SJA1000發(fā)送完成標(biāo)志
WUI_FLAG BIT 014H ;喚醒SJA1000標(biāo)志
TOIR BIT 015H ;定時(shí)器T0標(biāo)志
;;;;;;;;;;;;;;;顯示閃爍標(biāo)志區(qū);;;;;;;;;;;;;;;;;;;;
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
;;;;;;;;;;;;;;;顯示閃爍頻率計(jì)數(shù);;;;;;;;;;;;;;;;;;;;
FLIGHCOUNT DATA 07EH
;;;;;;;;;;;;;;;顯示位選計(jì)數(shù);;;;;;;;;;;;;;;;;;;;
DISP_POINT DATA 07DH
SEC_COUNT_L DATA 030H ;秒定時(shí)計(jì)數(shù)器
SEC_COUNT_H DATA 031H
SAVE_INT_INFO DATA 032H ;保存SJA1000中斷寄存器的內(nèi)容
ERRORCOUNT DATA 033H ;錯(cuò)誤計(jì)數(shù)
DISPLAYBUF0 DATA 034H ;顯示緩沖區(qū)34H--38H
;
SEND_DATA_BUF1 DATA 040H ;發(fā)送緩沖區(qū)
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 ;接收緩沖區(qū)
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 ;錯(cuò)誤狀態(tài)表示
TEST_DATA DATA 07FH ;測(cè)試發(fā)送數(shù)據(jù)
;程序開(kāi)始
ORG 0000H
LJMP MAIN ;運(yùn)行主程序
ORG 0003H
LJMP BCAN_INT0 ;中斷方式訪問(wèn)SJA1000程序
ORG 000BH
LJMP T0_INTERRUPT ;定時(shí)器0中斷
ORG 0100H ;程序開(kāi)始
MAIN:
;內(nèi)部RAM清零
MOV R0,#07fH
CLR A
MOV @R0,A
DJNZ R0,$-1
MOV @R0,A
MOV SP,#60H ;設(shè)置SP
LCALL DELAY ;延時(shí)
LCALL DELAY
LCALL UART_INIT ;串口初始化
LCALL T0_INIT
SETB EA
MOV ErrorCount, #020H ;32次,報(bào)錯(cuò)
SJA1000_INIT0:
LCALL BCAN_CREATE_COMMUNATION ;調(diào)用SJA1000接口測(cè)試函數(shù)
JNB F0, SJA1000_INIT1;接口正常,初始化SJA1000
DJNZ ErrorCount , SJA1000_INIT0 ;接口不正常,再檢測(cè)
MOV ERROR_STATUS,#SJA_INTFACE_ERR
LJMP ERROR_HANDLE ;錯(cuò)誤處理
SJA1000_INIT1:
;設(shè)置接收任何類型的標(biāo)志符,波特率1000Kbps(16MHZ的晶體),關(guān)閉CLKOUT則,
;ACR=任何值,AMR=0FFH,BTR0=084H,BTR1=0A7H,OC==0aaH,CDR=048H
;首先設(shè)置參數(shù)
MOV ErrorCount, #020H ;32次,報(bào)錯(cuò)
SJA1000_INIT11:
MOV R7, #012
LCALL BCAN_SET_BANDRATE ;設(shè)置波特率為100k
AJMP SJA1000_INIT2
;JNB F0, SJA1000_INIT2 ;判斷設(shè)置是否成功
DJNZ ErrorCount , SJA1000_INIT11 ;接口不正常,再檢測(cè)
MOV ERROR_STATUS,#SJA_INITBTR_ERR
LJMP ERROR_HANDLE
SJA1000_INIT2:
MOV ErrorCount, #020H ;32次,報(bào)錯(cuò)
SJA1000_INIT21:
;設(shè)置接收?qǐng)?bào)文ID
MOV R7, #00
MOV R6, #0FFH
LCALL BCAN_SET_OBJECT
AJMP SJA1000_INIT3
JNB F0, SJA1000_INIT3 ;判斷設(shè)置是否成功
DJNZ ErrorCount , SJA1000_INIT21
MOV ERROR_STATUS,#SJA_INITOBJ_ERR
LJMP ERROR_HANDLE
SJA1000_INIT3:
MOV ErrorCount, #020H ;32次,報(bào)錯(cuò)
SJA1000_INIT31:
;設(shè)置輸出控制、時(shí)鐘分頻
MOV R7, #0AAH ;正常輸出模式
MOV R6, #048H ;使能內(nèi)部比較器、禁止CLKOUT
LCALL BCAN_SET_OUTCLK ;
AJMP SJA1000_INIT4
JNB F0, SJA1000_INIT4 ;判斷設(shè)置是否成功
DJNZ ErrorCount , SJA1000_INIT31
MOV ERROR_STATUS,#SJA_INITOCLK_ERR
LJMP ERROR_HANDLE
SJA1000_INIT4:
MOV ErrorCount, #020H ;32次,報(bào)錯(cuò)
SJA1000_INIT41:
LCALL BCAN_QUIT_RETMODEL ;退出復(fù)位狀態(tài)
AJMP SJA1000_INIT5
JNB F0, SJA1000_INIT5 ;判斷設(shè)置是否成功
DJNZ ErrorCount , SJA1000_INIT41
MOV ERROR_STATUS,#0FEH;#SJA_INIT_ERR
LJMP ERROR_HANDLE
SJA1000_INIT5:
MOV DPTR,#REG_CONTROL ;開(kāi)放SJA1000內(nèi)部功能中斷
MOV A,#0FEH ;中斷開(kāi)放
MOVX @DPTR,A
; LCALL T0_INIT ;初始化定時(shí)器0
SETB PX0 ;設(shè)置外部中斷0為最高優(yōu)先級(jí)
SETB IT0 ;設(shè)置外部中斷位邊緣觸發(fā)
MOV IE,#083H ;開(kāi)放中斷EXO,總中斷位EA,俄ET0
LOOPER:
JBC TOIR,MS_DEALPRG
LOOPER1:
JBC RCV_GOOD,RCVDATA_PRG ;sja1000成功接收一幀,通知CPU處理
LOOPER2:
JBC SEC_FLAG,SENDDATA_PRG ;一秒時(shí)間到,每秒發(fā)送一次
LOOPER3:
JBC ERR_FLAG,ERR_PRG ;錯(cuò)誤標(biāo)志,錯(cuò)誤處理
LOOPER4:
JBC OVER_FLAG,DOVER_PRG ;超載處理
LOOPER5:
JBC DS_END_FLAG,DSEND_PRG ;報(bào)文發(fā)送完成
LOOPER6:
JBC WUI_FLAG,WOKE_PRG ;喚醒處理
AJMP LOOPER
MS_DEALPRG:
; LCALL DISPLAY_PRG
AJMP LOOPER1
;發(fā)現(xiàn)錯(cuò)誤處理
ERR_PRG:
LCALL BCAN_ENTER_RETMODEL ;進(jìn)入復(fù)位模式
MOV ERROR_STATUS,#SJA_SEND_ERR
;錯(cuò)誤信息處理
ERROR_HANDLE:
LCALL DISP_ERROR
LCALL DELAY
LCALL DELAY
LJMP SJA1000_INIT0 ;現(xiàn)錯(cuò)誤,根據(jù)實(shí)際情況處理
;數(shù)據(jù)超載處理
DOVER_PRG:
MOV R7,#08H ;清除數(shù)據(jù)超載
LCALL BCAN_CMD_PRG ;
LJMP LOOPER5
;上一次發(fā)送的數(shù)據(jù)發(fā)送完畢處理
DSEND_PRG:
LCALL DISP_OK
LJMP LOOPER6
;喚醒中斷處理
WOKE_PRG: ;喚醒處理
LJMP LOOPER
;接收數(shù)據(jù)處理部分
RCVDATA_PRG:
;LCALL UART_INIT
MOV R0,# RCV_DATA_BUF1 ;微處理器接收首地址
LCALL BCAN_DATA_RECEIVE ;調(diào)用接收數(shù)據(jù)子程序
MOV R7,#04H ;釋放接收緩沖區(qū)
LCALL BCAN_CMD_PRG ;
;將接收的數(shù)據(jù)發(fā)送至串口
MOV R0,# RCV_DATA_BUF2 ;計(jì)算接收數(shù)據(jù)長(zhǎng)度判斷遠(yuǎn)程幀、數(shù)據(jù)幀
MOV A,@R0
JB ACC.4,RD_PRG1 ;遠(yuǎn)程幀
;數(shù)據(jù)幀
ANL A,#0FH ;計(jì)算數(shù)據(jù)數(shù)目
ADD A,#02H ;計(jì)算幀的數(shù)據(jù)長(zhǎng)度
MOV R7, A
AJMP RD_UARTSD
RD_PRG1:
MOV R7,#02H
RD_UARTSD:
MOV R0,#RCV_DATA_BUF1 ;微處理器接收首地址
LCALL UART_SEND ;調(diào)用串口發(fā)送程序
LCALL DISP_OK
LJMP LOOPER2
;控制SJA1000向CAN總線發(fā)送數(shù)據(jù)處理部分
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 ;將特定格式的幀存入發(fā)送緩沖區(qū)
MOV R0, #SEND_DATA_BUF1
LCALL BCAN_DATA_WRITE ;將要發(fā)送的數(shù)據(jù)送入發(fā)送緩沖區(qū)
MOV R7, #01
LCALL BCAN_CMD_PRG
LJMP LOOPER3
;定時(shí)器0初始化
T0_INIT:
MOV A,TMOD
ANL A,#0F0H
ORL A,#01H
MOV TMOD,A;T0工作在方式1
MOV TH0,#0FCH ;定時(shí)周期1MS
MOV TL0,#066H
SETB ET0
MOV TCON,#055H ;啟動(dòng)定時(shí)器
RET
;串口初始化
UART_INIT:
MOV SCON,#050H ;串口數(shù)據(jù)1個(gè)STOP,8個(gè)DATA,無(wú)校驗(yàn)
MOV A,TMOD
ANL A,#0FH
ORL A,#020H
MOV TMOD,A ;用定時(shí)器1做波特率發(fā)生器
MOV TH1,#0FDH ;波特率9600bps
MOV TL1,#0FDH
SETB TR1
clr ES
CLR TI
RET
;延時(shí)程序
DELAY:
MOV R7,#0FFH
D1: MOV R6,#0ffh
DJNZ R6,$
DJNZ R7,D1
RET
;串口發(fā)送子程序
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 ;應(yīng)用寄存器第3組
MOV DPTR,#REG_INTERRUPT ;讀中斷寄存器
MOVX A,@DPTR ;
MOV SAVE_INT_INFO,A ;保存中斷寄存器的內(nèi)容
JNB ACC.0,BCAN_INT1 ;接收中斷
SETB RCV_GOOD ;置位接收標(biāo)志
BCAN_INT1:
MOV A,SAVE_INT_INFO
JNB ACC.1,BCAN_INT2 ;發(fā)送中斷
SETB DS_END_FLAG ;發(fā)送完成處理
BCAN_INT2:
MOV A,SAVE_INT_INFO
JNB ACC.2,BCAN_INT3 ;錯(cuò)誤中斷
SETB ERR_FLAG ;置位錯(cuò)誤標(biāo)志
BCAN_INT3:
MOV A,SAVE_INT_INFO
JNB ACC.3 ,BCAN_INT4 ;超載中斷
SETB OVER_FLAG ;置位超載標(biāo)志
BCAN_INT4:
MOV A,SAVE_INT_INFO
JNB ACC.4,BCAN_INT5 ;喚醒中斷
SETB WUI_FLAG ;喚醒中斷處理標(biāo)志
BCAN_INT5:
POP ACC
POP PSW
POP DPL
POP DPH
RETI
;定時(shí)器0中斷
T0_INTERRUPT:
push DPH
PUSH DPL
PUSH PSW ;PSW、ACC入棧
PUSH ACC
USING 2
MOV TH0,#0FCH ;設(shè)置定時(shí)周期1MS
MOV TL0,#066H
SETB TOIR
LCALL DSEG_CONTRL
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 SEC_COUNT_L ;單位時(shí)間計(jì)數(shù)器
MOV A,SEC_COUNT_L
CJNE A,#200,T0_QUIT ;判斷1/5秒時(shí)間是否到
MOV SEC_COUNT_L,#00 ;重新計(jì)數(shù)
INC SEC_COUNT_H ;單位時(shí)間計(jì)數(shù)器
MOV A,SEC_COUNT_H
CJNE A,#6,T0_QUIT ;判斷1秒時(shí)間是否到
MOV SEC_COUNT_H,#00 ;重新計(jì)數(shù)
SETB SEC_FLAG ;置位1秒到標(biāo)志
INC TEST_DATA ;測(cè)試發(fā)送的數(shù)據(jù),每1秒加1
T0_QUIT:
POP ACC
POP PSW
POP DPL
POP DPH
RETI
;;;;;;;LED 送顯處理程序;;;;;;;;;;
;;;;;;;LED 送顯處理程序;;;;;;;;;;
DISPLAY_PRG:
MOV A,#0FFH
MOV P1,A
LCALL DISP
;;;;;;;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
LCALL DISP
;;;;;;;;UP IS SEND SEG;;;;;
MOV P1,#0FFH
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, -
DISP:
MOV R3,#08H
DUP: RLC A
MOV P1.0,C
CLR P1.1
SETB P1.1
DJNZ R3,DUP
RET
;LED位跳轉(zhuǎn)
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
;;;;;;;;;;系統(tǒng)出錯(cuò)時(shí)顯示
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通訊正常時(shí)顯示
DISP_OK:
CLR A
MOV FLIGHDISP,A
MOV ERROR_STATUS,A
MOV R0,#DISPLAYBUF0+1
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
DSEG_CONTRL:
CLR C
INC DISP_POINT
MOV A,DISP_POINT
CJNE A,#05,MOVEDISP
DSEG_CONTRL1:
MOV DISP_POINT,#00
RET
MOVEDISP:
JNC DSEG_CONTRL1
RET
$INCLUDE (SJA_BCANFunc.ASM) ;導(dǎo)入子程序文件
END
?? 快捷鍵說(shuō)明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -