该知识点来源于B站知弦,本章便是对其串口通信应用的简单总结!!!
一、串口通信
如下图,51与外部进行串口通信时,
51TXD接外设RXD,51RXD接外设TXD
串口数据都放在SBUF中,通过TI与RI控制发送与接收数据
TI=0:准备(正在)发送,TI=1,发送完毕;RI=0 :准备或正在接收,RI=1:接收完毕。
二、串口寄存器配置
如下面两张图,
SM0、SM1为配置模式,SM2为多机位(一般为0),
REN为允许接收(一般为1)
TB8/9一般为0,
TI与RI为0(初始化为0才能接收或发送)
由此,假设我们选择方式2可以这么设计 :
SCON=0x50;//0101 0000
三、SMOD
四 、通信方式
在SM0、SM1为0、1时,为8为异步通信方式
下图有其对应的波特率设置公式,若我们设置9600波特率,SMOD=0
那么根据公式有:
T1=256-11095200*2^0/(12*9600*32)
=256-3
=0xfd
则TH、TL代码为:
TH0/1=0xfd;// 0/1:代表定时器0或1
TL0/1=0xfd;
五、仿真与程序
仿真:仿真其实并不能真实反应通信结果
程序:
#include "reg52.h"
unsigned int redat=0,flat=0;
void initscon()
{
SCON=0x50; //0101 0000:八位异步通信,可接收发送数据
TMOD=0x20;// 00010 0000:定时器1 ,模式2八位自动可重载
TH1=0xfd;
TL1=0xfd;
ES=1;
EA=1;
TR1=1;
}
void send_out()
{
SBUF=redat;
while(!TI);
TI=0;
}
void main()
{
initscon();
while(1)
{
if(flat==1)
{
send_out();
flat=0;
}
}
}
void scon_isr() interrupt 4 //串口中断
{
redat=SBUF;
while(!RI);
RI=0;
flat=1;
}
六、实际测试
由于仿真并不能出结果,于是我便拿89c52RC实际测试通信,程序的功能为,串口助手发送什么,其接收到什么数据。
下面两张图为不同串口助手的测试,结果为:串口程序调试成功!!!!
七、总结
在51串口通信中:
配置好SCON后
再使用定时器配置波特率(波特率计算公式须记)
串口中断的编号为4
RI与TI可以灵活运用
!!!!