#include <reg52.h>
char rData = 0;
char RFlag = 0;//如果接收到数据后将RFlag置为1
char TBusy = 0;//TBusy为1表示正在发送数据
void SerialInt() interrupt 4
{
if(RI)//如果接收到数据就将SBUF中存的接收的数据赋值给rData 。手动将RI 标志位置为0
{
RI = 0;
rData = SBUF;
RFlag = 1;
}
if(TI)//如果发送数据完毕,手动将 TI标志置为0
{
TI = 0;
TBusy = 0;
}
}
//19200波特率
void UartInit(void)//初始化配置定时器1
{
TMOD = 0x20; //T1 方式2
PCON = 0x80; //SMOD = 1
SCON = 0x50; //方式1 8个数据位
TH1=0xFD;
TL1=0xFD;
TR1 = 1; //启动定时器1
ES=1; //开串口中断
EA=1; //开总中断
}
void main()
{
UartInit();
while(1)
{
if(RFlag)//如果接收到数据,并且发送数据处于空闲状态(TBusy==0时),将接收到的数据再发送出去
{
RFlag = 0;
while(TBusy);
TBusy = 1;
SBUF = rData;
}
}
}
同样使用上面接收数据使用的软件进行测试:
需要注意发送和接收的编码要设置成一致,不然接收的可能显示出来就是乱码
/** ****************************************************************************** * @file : main.c * @brief * @author : 涛声依旧 * @version : V1.0.0 * @date : 2019-12-13 * Fuction List : 1. ... <version>: <modify staff>: <data>: <description>: 2. ... ****************************************************************************** ** * * COPYRIGHT(c) 2019, 机器鸟 www.qshikong.cn * * 满足以下条件,允许修改或者修改后以源代码和二进制形式重新分发和使用。 * 1. 重新分发源代码必须保留上述版权声明,以及此条件列表 * 和以下免责声明。 * 2. 二进制形式的重新分发必须复制上述版权声明, * 此列表内容和以下免责声明于发行版随附的材料中。 * 3. 机器鸟的名称或其贡献者的名称未经事先特别说明许可,不可用于认可 * 或推广从该产品衍生的产品。 * * 免责声明:本软件只用于教学、学习、测试使用,对于任何直接、间接、偶发、 * 特殊等损害,版权持有人或贡献者在任何情况下均不承担责任。 * ****************************************************************************** */ /* Includes ------------------------------------------------------------------*/ #include <reg52.h> /* Private typedef -----------------------------------------------------------*/ /* Private define ------------------------------------------------------------*/ /* Private macro -------------------------------------------------------------*/ /* Private variables ---------------------------------------------------------*/ char rData = 0; char RFlag = 0; char TBusy = 0; /* Private function prototypes -----------------------------------------------*/ /* Private functions ---------------------------------------------------------*/ void SerialInt() interrupt 4 { if(RI) { RI = 0; rData = SBUF; RFlag = 1; } if(TI) { TI = 0; TBusy = 0; } } //19200波特率 void UartInit(void) { TMOD = 0x20; //T1 方式2 PCON = 0x80; //SMOD = 1 SCON = 0x50; //方式1 8个数据位 TH1=0xFD; TL1=0xFD; TR1 = 1; //启动定时器1 ES=1; //开串口中断 EA=1; //开总中断 } void main() { UartInit(); while(1) { if(RFlag) { RFlag = 0; while(TBusy); TBusy = 1; SBUF = rData; } } }