專注電子技術(shù)學(xué)習(xí)與研究
當(dāng)前位置:單片機(jī)教程網(wǎng) >> MCU設(shè)計(jì)實(shí)例 >> 瀏覽文章

單片機(jī)雙機(jī)串口通信程序設(shè)計(jì)

作者:佚名   來源:本站原創(chuàng)   點(diǎn)擊數(shù):  更新時(shí)間:2008年11月25日   【字體:

     利用方式1實(shí)現(xiàn)單片機(jī)雙機(jī)通信,主頻為6M,波特率為2400bps,電路見圖5-10。當(dāng)兩個(gè)單片機(jī)距離較近時(shí),甲、乙兩機(jī)的發(fā)送端與接收端分別直接相聯(lián),兩機(jī)共地。執(zhí)行程序,甲機(jī)將亮燈信號(hào)發(fā)送給乙機(jī),若通信正常,乙機(jī)接收到信號(hào)后點(diǎn)亮20個(gè)發(fā)光二極管。乙機(jī)采用查詢與中斷兩種工作方式。當(dāng)然20個(gè)LED乙機(jī)可單獨(dú)控制,也可接受甲機(jī)的控制,并執(zhí)行甲機(jī)指令,還需要進(jìn)一步完善程序.
甲機(jī)發(fā)送程序:
org 0000h          
sta:  mov tmod,#20h      ;設(shè)置波特率 
        mov tl1,#0FAh 
        mov th1,#0FAh       
        setb tr1
mov scon,#40h      ;置工作方式1
clr ti
mov a,#00h
mov sbuf,a         ;發(fā)送亮燈信號(hào)
wait: jbc ti,cont          ;發(fā)送成功清標(biāo)志
  ajmp wait           ;等待發(fā)送完畢
cont: sjmp sta            ;重復(fù)發(fā)送
       end

乙機(jī)查詢工作方式接收:

org 0000h          
       mov tmod,#20h     ;設(shè)置通信波特率
       mov tl1,#0FAh
       mov th1,#0FAh      
       setb tr1
mov scon,#40h
clr ri
setb ren           ;允許接收
wait: jbc ri,read          ;接收成功清標(biāo)志
ajmp wait           ;接收未完等待
read: mov a ,sbuf
mov p1,a            ;接收亮燈信號(hào)送P1口
sjmp $
       end

乙機(jī)中斷工作方式接收
org 0000h          
ajmp main
org 0023h
ajmp zd           ;轉(zhuǎn)串口中斷程序
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               ;清接收標(biāo)志
;==============中斷程序還要再完善==============
  mov a ,sbuf         ;讀接收信號(hào)
mov p1,a
MOV R1,A           ;將收到的信號(hào)送緩存  
reti              ;中斷返回
end 
           
<單片機(jī)雙機(jī)串口通訊原理圖>

采用方式2 通信,數(shù)據(jù)幀格式是11位的,TB8為奇偶校驗(yàn)位,接收過程要求判斷RB8,若出錯(cuò)置F0標(biāo)志為1,正確則置F0標(biāo)志為0,然后返回。發(fā)送波特率375kbps,晶振為12MHz,所以SMOD=l。由于傳送數(shù)據(jù)的波特率與定時(shí)器無關(guān),所以程序中無需對(duì)定時(shí)器編程. 以下程序出自http://www.torrancerestoration.com一位單片機(jī)大俠之手,借來用用,如果什么什么錯(cuò)誤或者需要改進(jìn)的地方請(qǐng)大家指出,不過我這里基本測(cè)試通過了。
send:
          MOV    SCON,#80H    ;設(shè)置串行口為方式2 
          MOV    PCON,#80H    ;SMOD=l 
          MOV     R0,#50H      ;設(shè)數(shù)據(jù)塊指針 
          MOV     R7,#20       ;設(shè)數(shù)據(jù)塊長(zhǎng)度
  STA:  MOV    A,@R0        ;取數(shù)據(jù)給A 
                MOV     C,P 
                MOV     TB8,C       ;奇偶位P送給TB8,              
                MOV     SBUF,A     ;啟動(dòng)發(fā)送
;====================================================
WAIT: JBC      TI,CONT     ;若發(fā)完一幀數(shù)據(jù),清標(biāo)志后發(fā)下一幀數(shù)據(jù)
                 AJMP     WAIT         ;未完等待
;=======================================================
CONT:INC      R0           ;修改數(shù)據(jù)指針 
                DJNZ     R7,STA      ;循環(huán)發(fā)送至結(jié)束
               RET
;========================================================                                                                                                    
;乙機(jī)接收程序如下:
;    在進(jìn)行雙機(jī)通信時(shí),兩機(jī)應(yīng)采用相同的工作方式和波特率。          
;=============================================================
            MOV  SCON,#90H          ;設(shè)置串行口為方式2,REN為1,允許接收
            MOV  PCON,#80H          ;SMOD=1
            MOV  R0,#50H                ;設(shè)置數(shù)據(jù)塊首址
            MOV  R7,#20                   ;置數(shù)據(jù)塊長(zhǎng)度
;=========================================================
     WAIT:JBC    RI,READ        ;接收完一幀數(shù)據(jù)則RI清零并讀入數(shù)據(jù)
            AJMP   WAIT                      ;未完等待
;==========================================
READ:MOV   A,SBUF         ;讀入數(shù)據(jù)
        JNB     PSW.0,PZ          ;收到數(shù)為偶數(shù)則轉(zhuǎn)
        JNB     RB8,ERR           ;收到數(shù)為奇數(shù),發(fā)端為偶數(shù)則通信出錯(cuò)
        SJMP    RIGHT                  ;相符則正確
PZ:JB     RB8,ERR         ;收到數(shù)為偶數(shù),發(fā)端為奇數(shù)則出錯(cuò)
;========================================
RlGHT:MOV    @R0,A         ;通信正確,存放數(shù)據(jù)
        INC     R0                            ;更改地址指針
        DJNZ    R7,WAIT            ;數(shù)據(jù)塊接收完否,未完繼續(xù)
        CLR     PSW.5                    ;通信正確,置F0為0
        RET                     ;返回
ERROR:SETB    PSW.5          ;通信出錯(cuò),置F0為l
        RET                     ;返回


現(xiàn)在我最關(guān)心的是傳輸距離,我要做的產(chǎn)品傳輸距離為5M,選用STC51系列不知能不能解決,高手請(qǐng)指點(diǎn)。

關(guān)閉窗口