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;
}