51单片机:主机甲向从机乙发送字母A,乙收到后返还给甲,甲收到后LED灯状态发生改变

51单片机:主机甲向从机乙发送字母A,乙收到后返还给甲,甲收到后LED灯状态发生改变

题目要求:

开关按下主机甲向从机乙发送字母A,乙收到后并返还给甲,当甲收到后LED灯状态发生改变

代码如下:

主机甲

/*
*开关按下主机甲向从机乙发送字母A,
*乙收到后并返还给甲,
*当甲收到后LED灯状态发生改变
*/
#include <reg52.h>
sbit LED = P2^1;
sbit sw = P3^7;
void UartInit(void); //初始化UartInit
void DelayMS(unsigned int x);//延时函数

void main()
{

  	UartInit();// 初始化UartInit
	while(1)
	{
	   if(sw == 0)   //消抖
	   {
		 DelayMS(10);
		 if(sw == 0)   //开关消抖
		  {
			 while(sw == 0);
			 DelayMS(10);
		     SBUF = 'A';  //主机发送数据A
		     while(TI == 0);//若发送中断标志位没有置1(正在发送数据),就等待
	         TI = 0;//若发送完成,TI自动置1,这里把它清零
		  }		 
	   }
	}
}

void ES_ISR(void) interrupt 4
{
	if(RI)//查询串口是否接收到一个完整的数据
		{
			RI = 0;//收到数据,清除标志,准备下一次判断
			if(SBUF == 'A')  //如果收到的是字母A
			{	
			  LED ^= 1; //将LED_RED的状态取反
			}
		}
	if(TI)
	    TI = 0;
}

void UartInit(void) //初始化uart
{		
	SCON = 0x50;		
	TMOD = 0x20;
	PCON = 0x00;	
	TL1 = 0xfd;	
	TH1 = 0xfd;				
	TR1 = 1;
	TI = 0;	   //发送中断标志位
	RI = 0;	   //接收中断标志位
	ES = 1;    //串口中断
    EA = 1;    //开总中断           
}

void DelayMS(unsigned int x)   //延时函数
{
	unsigned int i;
	while(x--)
	{
		for(i=0;i<120;i++);
	}
}	 

主机乙

/*
*从机乙从主机甲接收到字母A,收到后返还给甲
*/
#include <reg52.h>
void main()
{
	SCON = 0x50;		
	TMOD = 0x20;
	PCON = 0x00;	
	TL1 = 0xfd;	
	TH1 = 0xfd;				
	TR1 = 1;
	TI = 0;	   //发送中断标志位
	RI = 0;	   //接收中断标志位
	ES = 1;    //串口中断
    EA = 1;    //开总中断 
}

void ES_ISR(void) interrupt 4
{
	if(RI)//查询串口是否接收到一个完整的数据
		{
			RI = 0;//清除标志,准备下一次判断
			if(SBUF == 'A')  //如果收到的是字母A
			{	
			  SBUF = 'A'; //将A发给主机
			}
		}
	if(TI)
	    TI = 0;
}

仿真结果:

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/qq_42156796/article/details/89061404