一:NOTE
今天分享一下52单片机串口通信的一些知识吧~
二:预备知识
1、RXD(P3^0)串行输入口,TXD(P3 ^ 1)串行输出口,SBUF接收和发送寄存器。
2、RI串行接收中断请求标志,TI串行发送中断请求标志。
3、串行口发送过程:发送操作是在TI=0下进行的,此时发送缓冲寄存器SBUF(发送)相当于一个移位寄存器,8位数据以设定的波特率发送,发完数据后,发送中断标志TI由硬件置位,可以发出中断。
4、串行口接收过程:接收过程是在RI=0且REN=1条件下启动的,此时接收缓冲寄存器SBUF(接收)相当于一个移位寄存器,接受时,先置位允许接受控制位REN,当RI=0和REN=1同时满足时,开始接收,接收完成由硬件置位RI
5、串行口有4种工作方式,常用的是工作方式1,方式0和方式2的波特率相对比较固定。
6、当定时器工作方式设置为工作方式2时,串行口设置为工作方式1时,计算初值的公式为:波特率=(2^SMOD)/32*(fosc/(12*256-X))
三:相关寄存器
1、这个寄存器通常只设置SMOD,因为它涉及到上面初值的计算。
2、这个设置串行口工作方式,而且还有接收中断REN,有的程序中直接写SCON=…很有人就看不懂了,其实就是设置这些位而已,这里有一点要注意,它的SM0是最高位,有的时候会迷糊的
3、这里ET2时定时器2的中断控制,只有STC89C52才有,51没有的,ES串行口中断,EA是总中断,这些都是到时候程序中要设置的。
四:查询方式实现串口通信
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
//查询方式
uchar receivedata;
void UsartConfig()
{
// REN=1; //SCON D7=SM0 D6=SM1 D5=SM2 D4=REN D3=TB8 D2=RB8 D1=TI D0=RI
// SM0=0; //串行口工作方式控制位,这里选用工作方式1,10位移步收发器,波特率可以控制
// SM1=1;
SCON=0x50;
TMOD=0x20; //设置定时器1为工作方式2
PCON=0x80; //设置SMOD=1
}
void main()
{
UsartConfig();
while(1)
{
if(RI==1)
{
RI=0;
receivedata=SBUF;
}
}
}
五:中断方式实现串口通信
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
void UsartConfig()
{
// REN=1; //SCON D7=SM0 D6=SM1 D5=SM2 D4=REN D3=TB8 D2=RB8 D1=TI D0=RI
// SM0=0; //串行口工作方式控制位,这里选用工作方式1,10位移步收发器,波特率可以控制
// SM1=1;
SCON=0x50; //也可以写成上面三行的方式
TMOD=0x20; //设置定时器1为工作方式2
PCON=0x80; //设置SMOD=1
TH1=0xFA; //波特率设置的9600,用上面公式就可以算出来
TL1=0xFA;
ES=1; //串口中断允许控制位
EA=1; //总中断允许控制位
TR1=1; //开定时器1
}
void main()
{
UsartConfig();
while(1);
}
void ser() interrupt 4
{
uchar receivedata;
receivedata=SBUF;
RI=0;
SBUF=receivedata;
while(!TI);
TI=0;
}