用51单片机做多机通信,下面贴有程序,请大家帮忙看看哪错了
时间:10-02
整理:3721RD
点击:
在网上找的多机通信的程序,但是好像不正确,我自己又改了改,又加了显示,但是还是仿真不成功,显示接收的数据总是0,不知怎么回事?显示程序是没问题的。自己有改了改,把串口的工作方式给为2,结果LCD就显示数据了,但是显示的数据不正确,而且不是按照我要求的格式显示的,是不是在接收数据的时候出错的?大家给看看,,谢谢啦
主机程序
#include<reg51.h>
#include<intrins.h>
#define unit unsigned int
#define uchar unsigned char
#define addr1 1 //从机1地址
#define addr2 2 //从机2地址
uchar Rec[5]; //接收数据缓存区
uchar point; //数据指针
void Uart_Init(void)
{
TMOD=0x20; //定时器T1使用工作方式2
TH1=0xfd;
TL1=0xfd;
TR1=1; //开始计时
PCON=0x80; //SMOD=1;
SCON=0x90; //工作方式3,9位数据位,波特率9600bit/s,允许接收
TI=1;
RI=1;
}
void Re_Data() //接收设备数据程序
{
uchar buf;
if(RI)
{
RI=0;
buf=SBUF;
if(point==0)
{
if(buf==0xfe)
{
Rec[point++]=buf;
}
else point=0;
}
else if(point>0&&point<5)
{
Rec[point++]=buf;
}
else if(point==5)
{
if(buf==0xef)
{
Rec[point++]=buf;
}
else point=0;
}
else
point=0;
}
}
void send_addr(uchar addr) //发送地址
{
TB8=1; //发送地址帧
SBUF=addr; //发送地址
while(!TI); //等待发送完毕
TI=0; //软件复位TI
}
void main()
{
LcdInitiate(); //显示初始化
Uart_Init(); //串口初始化
while(1)
{
send_addr(addr1); //向从机1发地址
Re_Data(); //接收从机1发送的数据
LCD_dis1(); //显示数据
send_addr(addr2); //向从机2发地址
Re_Data();
LCD_dis2();
}
}
从机程序
#include<reg51.h>
#include<intrins.h>
#define unit unsigned int
#define uchar unsigned char
#define addr 1 //从机1地址
uchar flag=1;
uchar buf[5]; //从机数据暂存区
void Uart_Init(void)
{
TMOD=0x20; //定时器T1使用工作方式2
TH1=0xfd;
TH0=0xfd;
TR1=1; //开始计时
PCON=0x80; //SMOD=1;
SCON=0x90; //工作方式3,9位数据位,波特率9600bit/s,允许接收
TI=1;
RI=1;
}
void send(uchar* Data) //发送数据程序
{
uchar i;
for(i=0;i<5;i++)
{
SBUF= *(i+Data);
while(!TI); //等待发送完毕
TI=0;
}
}
void main()
{
uchar tem;
Uart_Init();
LcdInitiate();
while(1)
{
buf[0]=0xfe;
buf[1]=addr;
buf[2]=flag;
buf[3]=A_D();
buf[4]=0xef;
SM2=1; //只接收地址帧
//如果接收到的地址帧不是本机地址,则继续等待
while(tem!=addr)
{
while(!RI);
RI=0;
tem=SBUF;
}
//如果是本机地址,发送应答信号,并做好接受数据的准备
TB8=0; //主机不检测该位
send(buf);
}
}
图为仿真电路,红色方框内为显示的数据
各位大侠给点指点呗
帮你顶一下
给你顶上去,让大神看
顶顶顶,小编加油