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

📄 slave.c

📁 此程序能实现单片机与PC机的多机通信
💻 C
字号:
#include<c8051f020.h>
#define uchar unsigned char
#define SLAVE0 0x02								//从机地址
#define BN0 16
uchar trbuf[16];
uchar rebuf[16];
bit tready;
bit rready;
void main()
{	
	TMOD=0x20;
	TH1=0xfd;
	TL1=0xfd;
	PCON=0x00;
	TR1=1;
	SADDR0=SLAVE0;								//从机地址
	SADEN0=0xff;
	SCON0=0xf0;									//UART0方式3,SM20=1,REN0=1,TB80=0
	ES0=1;
	EA=1;										//开中断
	while(1){tready=1;rready=1;}				//等待中断
}

void ssio(void) interrupt 4 using 1				//中断函数
{
	void str(void);								//函数声明
	void sre(void);
	uchar a;
	RI0=0;
	ES0=0;
	if(SBUF0!=SLAVE0){ES0=1;goto reti;}			//非本机地址,继续监听,因c8051f内部
												//可自动判断,因此这句可省
	SM20=0;
	SBUF0=SLAVE0;								//回送从机地址
	while(!TI0);TI0=0;
	while(!RI0);RI0=0;							//接收命令
	if(RB80==1){SM20=1;ES0=1;goto reti;}		//是复位命令,继续监听
	a=SBUF0;
	if(a==0x01)									//接收主机数据命令
	{
		if(rready==1) SBUF0=0x01;				//发准备好接收状态字
		else SBUF0=0x00;						//发未准备好接收状态字
		while(!TI0);TI0=0;
		sre();
	}
	else
	{
		if(a==0x02)									//向主机发送数据的命令
		{
			if(tready==1) SBUF0=0x02;				//发准备好接收状态字
			else SBUF0=0x00;						//发未准备好接收状态字
			while(!TI0);TI0=0;
			str();
		}
		else
		{
			SBUF0=0x08;								//发送非法命令状态字
			while(!TI0);TI0=0;
			SM20=1;ES0=1;							//恢复监听
		}
	}
	reti: ;
	
}


void str(void)										//发送数据块
{
	uchar p0,i0;
	tready=0;
	do
	{
		p0=0;
		for(i0=0;i0<BN0;i0++)							//发送BN字节数据
		{
			SBUF0=trbuf[i0];
			p0+=trbuf[i0];
			while(!TI0);TI0=0;
		}
		SBUF0=p0;									//发送校验和
		while(!TI0);TI0=0;
		while(!RI0);RI0=0;							//接收主机应答
	}while(SBUF0!=0);
	SM20=1;
	ES0=1;
}

void sre(void)										//接收数据块
{
	uchar p0,i0;
	rready=0;
	while(1)
	{
		p0=0;
		for(i0=0;i0<BN0;i0++)
		{
			while(!RI0);RI0=0;
			rebuf[i0]=SBUF0;
			p0+=SBUF0;
		}
		while(!RI0);RI0=0;
		if(SBUF0==p0)
		{	SBUF0=0x00;
			while(!TI0);TI0=0;
			break;
		}
		else
		{
			SBUF0=0xff;
			while(!TI0);TI0=0;
		}
	}
	SM20=1;
	ES0=1;
}

⌨️ 快捷键说明

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