⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ch10-3m.c

📁 单片机接口技术(C51版)例程源代码
💻 C
字号:
#include<reg51.h>
#define uchar unsigned char
#define BN 16						//传送一次的字节数

uchar master(uchar addrs,uchar comnd);
uchar SLAVE=0x00;					//从机地址
uchar idata rdata[16];
uchar idata tdata[16]={"abcdefghijklmnop"};
void main(void)
{
   uchar i;
   TMOD=0x20;						//定时器T1定义为模式2
   TL1=0xfd;TH1=0xfd;				//置初值
   PCON=0x00;
   TR1=1;
   SCON=0xD0;					//设置串行口控制字,方式3,允许接收
   master(SLAVE,0x01);
   master(SLAVE,0x02);
 }

void error(void)
{
  SBUF=0xFF;				    	//发给从机数据出错标志
  while(TI!=1);						//等待发送完
  TI=0;
}

uchar master(uchar addrs,uchar comnd)
{ uchar a,i,p;
while(1)
 {
  SBUF=SLAVE;					//发呼叫地址 
  while(TI!=1);						//等待发送完
  TI=0;
  while(RI!=1);						//等待从机应答
  RI=0;
  if(SBUF!=addrs)
     error();							//若地址出错,发出错标志,从机复位
   else{
        TB8=0;						//清地址标志位,准备接收数据
        SBUF=comnd;				//发命令帧
        while(TI!=1);TI=0;
        while(RI!=1);RI=0;
		
        a=SBUF;						//接收从机的返回地址帧
        if((a&0x80)==0x80){TB8=1;error();}//若主机命令非法,发复位信号给从机
          else
           {
	           if(comnd==0x01)//主机发送的命令是请求从机接收数据
              {
              	if((a&0x01)==0x01)//   从机准备接收就绪
                {
	                  do{
                          p=0;    //	 清校验和
                          for(i=0;i<BN;i++)
                            {
                             SBUF=tdata[i];//发送数据
                             p=p+tdata;	//计算校验和
                             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(comnd==0x02)	//主机发送的是接收命令,从机发送数据
                      {
                        if((a&0x02)==0x02)		   	//从机准备发送就绪
                          {
                          while(1)
                            {
                             p=0;
                             for(i=0;i<BN;i++)
                               {
                                  while(RI!=1);RI=0;
                                  rdata[i]=SBUF;		//主机接收数据
                                  p+=rdata[i];
                                }
                               while(RI==0);RI=0;
                                if(SBUF==p)
                                {
                                 SBUF=0x00;		//校验和相同,发0x00给从机
                                 while(TI!=1);TI=0;
                                  break;
                                }
                              else
                                {
                                	SBUF=0x0F;			//校验和不同,发0x0F给从机
                                  while(TI!=1);TI=0;
                                }
                            }
	                        TB8=1;				//重置地址标志位
	                        return(0);
                        }
                    }
                 }
           }
       }
  }
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -