单片机与单片机的通讯
C51单片机两机通信是单片机用串行口工作方式1进行两机的异步通信。两机通讯连接如图所示。串口通讯的波特为1200。
甲机发送,将外部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
在进行上述双机通信时,要先运行乙机的接收程序,再运行甲机中的发送程序。才正常。