资源描述
多机通信举例:
例8—4 现有1台主机与10台从机进行双向通信。从机地址为:00H——09H 。设主、从机以方式3进行串行通信,波特率为1200,F晶振为6MHZ。下面以主机发送数据,从机接收数据为例说明。
主机设定有关寄存器的内容如下:
R1——存放主机发送的数据块首地址
R2——存放寻址的从机地址
R3——存放主机发送数据块的长度
通信命令约定: “01H”:表示主机发送数据,从机接收数据;
“02H”:表示主机接收数据,从机发送数据。
主机通信程序流程图如图8—8所示:
开始
定时器T1 初始化
串行口初始化
向从机发送地址
接收从机返回的地址
发送无效地址FFH
从机地址相符?
N
Y
向从机发送命令
延 时
发 送 数 据 块
结束
图8—8 主机通信程序流程图
由图8—8流程图可得主机通信程序清单如下:
MAIN:MOV TMOD, #20H ;定时器T1设置工作方式2。
MOV TL1, #0F3H ;T1置初值。
MOV TH1, #0F3H
SETB TR1 ;启动T1。
MOV PCON, #00H ;波特率不倍增。
MOV SCON, #0D8H ;串行口设置工作方式3,TB8置1,表示发送地址。
SADDR:MOV A, R2 ;取出从机地址。
MOV SBUF, A ;发送从机地址。
JNB RI, $ ;等待从机应答。
CLR RI ;接收到从机应答,RI清零。
MOV A, SBUF ;取出从机应答数据(从机地址)。
XRL A, R2 ;核对应答地址。
JZ MSEND ;若地址相符转发送命令。
SETB TB8 ;地址不相符,置地址标志,以便重发地址。
CLR TI
MOV SBUF, #0FFH ;发送无效地址,使所有从机SM2置1。
SJMP SADDR ;重发地址。
MSEND:CLR TB8 ;地址相符,准备发送命令、数据等。
MOV SBUF, #01H ;发送命令,要求从机接收数据。
LCALL DELAY10 ;延迟10MS。
MAGAIN: MOV SBUF, @R1 ;主机发送数据。
JNB TI, $ ;等待一个字符发送完。
CLR TI ;本字符发送完毕,准备发送下一个字符。
INC R1 ;发送数据区地址指针加一,指向下一单元。
DJNZ R3, MAGAIN ;数据快未发送完,继续发送。
RET ;发送完毕,返回。
以#08H号从机接收为例,设定:
R1:存放从机接收数据块首地址;
R2:存放从机接收数据块长度。
从机通信程序流程图如图8—9所示:
定时器T1 初始化
串行口初始化
接收 数 据 块
开始
接收主机发送的地址
本机SM2位清零
接收主机命令
命令识别
主机发送,从机接收?
主机接收,从机发送?
发送数据块(略)
结 束
是本机地址?
本机SM2置1
N
Y
N
Y N
Y
图8—9 从机通信程序流程图
由图8—9可得从机通信程序清单如下:
MOV TMOD, #20H ;T1设置工作方式2。
MOV TL1, #0F3H ;置初值。
MOV TH1, #0F3H
SETB TR1 ;启动T1。
MOV PCON, #00H ;波特率不倍增。
MOV SCON, #0F0H ;本机串行口设置工作方式3,SM2置1,准备接收地址
信息。
WAIT:JNB RI, $ ;等待主机联络。
CLR RI ;接收到主机地址信息,清RI,准备接收下一数据。
MOV A, SBUF ;取出接收到的地址信息。
XRL A, #08H ;与本机比较。
JZ SADDR ;是本机地址,转发送本机地址程序。
SETB SM2 ;本机SM2置1,以便重新接收地址。
AJMP WAIT ;不是本机地址,再重新联络。
SADDR:MOV SBUF, #08H ;发送本地址,供主机核对。
CLR TI
CLR SM2 ;准备接收命令。
JNB RI, $ ;接收主机发送的命令。
CLR RI
MOV 70H, SBUF
MOV A, 70H ;取出命令。
XRL A, #01H ;检查命令。
JZ RECIV ;若为本机接收数据命令,转接收程序。
XRL A, #02H ;再次检查命令。
JZ SEND ;若为本机发送数据命令,转发送程序。
AJMP WAIT ;命令无效,返回待命状态。
RECIV:JNB RI, $ ;接收一个字符。
CLR RI ;准备下次接收。
MOV @R1, SBUF ;存接收数据。
INC R1 ;修改接收数据区指针。
DJNZ R2, RECIV ;若数据接收未完,继续接收。
SETB SM2 ;数据接收完毕,SM2重新置1。
LJMP WAIT ;返回待命状态。
SEND :(略)
应当指出,以上介绍了多机通信的一个简单示例,实际应用时还应考虑命令校核、数据校核等问题,以求提高通信的可靠性。同时波特率的设定还要考虑所选择的通信介质等,篇幅有限,不再细述。
思考题与习题
8—1 什么是串行通信的波特率?
8—2 若8051单片机F晶振=11.059MHZ,需用波特率2400,试计算定时器T1的记数初值。
8—3 MCS—51单片机的串行口 四种工作方式各有哪些特点?
8—4 MCS—51单片机串行口四种工作方式的波特率如何确定?
8—5 试用8051串行口工作方式0与移位寄存器组成6位LED静态电路,并编程输出字符”89C51P”。
8—6 试编写程序,设串行口为工作方式1,波特率为1200,禁止中断,用查询法将甲机从外部RAM 2000H开始的10个数传送到乙机从2000H开始的外部RAM中去,已知晶振频率F晶振=11.0592MHZ。
8—7 甲乙两机进行串行通信,数据区均为内部RAM的50H—5FH,串行口 以方式2工作,要求用TB8作奇偶校验位一起传送,波特率为1200,F晶振=11.059MHZ,试设计流程图并编程。
8—8 8051向外部设备传送数据,串行口工作在方式3,单片机和外设之间采用9位异步通信方式,波特率为2400。F晶振为11.0592MHZ。现设从内部RAM的60H—70H中数据从串行口输出,试设计流程图并编程。
8—9 简述单片机多机通信的原理。
8—10 若将例8—4 该成主机接收数据,#08号从机发送数据,试设计流程图并编程。
展开阅读全文