微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > 求助!单片机485多机主从通信中的语句:if((a...

求助!单片机485多机主从通信中的语句:if((a...

时间:10-02 整理:3721RD 点击:

#include <reg52.h>     //52系列单片机头文件

#define uchar unsigned char

#define uint unsigned int

#define SLAVE 0x02       /*从机地址*/

#define BN 16

uchar rbuf[16];

uchar code tbuf[16]={"master transmit"};

void err(void)

{

SBUF=0xff;

while(TI!=1);

TI=0;

}

uchar master(uchar addr,uchar command)

{

uchar aa,i,p;

while(1)

   {

SBUF=SLAVE;  /* 发呼叫地址 */

    while(TI!=1);

TI=0;

    while(RI!=1);

RI=0;       /* 等待从机回答 */

    if(SBUF!=addr)

err();     /* 若地址错,发复位信号 */

      else

{                /* 地址相符 */

    TB8=0;        /* 清地址标志 */

    SBUF=command;     /* 发命令 */

   while(TI!=1);

TI=0;

   while(RI!=1);

RI=0;

aa=SBUF;          /* 接收状态 */

   if((aa&0x08)==0x08) /* 若命令未被接收,发复位信号 */

{

TB8=1;

err();

}

   else

{

       if(command==0x01)      /* 是发送命令 */

          {

if((aa&0x01)==0x01)  /* 从机准备好接收 */

             {

do

{

                   p=0;            /* 清校验和 */

                  for(i=0;i<BN;i++)

                     {

SBUF=tbuf;   /* 发送一数据 */

                        p+=tbuf;

while(TI!=1);

TI=0;

                        }

                        SBUF=p;      /* 发送校验和 */

                        while(TI!=1);

TI=0;

                        while(RI!=1);

RI=0;

                    }while(SBUF!=0); /* 接收不正确,重新发送 */

                      TB8=1;         /* 置地址标志 */

return(0);

          }

        else

{

             if((aa&0x02)==0x02)   /* 是接收命令,从机准备好发送 */

  {

while(1)

             {

p=0;               /* 清校验和 */

                for(i=0;i<BN;i++)

              {

while(RI!=1);

RI=0;

            rbuf=SBUF;  /* 接收一数据 */

                p+=rbuf;

                }

                while(RI!=1);

RI=0;

                    if(SBUF==p)

                    {

SBUF=0X00;   /* 校验和相同发"00" */

                while(TI!=1);

TI=0;

                break;

         }

          else

              {

SBUF=0xff;  /* 校验和不同发"0FF",重新接收 */

              while(TI!=1);

TI=0;

          }

        }

        TB8=1;      /* 置地址标志 */

return(0);

      }

     }

    }

   }

  }

}

}

void main()

{

TMOD=0x20;                   /* T/C1定义为方式2 */

TL1=0xfd;

TH1=0xfd;                 /* 置初值 */

PCON=0x00;

TR1=1;

SCON=0xf0;                  /* 串行口为方式3 */

master(SLAVE,0x01);

master(SLAVE,0x02);

while(1);

}

在线等……大人请指示啊 感激不尽

猜不出来你有什么问题

先多谢斑竹回复!
红色部分标志的 假设主机给从机发送“从机准备接收数据命令:SBUF=0x01”发送后从机应答
疑问1 从机是如何进行应答的 主机接收的是什么 aa=SBUF;
疑问2 if((aa&0x08)==0x08)这句是什么意思 程序旁有解释是若命令未被接收 是主机没收到响应?还是从机没收到命令!

同志,有木有搞清楚为什么?我也遇到了这个问题。求助。

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

网站地图

Top