?? 多機(jī)通訊程序.txt
字號(hào):
初學(xué)者:who can help me? [叮當(dāng)] [61次] 01-5-24 上午 09:07:20
小妹我要完成一課題,單片機(jī)多機(jī)通信(89c51),現(xiàn)在時(shí)間快到了,而我卻毫無(wú)頭緒!!
(對(duì)這不感興趣)哪位大哥能幫一下忙,提供程序(匯編),在這里我先謝過(guò)了!!
(具體要求:?jiǎn)纹瑱C(jī)一對(duì)多通信,主機(jī)用輪詢方式與從機(jī)通信,演示以LED顯示器演示,好像
是主機(jī)發(fā)送一個(gè)數(shù)字,從機(jī)接收并用LED顯示(希望能說(shuō)明89c51和LED的連接方法,我這也
不會(huì))
98年做的多機(jī)通訊程序 [方塘] [51次] 01-5-24 上午 09:17:41
;98年做的多機(jī)通訊程序 ,我記得是調(diào)試通過(guò)的。不知對(duì)你能不能有幫助。
;-------發(fā)送,
TXDATA EQU 1000H
org 0h
main: LCALL SENTDATA
MOV R2, #05H ;R2存放從機(jī)地址
MOV R3, #00 ;R3存放控制代碼
MOV DPTR,#TXDATA
MOV R4, #39
LCALL M_TXSUB
LJMP P_END
;通訊協(xié)議:
;1,系統(tǒng)允許接255臺(tái)從機(jī),其地址分別為00H--FEH
;2,地址FFH是對(duì)所有從機(jī)都起作用的一條控制命令,命令各從機(jī)恢復(fù)SM2=1狀態(tài)
;3,主機(jī)和從機(jī)的聯(lián)絡(luò)過(guò)程為:主機(jī)首先發(fā)送地址幀,被尋址從機(jī)返回本機(jī)地址給
;主機(jī),在判斷地址相符后給被尋址從機(jī)發(fā)送控制命令,被尋址從機(jī)根據(jù)其命令向
;主機(jī)回送自己的狀態(tài),若主機(jī)開(kāi)始發(fā)送或接收數(shù)據(jù),發(fā)送或接收的第一個(gè)字節(jié)是
;數(shù)據(jù)塊長(zhǎng)度
;4,假定主機(jī)發(fā)送的控制命令代碼為:
; 00:要求從機(jī)接收數(shù)據(jù)塊
; 01:要求從機(jī)發(fā)送數(shù)據(jù)塊 ;其它:非法命令
;5,從機(jī)狀態(tài)字格式: |D7 |D6 |D5 |D4 |D3 |D2 |D1 | D0 |
; |ERR| 0 | 0 | 0 | 0 | 0 |TRDY| RRDY|
;其中,若 ERR=1, 從機(jī)接收到非法命令;
; 若 TRDY=1,從機(jī)發(fā)送準(zhǔn)備就緒;
; 若 RRDY=1,從機(jī)接收準(zhǔn)備就緒;
M_TXSUB: MOV TMOD, #20H
MOV TH1, #0E8H ;波特率為1200bit/s
MOV TL1, #0E8H
MOV PCON, #00
MOV SCON, #0D8H ;#11011000B串行方式3,允許接收,TB8=1
SETB TR1
CLR EA
mov r0, #7fh
mov a, #00001110b ;enable 232
movx @r0, a
mov a, #00001011b ;disable 422
movx @r0, a
MOV A, R2 ;R2存放從機(jī)地址
MOV SBUF, A
TX_ADD: JBC TI, RX_REPLY
SJMP TX_ADD
RX_REPLY: JBC RI, RX_ADD ;等待從機(jī)應(yīng)答
SJMP RX_REPLY
RX_ADD: MOV A, SBUF
XRL A, R2 ;判斷應(yīng)答地址相符否?
JZ TX_COMM ;
ISNOT: MOV A, #0FFH ;不符,重新聯(lián)絡(luò)
SETB TB8
MOV SBUF, A
LOOP1: JNB TI, LOOP1
CLR TI
SJMP TX_ADD
TX_COMM: CLR TB8 ;地址符合,置TB8=0,準(zhǔn)備發(fā)送命令
MOV A, R3 ;R3存放控制代碼 #00:要求從機(jī)接收數(shù)據(jù)
MOV SBUF, A ;發(fā)送命令
TX_COMM1: JBC TI, RX_STATE
SJMP TX_COMM1
RX_STATE: JBC RI, RIGHT ;接收從機(jī)狀態(tài)
SJMP RX_STATE
RIGHT: MOV A, SBUF
JNB ACC.7,GO_ON ;接收到命令繼續(xù)
SJMP ISNOT ;否則,重新聯(lián)絡(luò)
GO_ON: CJNE R3, #00H,RECEIVE;要求從機(jī)發(fā)送就跳轉(zhuǎn)
JNB ACC.0,ISNOT ;從機(jī)接收未準(zhǔn)備就緒,返回重新聯(lián)絡(luò)
TX_BYTES: MOV A, R4 ;發(fā)送數(shù)據(jù)塊長(zhǎng)度, R4為入口參數(shù)
MOV SBUF, A
TX_WAIT1: JBC TI, TX_DATA
SJMP TX_WAIT1
TX_DATA: MOVX A, @DPTR ;發(fā)送數(shù)據(jù)塊
MOV SBUF, A
TX_WAIT2: JBC TI, NEXTDATA
SJMP TX_WAIT2
NEXTDATA: INC DPTR
DJNZ R4, TX_DATA ;未完繼續(xù)
SJMP SUBEND ;發(fā)送完數(shù)據(jù),返回主程序
RECEIVE: JNB ACC.1,ISNOT ;從機(jī)發(fā)送未準(zhǔn)備就緒,返回重新聯(lián)絡(luò)
RX_BYTES: JBC RI, RX_BYTES1 ;接收數(shù)據(jù)塊長(zhǎng)度
SJMP RX_BYTES
RX_BYTES1:MOV A, SBUF
MOV R4, A ;R4暫存數(shù)據(jù)塊長(zhǎng)度
MOVX @DPTR,A ;保存數(shù)據(jù)塊長(zhǎng)度
RX_DATA: JBC RI, RX_DATA1
SJMP RX_DATA
RX_DATA1: MOV A, SBUF
MOVX @DPTR,A
INC DPTR
DJNZ R4, RX_DATA ;未完繼續(xù)
SUBEND: RET ;接收完數(shù)據(jù),返回主程序
;**********************************************************
98年做的多機(jī)通訊程序---接收 [方塘] [38次] 01-5-24 上午 09:21:50
;98年做的多機(jī)通訊程序 ,我記得是調(diào)試通過(guò)的。不知對(duì)你能不能有幫助。
;-------接收,
RXBUF EQU 1000H
LJMP MAIN
ORG 0023H
LJMP S_RX_INT
MAIN:
LCALL INIT_COM
WAIT_INT:
CLR EA
CLR ES
MOV DPTR, #RXBUF
MOV R4, #36
SETB PSW.5
;CLR PSW.1
SETB PSW.1
SETB EA ;開(kāi)中斷
SETB ES ;允許串行口中斷
LJMP WAIT_INT
;**********************************************************
;入口參數(shù):DPTR:從機(jī)發(fā)送數(shù)據(jù)塊首地址
; R4: 發(fā)送數(shù)據(jù)塊長(zhǎng)度
; R2: 從機(jī)地址
S_RX_INT: CLR RI ;等待主機(jī)聯(lián)絡(luò)(只有主機(jī)發(fā)來(lái)的是地址幀
PUSH ACC ;才激活RI)
PUSH PSW
CLR RS0
SETB RS1
MOV A, SBUF
XRL A, #05H ;判斷是否本機(jī)地址,本機(jī)地址為:#05H
JZ ISME ;是本機(jī)地址,跳轉(zhuǎn)
Return: POP PSW ;不是本機(jī)地址,中斷返回等待主機(jī)聯(lián)絡(luò)
POP ACC
RETI ;中斷返回
ISME: CLR SM2 ;清SM2,為接收主機(jī)命令作準(zhǔn)備
MOV SBUF, #05H ;從機(jī)地址回送主機(jī)
TX_ADD: JNB TI, TX_ADD
CLR TI
RX_COMM: JBC RI, IS_RESET ;接收命令
SJMP RX_COMM
IS_RESET: JNB RB8, COMM_NUM ;是命令幀,則跳轉(zhuǎn)
SETB SM2 ;是復(fù)位信號(hào),置SM2=1后返回
LJMP Return
COMM_NUM: MOV A, SBUF
CJNE A, #02H, NOEQU
NOEQU: JC COMM_RIGH ;C=1,則A<02H,接收命令正確
MOV A, #80H ;非法命令,置Err=1,返回等待主機(jī)再聯(lián)絡(luò)
MOV SBUF, A
Return_WT:JNB TI, Return_WT
CLR TI
SJMP Return
COMM_RIGH:JZ Ready_RX ;是接收命令,跳轉(zhuǎn)
Ready_TX: JB PSW.1,TX_TRDY
Return_ST:MOV SBUF, #00H ;未準(zhǔn)備就緒,置TRDY=0,返回本機(jī)狀態(tài)
TX_STATE: JNB TI, TX_STATE
CLR TI
SETB SM2
SJMP Return
TX_TRDY: MOV A, #02H
MOV SBUF, A
CLR PSW.1
TX_WAIT1: JBC TI, TX_Bytes
SJMP TX_WAIT1
TX_Bytes: MOV A, R4
MOV SBUF, A
TX_WAIT2: JBC TI, TX_DATA
SJMP TX_WAIT2
TX_DATA: MOVX A, @DPTR
MOV SBUF, A
TX_WAIT3: JNB TI, TX_WAIT3
CLR TI
INC DPTR
DJNZ R4, TX_DATA
SETB SM2
LJMP Return
Ready_RX: JB PSW.5,TX_RRDY ;PSW.5為接收準(zhǔn)備就緒標(biāo)志,在主程序中
SJMP Return_ST ;預(yù)置
TX_RRDY: MOV A, #01H
MOV SBUF, A
CLR PSW.5
TX_WAIT4: JNB TI, TX_WAIT4
CLR TI
RX_Bytes: JNB RI, RX_Bytes ;接收數(shù)據(jù)塊長(zhǎng)度
CLR RI
MOV A, SBUF
MOV R4, A ;暫存數(shù)據(jù)塊長(zhǎng)度
MOVX @DPTR,A ;保存數(shù)據(jù)塊長(zhǎng)度
INC DPTR
RX_DATA: JNB RI, RX_DATA ;接收數(shù)據(jù)
CLR RI
MOV A, SBUF
MOVX @DPTR,A
INC DPTR
DJNZ R4, RX_DATA
SETB SM2 ;數(shù)據(jù)接收完,置SM2=1后返回
;LCALL TEST_PRIN ;打印測(cè)試
LJMP Return
;**********************************************************
INIT_COM: MOV TMOD, #20H
MOV TH1, #0FDH ;波特率為9600bit/s
MOV TL1, #0FDH
ANL PCON, #7FH
MOV SCON, #0F0H ;#11011000B串行方式3,允許接收,SM2=1
SETB TR1
mov r0, #7fh
mov a, #00001110b ;enable 232
movx @r0, a
mov a, #00001011b ;disable 422
movx @r0, a
RET
哈哈,天大的消息,有mm向各位大蝦求教了!我先來(lái)了.. [秋雨] [58次] 01-5-24 上午 09:28:52
你講的通訊我沒(méi)看明白,不過(guò)我是led專家,如果需要,盡管找我(如果是gg就不要找我了呀)
我的qq 2813877
線路圖,軟件都有
把波特率改回9600 [方塘] [13次] 01-5-24 上午 09:41:03
;M_TXSUB: MOV TMOD, #20H
; MOV TH1, #0E8H ;波特率為1200bit/s
; MOV TL1, #0E8H
M_TXSUB: MOV TMOD, #20H
MOV TH1, #0FDH ;波特率為9600bit/s
MOV TL1, #0FDH
看來(lái)我要改個(gè)MM的名字了`~~哈哈~~有很多資料啊~~爽呆 [碧云天] [6次] 01-5-24 上午 10:23:39
這么好的東西要共享嘛!發(fā)到上載區(qū)吧!! [golden] [3次] 01-5-24 下午 12:02:45
我不太好意思呀! [秋雨] [11次] 01-5-24 下午 03:12:22
說(shuō)句實(shí)在話,電路到還可以,很有新意(5年前看),可程序太臭了!
我先把線路圖發(fā)發(fā)試試,不過(guò)我還沒(méi)發(fā)過(guò)東西,不知會(huì)不會(huì)!
點(diǎn)擊這里回復(fù)這篇貼子>>
_____________________________________________________________________________
Copyright?,C51BBS論壇 2000-2001
?? 快捷鍵說(shuō)明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -