利用方式1實現單片機雙機通信,主頻為6M,波特率為2400bps,電路見圖5-10。當兩個單片機距離較近時,甲、乙兩機的發送端與接收端分別直接相聯,兩機共地。執行程序,甲機將亮燈信號發送給乙機,若通信正常,乙機接收到信號后點亮20個發光二極管。乙機采用查詢與中斷兩種工作方式。當然20個LED乙機可單獨控制,也可接受甲機的控制,并執行甲機指令,還需要進一步完善程序.
甲機發送程序:
org 0000h
sta: mov tmod,#20h ;設置波特率
mov tl1,#0FAh
mov th1,#0FAh
setb tr1
mov scon,#40h ;置工作方式1
clr ti
mov a,#00h
mov sbuf,a ;發送亮燈信號
wait: jbc ti,cont ;發送成功清標志
ajmp wait ;等待發送完畢
cont: sjmp sta ;重復發送
end
乙機查詢工作方式接收:
org 0000h
mov tmod,#20h ;設置通信波特率
mov tl1,#0FAh
mov th1,#0FAh
setb tr1
mov scon,#40h
clr ri
setb ren ;允許接收
wait: jbc ri,read ;接收成功清標志
ajmp wait ;接收未完等待
read: mov a ,sbuf
mov p1,a ;接收亮燈信號送P1口
sjmp $
end
乙機中斷工作方式接收
org 0000h
ajmp main
org 0023h
ajmp zd ;轉串口中斷程序
START: MOV TMOD,#20h
mov tl1,#0FAh
mov th1,#0FAh
setb tr1
mov scon,#50h
clr ri
mov ie,#90h ;開中斷
MAIN:sjmp $ 主程序
zd: clr ri ;清接收標志
;==============中斷程序還要再完善==============
mov a ,sbuf ;讀接收信號
mov p1,a
MOV R1,A ;將收到的信號送緩存
reti ;中斷返回
end
<單片機雙機串口通訊原理圖>
采用方式2 通信,數據幀格式是11位的,TB8為奇偶校驗位,接收過程要求判斷RB8,若出錯置F0標志為1,正確則置F0標志為0,然后返回。發送波特率375kbps,晶振為12MHz,所以SMOD=l。由于傳送數據的波特率與定時器無關,所以程序中無需對定時器編程. 以下程序出自http://www.zg4o1577.cn一位單片機大俠之手,借來用用,如果什么什么錯誤或者需要改進的地方請大家指出,不過我這里基本測試通過了。
send:
MOV SCON,#80H ;設置串行口為方式2
MOV PCON,#80H ;SMOD=l
MOV R0,#50H ;設數據塊指針
MOV R7,#20 ;設數據塊長度
STA: MOV A,@R0 ;取數據給A
MOV C,P
MOV TB8,C ;奇偶位P送給TB8,
MOV SBUF,A ;啟動發送
;====================================================
WAIT: JBC TI,CONT ;若發完一幀數據,清標志后發下一幀數據
AJMP WAIT ;未完等待
;=======================================================
CONT:INC R0 ;修改數據指針
DJNZ R7,STA ;循環發送至結束
RET
;========================================================
;乙機接收程序如下:
; 在進行雙機通信時,兩機應采用相同的工作方式和波特率。
;=============================================================
MOV SCON,#90H ;設置串行口為方式2,REN為1,允許接收
MOV PCON,#80H ;SMOD=1
MOV R0,#50H ;設置數據塊首址
MOV R7,#20 ;置數據塊長度
;=========================================================
WAIT:JBC RI,READ ;接收完一幀數據則RI清零并讀入數據
AJMP WAIT ;未完等待
;==========================================
READ:MOV A,SBUF ;讀入數據
JNB PSW.0,PZ ;收到數為偶數則轉
JNB RB8,ERR ;收到數為奇數,發端為偶數則通信出錯
SJMP RIGHT ;相符則正確
PZ:JB RB8,ERR ;收到數為偶數,發端為奇數則出錯
;========================================
RlGHT:MOV @R0,A ;通信正確,存放數據
INC R0 ;更改地址指針
DJNZ R7,WAIT ;數據塊接收完否,未完繼續
CLR PSW.5 ;通信正確,置F0為0
RET ;返回
ERROR:SETB PSW.5 ;通信出錯,置F0為l
RET ;返回
現在我最關心的是傳輸距離,我要做的產品傳輸距離為5M,選用STC51系列不知能不能解決,高手請指點。