?? 多機通訊程序.txt
字號:
初學者:who can help me? [叮當] [61次] 01-5-24 上午 09:07:20
小妹我要完成一課題,單片機多機通信(89c51),現在時間快到了,而我卻毫無頭緒!!
(對這不感興趣)哪位大哥能幫一下忙,提供程序(匯編),在這里我先謝過了!!
(具體要求:單片機一對多通信,主機用輪詢方式與從機通信,演示以LED顯示器演示,好像
是主機發送一個數字,從機接收并用LED顯示(希望能說明89c51和LED的連接方法,我這也
不會)
98年做的多機通訊程序 [方塘] [51次] 01-5-24 上午 09:17:41
;98年做的多機通訊程序 ,我記得是調試通過的。不知對你能不能有幫助。
;-------發送,
TXDATA EQU 1000H
org 0h
main: LCALL SENTDATA
MOV R2, #05H ;R2存放從機地址
MOV R3, #00 ;R3存放控制代碼
MOV DPTR,#TXDATA
MOV R4, #39
LCALL M_TXSUB
LJMP P_END
;通訊協議:
;1,系統允許接255臺從機,其地址分別為00H--FEH
;2,地址FFH是對所有從機都起作用的一條控制命令,命令各從機恢復SM2=1狀態
;3,主機和從機的聯絡過程為:主機首先發送地址幀,被尋址從機返回本機地址給
;主機,在判斷地址相符后給被尋址從機發送控制命令,被尋址從機根據其命令向
;主機回送自己的狀態,若主機開始發送或接收數據,發送或接收的第一個字節是
;數據塊長度
;4,假定主機發送的控制命令代碼為:
; 00:要求從機接收數據塊
; 01:要求從機發送數據塊 ;其它:非法命令
;5,從機狀態字格式: |D7 |D6 |D5 |D4 |D3 |D2 |D1 | D0 |
; |ERR| 0 | 0 | 0 | 0 | 0 |TRDY| RRDY|
;其中,若 ERR=1, 從機接收到非法命令;
; 若 TRDY=1,從機發送準備就緒;
; 若 RRDY=1,從機接收準備就緒;
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存放從機地址
MOV SBUF, A
TX_ADD: JBC TI, RX_REPLY
SJMP TX_ADD
RX_REPLY: JBC RI, RX_ADD ;等待從機應答
SJMP RX_REPLY
RX_ADD: MOV A, SBUF
XRL A, R2 ;判斷應答地址相符否?
JZ TX_COMM ;
ISNOT: MOV A, #0FFH ;不符,重新聯絡
SETB TB8
MOV SBUF, A
LOOP1: JNB TI, LOOP1
CLR TI
SJMP TX_ADD
TX_COMM: CLR TB8 ;地址符合,置TB8=0,準備發送命令
MOV A, R3 ;R3存放控制代碼 #00:要求從機接收數據
MOV SBUF, A ;發送命令
TX_COMM1: JBC TI, RX_STATE
SJMP TX_COMM1
RX_STATE: JBC RI, RIGHT ;接收從機狀態
SJMP RX_STATE
RIGHT: MOV A, SBUF
JNB ACC.7,GO_ON ;接收到命令繼續
SJMP ISNOT ;否則,重新聯絡
GO_ON: CJNE R3, #00H,RECEIVE;要求從機發送就跳轉
JNB ACC.0,ISNOT ;從機接收未準備就緒,返回重新聯絡
TX_BYTES: MOV A, R4 ;發送數據塊長度, R4為入口參數
MOV SBUF, A
TX_WAIT1: JBC TI, TX_DATA
SJMP TX_WAIT1
TX_DATA: MOVX A, @DPTR ;發送數據塊
MOV SBUF, A
TX_WAIT2: JBC TI, NEXTDATA
SJMP TX_WAIT2
NEXTDATA: INC DPTR
DJNZ R4, TX_DATA ;未完繼續
SJMP SUBEND ;發送完數據,返回主程序
RECEIVE: JNB ACC.1,ISNOT ;從機發送未準備就緒,返回重新聯絡
RX_BYTES: JBC RI, RX_BYTES1 ;接收數據塊長度
SJMP RX_BYTES
RX_BYTES1:MOV A, SBUF
MOV R4, A ;R4暫存數據塊長度
MOVX @DPTR,A ;保存數據塊長度
RX_DATA: JBC RI, RX_DATA1
SJMP RX_DATA
RX_DATA1: MOV A, SBUF
MOVX @DPTR,A
INC DPTR
DJNZ R4, RX_DATA ;未完繼續
SUBEND: RET ;接收完數據,返回主程序
;**********************************************************
98年做的多機通訊程序---接收 [方塘] [38次] 01-5-24 上午 09:21:50
;98年做的多機通訊程序 ,我記得是調試通過的。不知對你能不能有幫助。
;-------接收,
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 ;開中斷
SETB ES ;允許串行口中斷
LJMP WAIT_INT
;**********************************************************
;入口參數:DPTR:從機發送數據塊首地址
; R4: 發送數據塊長度
; R2: 從機地址
S_RX_INT: CLR RI ;等待主機聯絡(只有主機發來的是地址幀
PUSH ACC ;才激活RI)
PUSH PSW
CLR RS0
SETB RS1
MOV A, SBUF
XRL A, #05H ;判斷是否本機地址,本機地址為:#05H
JZ ISME ;是本機地址,跳轉
Return: POP PSW ;不是本機地址,中斷返回等待主機聯絡
POP ACC
RETI ;中斷返回
ISME: CLR SM2 ;清SM2,為接收主機命令作準備
MOV SBUF, #05H ;從機地址回送主機
TX_ADD: JNB TI, TX_ADD
CLR TI
RX_COMM: JBC RI, IS_RESET ;接收命令
SJMP RX_COMM
IS_RESET: JNB RB8, COMM_NUM ;是命令幀,則跳轉
SETB SM2 ;是復位信號,置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,返回等待主機再聯絡
MOV SBUF, A
Return_WT:JNB TI, Return_WT
CLR TI
SJMP Return
COMM_RIGH:JZ Ready_RX ;是接收命令,跳轉
Ready_TX: JB PSW.1,TX_TRDY
Return_ST:MOV SBUF, #00H ;未準備就緒,置TRDY=0,返回本機狀態
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為接收準備就緒標志,在主程序中
SJMP Return_ST ;預置
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 ;接收數據塊長度
CLR RI
MOV A, SBUF
MOV R4, A ;暫存數據塊長度
MOVX @DPTR,A ;保存數據塊長度
INC DPTR
RX_DATA: JNB RI, RX_DATA ;接收數據
CLR RI
MOV A, SBUF
MOVX @DPTR,A
INC DPTR
DJNZ R4, RX_DATA
SETB SM2 ;數據接收完,置SM2=1后返回
;LCALL TEST_PRIN ;打印測試
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向各位大蝦求教了!我先來了.. [秋雨] [58次] 01-5-24 上午 09:28:52
你講的通訊我沒看明白,不過我是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
看來我要改個MM的名字了`~~哈哈~~有很多資料啊~~爽呆 [碧云天] [6次] 01-5-24 上午 10:23:39
這么好的東西要共享嘛!發到上載區吧!! [golden] [3次] 01-5-24 下午 12:02:45
我不太好意思呀! [秋雨] [11次] 01-5-24 下午 03:12:22
說句實在話,電路到還可以,很有新意(5年前看),可程序太臭了!
我先把線路圖發發試試,不過我還沒發過東西,不知會不會!
點擊這里回復這篇貼子>>
_____________________________________________________________________________
Copyright?,C51BBS論壇 2000-2001
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -