如图导入元器件并连线
![](https://img-blog.csdnimg.cn/img_convert/ff0c085afae59d249feba58221c7e989.png)
下面先了解一下有关串口的寄存器的相关设置
![](https://img-blog.csdnimg.cn/img_convert/bd9b207c6f24c5cd4be2d0500ce431fd.png)
下面就是编写c程序了,注意看每一步的注释
![](https://img-blog.csdnimg.cn/img_convert/1ced9a8f224fc53ee325943c5a656be2.png)
![](https://img-blog.csdnimg.cn/img_convert/333545e73e94edd5004bc3fbbc3b443f.png)
![](https://img-blog.csdnimg.cn/img_convert/5d592bba6ae7b41a0f626b58de063970.png)
![](https://img-blog.csdnimg.cn/img_convert/589c1d2daa3212f45ac03f47bbeea95a.png)
#include"reg52.h"
char recdat=0, flag=0; // 定义接收到的数据变量recdat, 和接收完成标志位flag
void init(){ // 初始化串口
SCON = 0x50; //0101 0000
TMOD = 0x20; //0010 0000 波特率设置,由定时器1产生。
TH1 = 256-3; // 8位自动重置定时器赋初值
TL1 = 256-3; // 8位自动重置定时器赋初值
ES = 1; //开启串口中断
EA = 1; // 开启总中断
TR1 = 1; // 打开定时器1
}
void senddat(){
SBUF = recdat ; // 发送的数据就是刚刚接收到的数据
while(!TI); // 发送完毕TI置1, 非1就是0, 也就是当发送完毕后结束while循环
TI = 0; // 发送完毕后把TI置零,不然第二次发送数据就不行了
}
void main(){
init();
while(1){
if(flag == 1){ // 如果接收完毕标志位是1(也就是当我接收到数据后开始发送数据)
senddat(); // 就发送数据
flag = 0; // 将接收完毕标志位置0
}
}
}
void zhongduan() interrupt 4{
recdat = SBUF; // 把接收缓存SBUF中的内容赋值给recdat
RI = 0; // 接收完毕标志位置0
flag = 1; // 自己定义的接收完毕标志位置1
}
![](https://img-blog.csdnimg.cn/img_convert/2d9d0d666d5b30f0b5be5534cdbfd08a.png)
接下来就是编译成hex文件,导入proteus中别忘了设置晶振频率为11.0592Mhz。
![](https://img-blog.csdnimg.cn/img_convert/dbc273d47c242cef742d19676643f2c5.png)
在黑色Virturl Terminal中输入123456789,后能显示31 32 33 34 35 36 37 38 39,就能证明收发都没有问题了,显示的就是单片机发送过来的数据,是ASCII码表。自己可以百度对照。
![](https://img-blog.csdnimg.cn/img_convert/2c74b2e7687f9788878a603a46c73052.png)