4.2 CAN通信程序設(shè)計(jì)
CAN應(yīng)用節(jié)點(diǎn)的通信程序設(shè)計(jì)主要包括三部分:初始化子程序、發(fā)送子程序、接收子程序,各個(gè)部分的具體程序如下[5]:
(1)CAN總線初始化子程序
NODE??? EQU??? 30H ;節(jié)點(diǎn)號(hào)緩沖區(qū)
NBTR0?? EQU??? 31H ;總線定時(shí)寄存器0緩沖區(qū)
NBTR1?? EQU??? 32H ;總線定時(shí)寄存器1緩沖區(qū)
…;定義RAM內(nèi)發(fā)送TXBF、接收RXBF緩沖區(qū),即40H與50H
…;再定義相應(yīng)的控制CR、命令CMR、狀態(tài)SR、中斷IR寄存器,即0BF00H-0BF04H
AMR???? EQU?? 0BF05H ;接收碼屏蔽寄存器
BTR0??? EQU??? 0BF06H ;總線定時(shí)寄存器0
BTR1??? EQU??? 0BF07H ;總線定時(shí)寄存器1
OCR???? EQU??? 0BF08H ;輸出控制寄存器
CDR???? EQU??? 0BF1FH ;時(shí)鐘分頻寄存器
… ;定義接收RXB、發(fā)送TXB緩沖器,即0BF14H與0BF0AH
CANINI: MOV?? DPTR,#CR?? ;寫(xiě)控制寄存器
MOV?? A,#01H????? ;置復(fù)位請(qǐng)求為高
MOVX? @DPTR, A
CANI1: MOVX? A, @DPTR???? ;判斷復(fù)位請(qǐng)求有效
JNB???? ACC.0, CANI1
MOV??? DPTR,? #ACR? ;寫(xiě)接收碼寄存器
MOV??? A, NODE?????? ;設(shè)置節(jié)點(diǎn)號(hào)
MOVX?? @DPTR,? A
MOV???? DPTR, #AMR? ;寫(xiě)接收碼屏蔽寄存器
MOV??? A, #00H
MOVX?? @DPTR, A
MOV???? DPTR, #BTR0? ;寫(xiě)總線定時(shí)寄存器0
MOV??? A ,? NBTR0??? ;設(shè)置波特率
MOVX?? @DPTR, A
… ;同上三行進(jìn)行寫(xiě)總線定時(shí)寄存器1并設(shè)置好波特率
MOV??? DPTR, #OCR?? ;寫(xiě)輸出控制寄存器
MOV???? A, #OFAH
MOV???? @DPTR, A
MOV???? DPTR, #CDR? ;寫(xiě)時(shí)鐘分頻寄存器
MOV???? A, #00H??? ;將CAN工作模式設(shè)為BasicCAN模式時(shí)鐘2分頻
MOVX??? @DPTR, A
MOV???? DPTR, #CR? ;寫(xiě)控制寄存器
MOV???? A, #0EH???? ;開(kāi)放中斷源
MOVX??? @DPTR, A
(2)CAN總線接收子程序
RXSB: MOV???? DPTR, #SR? ;讀狀態(tài)寄存器判斷接收緩沖區(qū)滿
MOVX?? A, @DPTR
JNB????? ACC.0, RXSB
RXSB1: MOV???? DPTR, #RXB? ;將接收的數(shù)據(jù)放在CPU RAM區(qū)
MOV????? R0, #RXBF
MOVX???? A, @DPTR
MOV????? @R0, A
INC????? R0
INC????? DPTR
MOVX??? A, @DPTR
MOV???? @R0, A
MOV???? B, A
RXSB2: INC????? DPTR
INC????? R0
MOVX?? A, @DPTR
MOV???? @R0, A
DJNZ???? B, RXSB2
MOV???? DPTR, #CMR? ;接收完畢釋放接收緩沖區(qū)
MOV???? A, #04H
MOVX??? @DPTR, A
MOV????? DPTR, #SR? ;讀此狀態(tài)寄存器
MOVX??? A, @DPTR
…;判斷ACC.1、ACC.7、ACC.6,分別跳到DATAOVER、BUSWRONG、CNTWRONG
SJMP?? RECEEND
DATAOVER:做相應(yīng)的數(shù)據(jù)益處錯(cuò)誤處理后直接跳到RECEEND
BUSWRONG:做總線錯(cuò)誤處理后直接跳到RECEEND
CNTWRONG:做數(shù)據(jù)錯(cuò)誤處理
RECEEND: ;接收任務(wù)結(jié)束
?。?)CAN總線發(fā)送子程序
TXSB: MOV???? DPTR, #SR?? ;讀狀態(tài)寄存器
MOVX??? A, @DPTR?? ;判斷發(fā)送緩沖區(qū)狀態(tài)
JNB?????? ACC.2, TXSB
MOV????? R1, #TXBF
MOV????? DPTR, #TXB
TX1: MOV????? A, @R1?????? ;向發(fā)送緩沖區(qū)10填入標(biāo)示符
MOVX??? @DPTR, A
INC?????? R1
INC?????? DPTR
MOV????? A, @R1?????? ;向發(fā)送緩沖區(qū)11填入數(shù)據(jù)長(zhǎng)度
MOVX???? @DPTR, A
MOV????? B, A
TX2:? INC?????? R1
INC?????? DPTR
MOV????? A, @R1??? ;向發(fā)送緩沖區(qū)12到19送數(shù)據(jù)
MOVX???? @DPTR, A
DJNZ????? B, TX2
MOV????? DPTR, #CMR? ;置CMR.0為1請(qǐng)求發(fā)送
MOV????? A, #01H
MOVX??? @DPTR, A
5.設(shè)計(jì)總結(jié)
根據(jù)上述的嵌入式溫度測(cè)量系統(tǒng)設(shè)計(jì)出的測(cè)溫系統(tǒng)能通過(guò)熱電偶實(shí)現(xiàn)自動(dòng)溫度信號(hào)采集,再由MAX6675將此信號(hào)轉(zhuǎn)換成12位的數(shù)字信號(hào)輸入到微處理器,讓微處理器對(duì)它進(jìn)行自動(dòng)處理后送到LED顯示器顯示出來(lái),也可以通過(guò)CAN總線送向上位機(jī),實(shí)現(xiàn)遠(yuǎn)程測(cè)量溫度和網(wǎng)絡(luò)監(jiān)視控制的功能。整個(gè)系統(tǒng)采用12位的高速的模數(shù)轉(zhuǎn)換系統(tǒng),使其溫度測(cè)量誤差可以達(dá)到小于0.1°C,同時(shí)系統(tǒng)也具有良好的實(shí)時(shí)性[6]。本文作者創(chuàng)新點(diǎn):運(yùn)用嵌入式系統(tǒng)設(shè)計(jì)思想和方法、結(jié)合相應(yīng)的測(cè)溫精度和實(shí)時(shí)性、采用CAN工業(yè)通信總線標(biāo)準(zhǔn),設(shè)計(jì)出一種基于CAN總線的嵌入式測(cè)溫系統(tǒng),此系統(tǒng)可以作為一種通用的小型測(cè)溫系統(tǒng)使用也可以嵌入到其他大型的工業(yè)檢測(cè)與控制系統(tǒng)中。
評(píng)論