一對(duì)多的通訊單片機(jī)匯編語言編程舉例
一對(duì)多的通訊(用第9位作地址和數(shù)據(jù)的區(qū)分位)
協(xié)議:
1)主機(jī)置SM2=0。所有從機(jī)初始狀態(tài)時(shí)置SM2=1;
2)主機(jī)向從機(jī)發(fā)送地址信息一個(gè)字節(jié),第9位(TB8)=1。
3)主機(jī)向從機(jī)發(fā)送數(shù)據(jù)信息一個(gè)字節(jié),第9位(TB8)=0。
4)主機(jī)發(fā)送某一從機(jī)地址信息一個(gè)字節(jié),第9位(TB8)=1。
5)所有從機(jī)都能接收到主機(jī)發(fā)送的地址信息。
6)從機(jī)接收到地址信息后,與本從機(jī)號(hào)進(jìn)行比較;若地址符合,置本從機(jī)SM2=0,且向主機(jī)發(fā)送本從機(jī)號(hào)作為應(yīng)答(TB8=0)。
7)主機(jī)接收到從機(jī)正確應(yīng)答后,開始發(fā)送數(shù)據(jù)字節(jié),第9位TB8=0。
8)只有對(duì)應(yīng)從機(jī)才能接收到主機(jī)的數(shù)據(jù)信息,并能與主機(jī)對(duì)話。
9)結(jié)束主機(jī)與對(duì)應(yīng)從機(jī)一次通訊后,該從機(jī)置SM2=1。
10) 主機(jī)返回步驟4)。
通訊程序的特殊部分示例:
主機(jī)方:(例如:主機(jī)與第3號(hào)從機(jī)通訊)
,,,,,,,,,,
MASTER: MOV SCON,#98H ;串口方式2,SM2=0,REN=1,TB8=0
MTT1: MOV SBUF,#03H ;發(fā)送第3號(hào)從機(jī)號(hào)
WAIT1: JBC TI,WAIT2
SJMP WAIT1
WAIT2: JBC RI,MRR1 ;等待接收應(yīng)答
SJMP WAIT2
MRR1: MOV A,SBUF ;接收應(yīng)答
XRL A,#03H ;比較是3號(hào)從機(jī)嗎?
JZ RIGHT ;是,轉(zhuǎn)向發(fā)送數(shù)據(jù)
ERR: MOV SBUF,#0 ;不是,(#發(fā)送復(fù)位信號(hào))
WAIT3: JBC TI,ERR1 ;
SJMP WAIT3 ;
ERR1: SJMP MTT1 ;重新呼叫
RIGHT: CLR TB8 ;聯(lián)絡(luò)成功,TB8=0
,,,,,,, ;發(fā)送數(shù)據(jù)
第3號(hào)從機(jī)響應(yīng):
,,,,,,,,,
SLAVE: MOV SCON,#0B0H ;串口方式2,SM2=1,REN=1
,,,,,,,
SRR1: JBC RI,SRR2 ;等待接收地址信號(hào)
SJMP SRR1
SRR2: MOV A,SBUF
XRL A,#03H
JNZ SRR1 ;接收到的不是本從機(jī)號(hào)
CLR SM2 ;主機(jī)是呼叫本從機(jī)
CLR TB8 ;清SM2=0,準(zhǔn)備接收數(shù)據(jù),TB8=0
MOV SBUF,#03H ;發(fā)送本機(jī)號(hào)給主機(jī)作為應(yīng)答
WAIT: JBC TI,SRR3
SJMP WAIT
SRR3: JBC RI,SRR4 ;等待主機(jī)發(fā)送數(shù)據(jù)
SJMP SRR3
SRR4: JNB RB8,RIGHT ;是復(fù)位信號(hào)嗎?
SETB SM2 ;是,恢復(fù)監(jiān)聽地址。
SJMP SRR1 ;
RIGHT: MOV A,SBUF ;成功,接收數(shù)據(jù)