0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

51单片机多机通信原理

GReq_mcu168 ? 来源:未知 ? 作者:胡薇 ? 2018-05-15 09:51 ? 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

一、多机通信原理

在多机通信中,主机必须要能对各个从机进行识别,在51系列单片机中可以通过SCON寄存器的SM2位来实现。当串口以方式2或方式3发送数据时,每一帧信息都是11位,第9位是数据可编程位,通过给TB8置1或置0来区别地址帧和数据帧,当该位为1时,发送地址帧;该位为0时,发送数据帧。

在多机通信过程中,主机先发送某一从机的地址,等待从机的应答,所有的从机接收到地址帧后与本机地址进行比较,若相同,则将SM2置0准备接收数据;若不同,则丢弃当前数据,SM2位不变。

二、多机通信电路图

51单片机多机通信原理

此处,U1作为主机,U2为从机1,U3为从机2。

三、C语言程序

(1)主机程序

#include#include

#define _SUCC_0x0f//数据传送成功#define _ERR_0xf0//数据传送失败unsigned char Table[9]={0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39};unsigned char Buff[20];//数据缓冲区unsigned char temp=0xff;sbit KEY1=P1^6;sbit KEY2=P1^7;//unsigned char addr;

//延时1ms函数void delay_1ms(unsigned int t){unsigned int x,y;for(x=t;x>0;x--)for(y=110;y>0;y--);}//缓冲区初始化void Buff_init(){unsigned char i;//将Table里的数据放到缓冲区里for(i=0;i<9;i++)???{??Buff[i]= Table[i];??delay_1ms(100);?}?}//串口初始化函数void serial_init(){?TMOD=0x20;?//定时器1工作于方式2?TH1=0xfd;???TL1=0xfd;?//波特率为9600?PCON=0;?SCON=0xd0;??//串口工作于方式3?TR1=1;??//开启定时器?TI=0;?RI=0;}//发送数据函数void SEND_data(unsigned char *Buff){?unsigned char i;?unsigned char lenth;?unsigned char check;?lenth=strlen(Buff);??????//计算数据长度?check=lenth;

TI=0;//发送数据长度TB8=0;//发送数据帧SBUF=lenth;while(!TI);TI=0;for(i=0;i;i++)>

TB8=0;//发送校验字节SBUF=check;while(!TI);TI=0;}//向指定从机地址发送数据void ADDR_data(unsigned addr){while(temp!=addr)//主机等待从机返回其地址作为应答信号{TI=0;//发送从机地址TB8=1;//发送地址帧SBUF=addr;while(!TI);TI=0;RI=0;while(!RI);temp=SBUF;RI=0;}

temp=_ERR_;//主机等待从机数据接收成功信号while(temp!=_SUCC_){SEND_data(Buff);RI=0;while(!RI);temp=SBUF;RI=0;}}

void main(){Buff_init();serial_init();while(1){if(KEY1==0){delay_1ms(5);if(KEY1==0){while(!KEY1);ADDR_data(0x01);}}if(KEY2==0){delay_1ms(5);if(KEY2==0){while(!KEY2);ADDR_data(0x02);}}

}}

(2)从机1程序

#include#include

#define addr0x01//从机1的地址#define _SUCC_0x0f//数据传送成功#define _ERR_0xf0//数据传送失败unsigned char aa=0xff;//主机与从机之间通信标志unsigned char Buff[20];//数据缓冲区

//串口初始化函数void serial_init(){TMOD=0x20;//定时器1工作于方式2TH1=0xfd;TL1=0xfd;//波特率为9600PCON=0;SCON=0xd0;//串口工作于方式3TR1=1;//开启定时器TI=0;RI=0;}//接收数据函数unsigned char RECE_data(unsigned char *Buff){unsigned char i,temp;unsigned char lenth;unsigned char check;

RI=0;//接收数据长度while(!RI);if(RB8==1)//若接收到地址帧,则返回0xfereturn 0xfe;lenth=SBUF;RI=0;check=lenth;for(i=0;i;i++)>

while(!RI);//接收校验字节if(RB8==1)//若接收到地址帧,则返回0xfereturn 0xfe;temp=SBUF;RI=0;check=temp^check;//将从主机接收到的校验码与自己计算的校验码比对if(check!=0)//校验码不一致,表明数据接收错误,向主机发送错误信号,函数返回0xff{TI=0;TB8=0;SBUF=_ERR_;while(!TI);TI=0;return 0xff;}TI=0;//校验码一致,表明数据接收正确,向主机发送成功信号,函数返回0x00TB8=0;SBUF=_SUCC_;while(!TI);TI=0;return 0;}

void main(){serial_init();while(1){SM2=1;//接收地址帧while(aa!=addr)//从机等待主机请求自己的地址{RI=0;while(!RI);aa=SBUF;RI=0;}

TI=0;//一旦被请求,从机返回自己的地址作为应答,等待接收数据TB8=0;SBUF=addr;while(!TI);TI=0;

SM2=0;//接收数据帧aa=0xff;//从机接收数据,并将数据保存到数据缓冲区while(aa==0xff){aa=RECE_data(Buff);}if(aa==0xfe)continue;P1=Buff[1];//查看接收到的数据}}

(3)从机2程序

#include#include

#define addr0x02//从机2的地址#define _SUCC_0x0f//数据传送成功#define _ERR_0xf0//数据传送失败unsigned char aa=0xff;//主机与从机之间通信标志unsigned char Buff[20];//数据缓冲区

//串口初始化函数void serial_init(){TMOD=0x20;//定时器1工作于方式2TH1=0xfd;TL1=0xfd;//波特率为9600PCON=0;SCON=0xd0;//串口工作于方式3TR1=1;//开启定时器TI=0;RI=0;}//接收数据函数unsigned char RECE_data(unsigned char *Buff){unsigned char i,temp;unsigned char lenth;unsigned char check;

RI=0;//接收数据长度while(!RI);if(RB8==1)//若接收到地址帧,则返回0xfereturn 0xfe;lenth=SBUF;RI=0;check=lenth;for(i=0;i;i++)>

while(!RI);//接收校验字节if(RB8==1)//若接收到地址帧,则返回0xfereturn 0xfe;temp=SBUF;RI=0;check=temp^check;//将从主机接收到的校验码与自己计算的校验码比对if(check!=0)//校验码不一致,表明数据接收错误,向主机发送错误信号,函数返回0xff{TI=0;TB8=0;SBUF=_ERR_;while(!TI);TI=0;return 0xff;}TI=0;//校验码一致,表明数据接收正确,向主机发送成功信号,函数返回0x00TB8=0;SBUF=_SUCC_;while(!TI);TI=0;return 0;}

void main(){serial_init();while(1){SM2=1;//接收地址帧while(aa!=addr)//从机等待主机请求自己的地址{RI=0;while(!RI);aa=SBUF;RI=0;}

TI=0;//一旦被请求,从机返回自己地址作为应答,等待接收数据TB8=0;SBUF=addr;while(!TI);TI=0;

SM2=0;//接收数据帧aa=0xff;//从机接收数据,并将数据保存到数据缓冲区while(aa==0xff){aa=RECE_data(Buff);}if(aa==0xfe)continue;P1=Buff[2];//查看接收到的数据}}

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 51单片机
    +关注

    关注

    277

    文章

    5711

    浏览量

    127714
  • 多机通信
    +关注

    关注

    0

    文章

    16

    浏览量

    9303

原文标题:51单片机多机通信

文章出处:【微信号:mcu168,微信公众号:硬件攻城狮】欢迎添加关注!文章转载请注明出处。

收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    51单片机通信问题

    求教各位大哥,我想用几块51单片机实现一对通信,一个主机多个从,但是有一个问题,单片机连接的
    发表于 02-29 17:28

    51单片机通信问题

    本人刚接触单片机串口通信,双机通信可以实现,但是通信就搞不懂了,看了很多资料还是不明白,在此
    发表于 04-21 12:23

    基于51单片机通信的设计+源代码

    通信的电器特性、逻辑电平和各种信息都有其自身的特点。89C51 系列单片机之间通过多通信进行数据交换时,将串口设置为工作方式2 或者3,数
    发表于 03-10 21:49

    简述51单片机通信的特点

    简述51单片机通信的特点,一、题目要求使用51单片机
    发表于 07-20 07:48

    PCMCS-51单片机间的串行通信设计?

    【摘 要】 主要讲解了IBM-PC与MCS-51单片机系统的通信原理,给出了其硬件接口框图
    发表于 05-16 19:43 ?2057次阅读
    PC<b class='flag-5'>机</b>与<b class='flag-5'>多</b>MCS-<b class='flag-5'>51</b><b class='flag-5'>单片机</b>间的串行<b class='flag-5'>通信</b>设计?

    51单片机通信过程

    发表于 12-31 11:55 ?52次下载

    单片机之间通信演示电路设计

    本文介绍的是基于单片机的串行通信演示电路系统设计。本设计研究的是三个AT89C51单片机通过串行通信技术实现相互之间的
    发表于 04-14 16:53 ?1次下载

    通信单片机和pc

    通信单片机和pc
    发表于 11-04 11:38 ?7次下载

    8031单片机系统的实时通信

    随着单片机技术的发展,其应用已从单机逐渐转向或联网.而应用的关键在于相互的通信、互传数据
    发表于 02-02 16:46 ?0次下载

    如何使用51单片机进行通信的资料和程序及电路图免费下载

    51 单片机通信,有些特殊。它专有一个控制位 SM2 。当把 SM2 设置为 1 后,单片机
    发表于 08-13 17:32 ?8次下载
    如何使用<b class='flag-5'>51</b><b class='flag-5'>单片机</b>进行<b class='flag-5'>多</b><b class='flag-5'>机</b><b class='flag-5'>通信</b>的资料和程序及电路图免费下载

    单片机通信系统的设计

    51单片机进行通信时,串口要工作在方式2和方式3。假设当前
    发表于 07-11 15:04 ?4663次阅读
    <b class='flag-5'>单片机</b><b class='flag-5'>多</b><b class='flag-5'>机</b><b class='flag-5'>通信</b>系统的设计

    MCS-51单片机通信的工作原理解析

    串行口以方式2或方式3接收时,若SM2为1,则仅当接收到的第9位数据RB8为1时,数据才装入SBUF,置位RI,请求CPU对数据进行处理;如果接收到的第9位数据RB8为0,则不产生中断标志RI,信息丢失,CPU不作任何处理。
    发表于 10-22 16:18 ?1.4w次阅读
    MCS-<b class='flag-5'>51</b><b class='flag-5'>单片机</b><b class='flag-5'>多</b><b class='flag-5'>机</b><b class='flag-5'>通信</b>的工作原理解析

    51单片机串口通信

    51单片机串口通信文章目录51单片机串口通信串口介绍硬件电路电平标准常见
    发表于 11-18 14:06 ?22次下载
    <b class='flag-5'>51</b><b class='flag-5'>单片机</b>串口<b class='flag-5'>通信</b>

    51单片机串口通信

    51单片机串口通信文章目录51单片机串口通信串口介绍硬件电路电平标准常见
    发表于 11-21 20:36 ?64次下载
    <b class='flag-5'>51</b><b class='flag-5'>单片机</b>串口<b class='flag-5'>通信</b>

    关于51单片机通信竞赛实验

    发表于 08-24 09:01 ?0次下载
    关于<b class='flag-5'>51</b><b class='flag-5'>单片机</b>的<b class='flag-5'>多</b><b class='flag-5'>机</b><b class='flag-5'>通信</b>竞赛实验