• 学而时习之专栏
  • 温故而知新专栏



  • 单片机与单片机的通讯



    C51单片机两机通信是单片机用串行口工作方式1进行两机的异步通信。两机通讯连接如图所示。串口通讯的波特为1200。


    8051

  • 甲机发送,将外部RAM&nbsp1000H到100FH单元的数据块及数据块首,未地址通过串行口发送端TXD发送到乙机。

  • 乙机接收 接收来自串行输入端RXD的数据,第一二字节为数据块首地址,第三四字节为数据块未地址,第五字节开始为数据块。将接收收到的数据块首,未地址及数据块依次存入外部RAM以2000H为起始地址的区域中。


  • 甲机发送程序如下:




  • ORG 0000H
    LJMP MAIN ;转主程序
    OEG 0023H ;串行中断入口地址
    LJMP  TINT ;转中断服务程序
    ORG 20000H
    MAIN:MOV sp,#40H;设定栈底
    MOV TMOD,#20H;定时器T1,方式2
    MOV TL1,#0E8H;装入初始
    MOV TH1,#0E8H
    SETB EA;CPU开放中断
    CLR ET1;禁止T1中断
    CLR ES;关闭串行口中断
    MOV PCON,#00H;波特率不倍增
    SETB TR1;启动T1
    MOV SCON,#10H;置串行口方式1
    MOV SBUF,#10H;发送数据块首地址
    TWAIT1:JNB T1,TWAIT1
    CLR T1
    MOV SBUF,#10H
    TWAIT2:JNB T1,TWAIT2
    CLR TI
    MOV SBUF,#10H;发送未地址高字节
    TWAIT3:JNB TI,TWAIT3
    CLR TI
    MOV R1,#10H
    MOV DPTR,#1000H;数据块首地址
    SETB ES;允许串行口中断
    MOV SBUF,#OFH;发送未地址低字节
    SJMP $;等待中断
    TINT: MOVX A,@DPTR;数据块中取数
    CLR TI;清除发送中断标志
    MOV SNUF,A;发送数据
    DJNZ R1,TNEEXT;数据块未发送完。则继续
    CLR ES;数据发送完,关中断
    CLR TR1;关定时器
    RETI;中断返回
    TNEXT:JNC DPTR;修改数据地址
    RETI;中断返回
    END




  • 乙机接收程序如下:





  • ORG 000H
    LJMP MAIN ;转主程序
    ORG 0023H;串行口中断入口地址
    LJMP RINT;转中断服务程序
    ORG 2000H
    MAIN:MOV SP,#50H;设定栈底
    MOV TMOD,#20H;接收方的波特率要和发送方相同
    MOVTL1,#OE8H
    MOV TH1,#OE8H
    SETB EA;CPU开放中断
    CLR ET1;禁止T1中断
    MOV PCON,#00H
    SETB TR1;开启定时器T1
    MOV R1,#14H;共接收20个字节数据
    MOV SCON,#2000H;数据存放区首地址
    MOV SCON,#50H;串行口方式1,允许接收
    SETB ES;中断允许
    SJMP $;等待中断
    RINT: MOV A,SBUF;接收数据
    CLR RI;清除接收中断标志
    MOVX @DPTR,A;存放数据
    DJNZ R1,RNEXT;数据块未完。则继续
    CLR ES;接收数据己完成,关中断
    CLR TR1;关闭定时器
    RETI;中断返回
    TNEXT:INC DPTR;修改数据地址
    RET1;中断返回
    END




  • 在进行上述双机通信时,要先运行乙机的接收程序,再运行甲机中的发送程序。才正常。