51单片机多机通信原理

发布时间:2023-07-21  

一、多机通信原理

在多机通信中,主机必须要能对各个从机进行识别,在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];//查看接收到的数据}}


文章来源于:电子工程世界    原文链接
本站所有转载文章系出于传递更多信息之目的,且明确注明来源,不希望被转载的媒体或个人可与我们联系,我们将立即进行删除处理。

我们与500+贴片厂合作,完美满足客户的定制需求。为品牌提供定制化的推广方案、专属产品特色页,多渠道推广,SEM/SEO精准营销以及与公众号的联合推广...详细>>

利用葫芦芯平台的卓越技术服务和新产品推广能力,原厂代理能轻松打入消费物联网(IOT)、信息与通信(ICT)、汽车及新能源汽车、工业自动化及工业物联网、装备及功率电子...详细>>

充分利用其强大的电子元器件采购流量,创新性地为这些物料提供了一个全新的窗口。我们的高效数字营销技术,不仅可以助你轻松识别与连接到需求方,更能够极大地提高“闲置物料”的处理能力,通过葫芦芯平台...详细>>

我们的目标很明确:构建一个全方位的半导体产业生态系统。成为一家全球领先的半导体互联网生态公司。目前,我们已成功打造了智能汽车、智能家居、大健康医疗、机器人和材料等五大生态领域。更为重要的是...详细>>

我们深知加工与定制类服务商的价值和重要性,因此,我们倾力为您提供最顶尖的营销资源。在我们的平台上,您可以直接接触到100万的研发工程师和采购工程师,以及10万的活跃客户群体...详细>>

凭借我们强大的专业流量和尖端的互联网数字营销技术,我们承诺为原厂提供免费的产品资料推广服务。无论是最新的资讯、技术动态还是创新产品,都可以通过我们的平台迅速传达给目标客户...详细>>

我们不止于将线索转化为潜在客户。葫芦芯平台致力于形成业务闭环,从引流、宣传到最终销售,全程跟进,确保每一个potential lead都得到妥善处理,从而大幅提高转化率。不仅如此...详细>>