找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1409|回复: 0
打印 上一主题 下一主题
收起左侧

单片机主从结构的多及通讯

[复制链接]
跳转到指定楼层
楼主
ID:353273 发表于 2018-6-17 15:13 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
#include<reg51.h>
#include<string.h>
#define addr     0x01//从机1的地址
#define _SUCC_   0x0f//数据传送成功
#define _ERR_    0xf0//数据传送失败
unsigned char aa=0xff;//主机与从机之间通信标志
unsigned char Buff[20];//数据缓冲区
//串口初始化函数
void serial_init()
{
TMOD=0x20; //定时器1工作于方式2
TH1=0xfd;  
TL1=0xfd; //波特率为9600
PCON=0;
SCON=0xd0;  //串口工作于方式3
TR1=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)    //若接收到地址帧,则返回0xfe
  return 0xfe;
lenth=SBUF;
RI=0;     

check=lenth;
for(i=0;i<lenth;i++) //接收数据
{
  while(!RI);
  if(RB8==1)   //若接收到地址帧,则返回0xfe
   return 0xfe;
  Buff=SBUF;   
  check=check^(Buff);
  RI=0;
}
while(!RI);    //接收校验字节
if(RB8==1)    //若接收到地址帧,则返回0xfe
  return 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;           //校验码一致,表明数据接收正确,向主机发送成功信号,函数返回0x00
TB8=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];      //查看接收到的数据
}
}

主机程序
#include<reg51.h>
#include<string.h>
#define _SUCC_   0x0f//数据传送成功
#define _ERR_    0xf0//数据传送失败
unsigned charTable[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= Table;
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<lenth;i++)  //发送数据
{
check=check^Buff;
TB8=0;
SBUF=Buff;   
while(!TI);
TI=0;
}
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);
   }
  }
}

}

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表