专注电子技术学习与研究
当前位置:单片机教程网 >> MCU设计实例 >> 浏览文章

单片机双机串口通信程序设计

作者:佚名   来源:本站原创   点击数:  更新时间:2008年11月25日   【字体:

     利用方式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.51hei.com一位单片机大侠之手,借来用用,如果什么什么错误或者需要改进的地方请大家指出,不过我这里基本测试通过了。
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系列不知能不能解决,高手请指点。

关闭窗口