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

📄 slave.c

📁 这是一个用c语言实现一个主机到多个从机进行通信的51源代码
💻 C
字号:
//slave.c
#include <reg51.h>
#define uchar unsigned char
#define SLAVE 0x02
#define BN 16

uchar idata trbuf[16];
uchar idata rebuf[16];

bit tready;
bit rready;

void main(void)
{
	TMOD=0x20;    //T/C1定义为方式2,
	TL1=0xfd;     //设初值
	TH1=0xfd;
	PCON=0x00;    //波特率不乘2;
	TR1=1;
	SCON=0xf0;    //串行口为方式3
	ES=1;EA=1;    //开串行口中断
	while(1)      //假定准备好发送和接收数据
	    {
	    	tready=1;rready=1;
	    }
	}

void ssio(void) interrupt 4 using 1
         {
         	void str(void);
         	void sre(void);
         	uchar a,i;
         	RI=0;//软件清零,
         	ES=0;//关串行口中断
         	if(SBUF!=SLAVE)   //非本机地址,继续监听,中断返回
         	   {
         	   	ES=1;goto reti;
         	   	}
         	SM2=0;            //取消监听状态
         	SBUF=SLAVE;       //从机地址发回主机
         	while(TI!=1);TI=0;
         	
         	while(RI!=1);RI=0;//接收来自主机的数据
         	if(RB8==1)
         	    {SM2=1;
         	    	ES=1;
         	    	goto reti;
         	    }
         	a=SBUF;//接收命令
         	if (a==0x01)  //从机接收主机数据
         	   {
         	   	if(rready==1)      //从机接收准备好发状态,可以接收主机的数据
         	   	   SBUF=0x01;
         	   	 else
         	   	    SBUF=0x00;
         	   	 while(TI!=1);TI=0;
         	   	 
         	     while(RI!=1);RI=0;  
         	     if(RB8==1)
         	        {SM2=1;
         	    	   ES=1;
         	    	   goto reti;
         	    	   } 
         	      sre();    //接收数据块;
         	   }
         	 else
         	    {
         	    	if (a==0x02)
         	         {
         	   	        if(tready==1)
         	   	             SBUF=0x02;
         	   	        else
         	   	            SBUF=0x00;
         	   	        while(TI!=1);TI=0;
         	   	        
         	            while(RI!=1);RI=0;  
         	            if(RB8==1)
         	              {SM2=1;
         	    	         ES=1;
         	    	         goto reti;
         	    	        } 
         	           str();  
         	    	  } 
         	     else 
         	        { SBUF=0x80;
         	      	  while(TI!=1);TI=0;
         	      	  SM2=1;ES=1;
         	        } 	 	
         	    }	
         	reti;
        }
        
    void str(void)//发送数据
         {
         	uchar p,i;
         	tready=0;//清发准备好标志
         	do 
         	  {
         	  	p=0;//清校验和
         	  	  for(i=0;i<BN;i++)
         	  	     {
         	  	     	SBUF=trbuf[i];//发送一个数据
         	  	     	p+=trbuf[i];
         	  	     	while(TI!=1);
         	  	     	TI=0;
         	  	     	}
         	  	  SBUF=p;  //发送校验和
         	  	  while(TI!=1);TI=0;
         	  	  
         	      while(RI!=1);RI=0;    	
         	  	}
         	  while (SBUF!=0);//主机接收不正确,重新发送
         	  SM2=1;      //继续回到监听状态
         	  ES=1;	
         	} 
         	
void sre(void)
     {
     	uchar p,i;
     	rready=0;
     	while (1)
     	    {
     	    	p=0;
     	    	for(i=0;i<BN;i++)
     	    	   {
     	    	   	while(RI!=1);RI=0;
     	    	   	rebuf[i]=SBUF;
     	    	   	p+=rebuf[i];
     	    	   	}
     	    	while (RI!=1);RI=0;
     	    	if(SBUF==p)
     	    	   {SBUF=0x00;break;}   //校验和相同,发00
     	    	 else
     	    	    {
     	    	    	SBUF=0xff;        //校验和不同,发0FF,重新接收数据
     	    	    	while(TI==0);TI=0;
     	    	    }  	
     	    	}
     	 SM2=1;
     	 ES=1;   	
     	}         	       

⌨️ 快捷键说明

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