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

📄 slavedevice.c

📁 零基础单片机C语言设计全套教程
💻 C
字号:
#include<reg52.h>
#define uchar unsigned char
#define SLAVE 0x00
#define BN 16

uchar idata SendData[16];
uchar idata ReceiveData[16];

void main(void)
{
SCON  = 0x70;					//设置串行口: 方式 1, 8位UART, 允许接收
TMOD  |= 0x20;       				//设置定时器T1, 方式 2, 8位自动重装
PCON  =0x80;						//设置SMOD=1
TL1    =0xF4;						//波特率4800bit/s,初值
TH1    =0xF4;
TR1    = 1;                         	//启动定时器T1
ES	   =1;
EA	   =1;						//开串行口中断

  while(1)							//主循环
{
} 
}

void slave(void) interrupt 4 using 1		//中断服务例程
{
uchar p,i;
  uchar a;
bit SendBit;						//准备发送标志
bit ReceiveBit;					//准备接收标志

  RI=0;							//关串行口中断
  ES=0;
  if(SBUF!=SLAVE) 				//非本机地址
{
	ES=1;
	goto Exit;
}		
  SM2=0;							//取消监听状态
SBUF=SLAVE;					//发回从机地址
while(TI!=1);
TI=0;
while(RI!=1);
RI=0;
if(RB8==1) 						//地址不符,从机复位
{
	SM2=1;
	ES=1;
	goto Exit;
}		
a=SBUF;						//接收命令
if(a==1) 						//从机接收主机的数据
{						
	if(ReceiveBit==1) 
		SBUF=0x01;				//接收准备好,发回0x01
	else
		SBUF=0x00;
while(TI!=1);
TI=0;
	while(RI!=1);
	RI=0;
	if(RB8==1)
	{
		SM2=1;
		ES=1;
		goto Exit;
	}
//开始接收数据
ReceiveBit=0;
  while(1)
{
	p=0;							//初始化校验和为0
   	for(i=0;i<BN;i++)
	{
		while(RI!=1);RI=0;
   		SendData[i]=SBUF;			//接收数据
   		p+=ReceiveData[i];
  	}
  	while(RI!=1);
	RI=0;
if(SBUF==p)
{
SBUF=0x00; 				//校验和相同,返回00H
break;
	}		
	else
	{
		SBUF=0xEE; 				//返回EEH,重新接收
		while(TI!=1); 
		TI=0;		
 	}
}
SM2=1;
ES=1;
ReceiveBit=1;					//准备接收标志
}
else if(a==0x02) 					//从机向主机发送数据
{
	if(SendBit ==1) 
		SBUF=0x02;				//发送准备好
	else
		SBUF=0x00;
	while(TI!=1);
	TI=0;
	while(RI!=1);
	RI=0;
	if(RB8==1)
	{
		SM2=1;
		ES=1;
		goto Exit;
	}
//开始发送数据
SendBit =0;
  do
{
	p=0;							//初始校验和为0
    	for(i=0;i<BN;i++)
     {
		SBUF=SendData[i];			//发送数据
      	p+=SendData[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;
SendBit =1;						//准备发送标志

}
else							//非法命令
{
	SBUF=0x80;				
	while(TI!=1);
	TI=0;
	SM2=1;
	ES=1;						//恢复监听
}
Exit:;
}

⌨️ 快捷键说明

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