用51单片机做多机通信,下面贴有程序,请大家帮忙看看哪错了

2019-07-15 14:15发布

本帖最后由 记忆深林 于 2016-4-26 13:43 编辑

在网上找的多机通信的程序,但是好像不正确,我自己又改了改,又加了显示,但是还是仿真不成功,显示接收的数据总是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);
   }
}


QQ图片20160426122018.png
图为仿真电路,红 {MOD}方框内为显示的数据 图为仿真电路,红 {MOD}方框内为显示的数据
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。