51单片机串口多机通信的实现和编程 联系客服

发布时间 : 星期一 文章51单片机串口多机通信的实现和编程更新完毕开始阅读54e34b67a0c7aa00b52acfc789eb172dec639915

51 单片机串口多机通信的实现和编程

一、51 单片机的主从模式,首先要设定工作方式 3:(主从模式+波特率 可变)

SCON 串口功能寄存器:SM0=1;SM1=1(工作方式 3)

注:主机和从机都要为工作方式 3。

【工作方式 2 (SM0 SM1 :1 0):串行口为 11 位异步通信接口。发送或接收 一帧信息包括 1 位起始位 0、8 位数据位、1 位可编程位、1 位停止位 1。发 送数据:发送前,先根据通信协议由软件设置 TB8 为奇偶校验位或数据标识 位,然后将要发送的数据写入 SBUF,即能启动发送器。发送过程是由执行 任何一条以 SBUF 为目的寄存器的指令而启动的,把 8 位数据装入 SBUF, 同时还把 TB8 装到发送移位寄存器的第 9 位上,然后从 TXD(P3.1)端口输出 一帧数据。接收数据:先置 REN=1,使串行口为允许接收状态,同时还要将 RI 清 0。然后再根据 SM2 的状态和所接收到的 RB8 的状态决定此串行口在 信息到来后是否置 R1=1,并申请中断,通知 CPU 接收数据。当 SM2=0 时, 不管 RB8 为 0 还是为 1,都置 RI=1,此串行口将接收发送来的信息。当 SM2=1 时,且 RB8=1,表示在多机通信情况下,接收的信息为地址帧, 此时 置 RI=1,串行口将接收发来的地址。当 SM2=1 时,且 RB8=0,表示在多机通 信情况下,接收的信息为数据帧, 但不是发给本从机的,此时 RI 不置为 1,

因而 SBUF 中接收的数据帧将丢失。

工作方式 3 (SM0 SM1 :1 1):为波特率可变的 11 位异步通信方式,除了波 特率有所区别之外,其余方式都与方式 2 相同。】【以上内容摘自网络】

二、主机的配置发送地址时,把 TB8 设定为 1,发送数据时 TB8 设定为 0

(类似于:主机 TB8=1 发送的是地址,TB8=0 发送的是数据)

发送帧结构:

假设主机将发送 1234 给地址为 1 的从机:调用函数:TXdata(1,1234$);

void TXdata(uchar addr,uchar *str) {

TB8 = 1; //发送地址

SBUF = addr; //把地址发送出去

while(!TI); //判断是否发送成功(发送成功后 TI 会置 1,需手动清 0)

TI = 0;

TB8 = 0; //发送数据

while(*str != ‘\\0’) //发送数组 {

SBUF = (*str);

while(!TI); TI = 0; str++; } }

三、从机配置

1. 从机接收时,首先串口初始化时,使 SM2=1(接收地址模式,即只能接 收到 TB8=1 的数据,才触发中断),主机发送 TB=0 的数据,被认为是总线上 的主机发送给别机的通信数据,本机丢弃,不产生中断。

2. 接收的地址与本机地址相符后,使 SM2=0(接收数据模式,接收数据正 常触发中断)

(类似于:从机 SM2=1 只接收地址,SM2=0 只接收数据)

void chuan() interrupt 4 //串口中断服务函数 {

ES = 0; //关闭串口中断

if(RI) //再次判断,是否接收到数据(接收到数据后,RI 会置 1,需手动清 {

RXData = SBUF;

if(RXstart) //判断是否接收到过本地址 {

if(RXData != ‘$’) //判断是否接收到 数据结束 标志 $ {

0)