其他分享
首页 > 其他分享> > 单片机两种方式实现串口通信

单片机两种方式实现串口通信

作者:互联网

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

六:OK,完了

标签:方式,TI,通信,串行口,单片机,REN,串口,波特率,RI
来源: https://blog.csdn.net/qq_43590728/article/details/104895079