新聞中心

EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > Proteus7.5的小故事(2)單片機(jī)多機(jī)通信匯編實(shí)現(xiàn)

Proteus7.5的小故事(2)單片機(jī)多機(jī)通信匯編實(shí)現(xiàn)

作者: 時(shí)間:2016-11-25 來源:網(wǎng)絡(luò) 收藏
近日學(xué)習(xí)測(cè)控網(wǎng)絡(luò)技術(shù),一時(shí)無趣想起以前學(xué)51時(shí)后面的串行通信的多機(jī)通信部分還未嘗試過,雖然技術(shù)可能已經(jīng)過時(shí),但是對(duì)于理解網(wǎng)絡(luò)協(xié)議的基本原理還是有些裨益的。單片機(jī)的多機(jī)通信最重要的就是SM2位的使用,主從式通信方式中,主機(jī)以廣播形式發(fā)送地址幀,程序控制主機(jī)SM2為1,此時(shí)TB8位置1,從機(jī)初始時(shí)SM2=1,當(dāng)接收到RB8為1時(shí),引起接受中斷,這時(shí)主、從機(jī)通過約定的應(yīng)答機(jī)制進(jìn)行校驗(yàn),即從機(jī)收到地址后與自身上電就得到的本機(jī)地址比較,如確定是在找自己,就發(fā)送應(yīng)答,清零SM2開始接收數(shù)據(jù),仿真原理圖如下所示:


主要實(shí)現(xiàn)代碼如下:

本文引用地址:http://butianyuan.cn/article/201611/321514.htm

多機(jī)通信主機(jī):

DATA_ACK EQU 2AH;本例中未使用
ADDR_ACK EQU 1AH;地址校驗(yàn)幀
DATA_BUF EQU 40H ;按鍵中斷數(shù)據(jù)的存放區(qū)
WORK_FLAG EQU P2.0 ;可作為單片機(jī)類程序設(shè)計(jì)的軟件調(diào)試接口
SLAVE_ADDR EQU 30H ;單片機(jī)上電后獲得的本機(jī)地址
ORG 0000H
AJMP MAIN
ORG 0003H
AJMP INT_EX0
ORG 000BH ;使用定時(shí)器產(chǎn)生1s
;AJMP INT_T0
ORG 0013H
AJMP INT_EX1
ORG 001BH
;AJMP INT_T1
ORG 0023H
; AJMP SEND_DATA
ORG 50H

MAIN:
MOV SP,#60H
MOV DATA_BUF,#0
MOV P0,#0C0H
MOV SLAVE_ADDR,P1
;定時(shí)器初始化
MOV TMOD,#20H
MOV TH1,#0FDH
MOV TL1,#0FDH

MOV SCON,#0D0H ;串口工作在方式3,多機(jī)位值1,允許接受
MOV TB8 ,#1 ;發(fā)送地址
SETB TR1 ;open the timer1
SETB IT0
SETB EX0
SETB IT1
SETB EX1
;SETB ES
SETB EA


HERE:

LCALL HANDLE_DATA
;LCALL RECEIVE_ACK
LCALL DISPLAY
SJMP HERE

HANDLE_DATA:
MOV A,TB8
JNZ HANDLE_ADR
;MOV WORK_FLAG,#0
MOV TB8,#0


MOV R0,#DATA_BUF
MOV SBUF,@R0
JNB TI,$
MOV WORK_FLAG,#0
CLR TI
;MOV TB8,#0
RET
HANDLE_ADR:

MOV A,SLAVE_ADDR
MOV SBUF,A
JNB TI,$
CLR TI


RECEIVE_ACK:
JNB RI,$
CLR RI
MOV A,SBUF
XRL A,ADDR_ACK
MOV TB8,#0
JZ HANDLE_DATA

MOV TB8,#1

RET

INT_EX0:

CLR EX0
PUSH ACC
PUSH PSW
MOV A,DATA_BUF
INC A
MOV DATA_BUF,A
CJNE A,#10,EXIT
MOV DATA_BUF,#0

EXIT:
POP PSW
POP ACC
SETB EX0
RETI

INT_EX1:
CLR EX1
PUSH ACC
PUSH PSW
MOV A,DATA_BUF
DEC A
MOV DATA_BUF,A
CJNE A,#0FFH,QUIT
MOV DATA_BUF,#9

QUIT:
POP PSW
POP ACC
SETB EX1
RETI
DISPLAY:
MOV DPTR,#DATASEG
MOV R0,#DATA_BUF
MOV A,@R0
MOVC A,@A+DPTR
;MOV P0,#0FFH
MOV P0,A
ACALL DELAY
RET
DELAY:
MOV R6,#25 ;5MS
DEL1:
MOV R7,#98 ; ;98
DJNZ R7,$
DJNZ R6,DEL1
RET

DATASEG:
DB 0C0H,0F9H,0A4H,0B0H,099H,092H,082H,0F8H
DB 080H,090H,0BFH
END

多機(jī)通信從機(jī):

DATA_ACK EQU 2AH
ADDR_ACK EQU 1AH
DATA_BUF EQU 40H
WORK_FLAG EQU P2.0
SLAVE_ADDR EQU 30H
TEMP_BUF EQU 31H
ORG 0000H
AJMP MAIN
ORG 0003H
AJMP INT_EX0
ORG 000BH ;使用定時(shí)器產(chǎn)生1s
;AJMP INT_T0
ORG 0013H
AJMP INT_EX1
ORG 001BH
;AJMP INT_T1
ORG 0023H
; AJMP RECIVE_DATA
ORG 50H

MAIN:
MOV SP,#60H
MOV DATA_BUF,#0
MOV P0,#0C0H
MOV SLAVE_ADDR,P1
MOV R5,#0
;定時(shí)器初始化
MOV TMOD,#20H
MOV TH1,#0FDH;

MOV TL1,#0FDH

MOV SCON,#0D0H ;串口工作在方式3,多機(jī)位值1,允許接收
SETB SM2 ;多機(jī)通信控制位1
SETB TR1 ;open the timer1
SETB IT0
SETB EX0 ;從機(jī)暫未使用
SETB IT1
SETB EX1 ;從機(jī)暫未使用
SETB EA


HERE:

LCALL HANDLE_DATA

LCALL DISPLAY
SJMP HERE

HANDLE_DATA:

JNB RI,$
CLR RI
MOV A,SBUF
MOV TEMP_BUF,A
JNB SM2, DATA_RECEIVE
XRL A,SLAVE_ADDR
JNZ OVER
MOV A,ADDR_ACK
MOV SBUF,A
CLR A
JNB TI,$
CLR TI
CLR SM2
RET
OVER:
SETB SM2
RET

DATA_RECEIVE:
MOV WORK_FLAG,#0
MOV DATA_BUF,TEMP_BUF
RET
INT_EX0:

CLR EX0
PUSH ACC
PUSH PSW
MOV A,DATA_BUF
INC A
MOV DATA_BUF,A
CJNE A,#10,EXIT
MOV DATA_BUF,#0

EXIT:
POP PSW
POP ACC
SETB EX0
RETI

INT_EX1:
CLR EX1
PUSH ACC
PUSH PSW
MOV A,DATA_BUF
DEC A
MOV DATA_BUF,A
CJNE A,#0FFH,QUIT
MOV DATA_BUF,#9

QUIT:
POP PSW
POP ACC
SETB EX1
RETI
DISPLAY:

MOV DPTR,#DATASEG
MOV R0,#DATA_BUF
MOV A,@R0
MOVC A,@A+DPTR
;MOV P0,#0FFH
MOV P0,A
ACALL DELAY
RET
DELAY:
MOV R6,#25 ;5MS
DEL1:
MOV R7,#98 ; ;98
DJNZ R7,$
DJNZ R6,DEL1
RET

DATASEG:
DB 0C0H,0F9H,0A4H,0B0H,099H,092H,082H,0F8H
DB 080H,090H,0BFH
END

仿真時(shí)注意波特率的設(shè)定,計(jì)算時(shí)晶振代入的是12MHZ(X約為253)而為了保證波特率的誤差小于2.5%,主機(jī)設(shè)為11.05926MHZ,從機(jī)設(shè)為12MHZ。



評(píng)論


技術(shù)專區(qū)

關(guān)閉