微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > 用51单片机做多机通信,下面贴有程序,请大家帮忙看看哪错了

用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);
   }
}


图为仿真电路,红色方框内为显示的数据


各位大侠给点指点呗

帮你顶一下            

给你顶上去,让大神看

顶顶顶,小编加油

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top