51单片机之串口通信详解

串口通信

  • 一、串口通信概念
    • 1、串口通信的作用
    • 2、串口通信的通信方式
    • 3、串行通信的通信方式
    • 4、通信方向
    • 5、串行通信接口的作用
  • 二、串行口的结构和工作原理
    • 1、串行口结构
    • 2、串行口工作原理
    • 3、波特率的设定
  • 三、串行口的控制寄存器
    • 1、串口工作方式寄存器SCON
    • 2、电源控制寄存器PCON
    • 四、串行口的具体应用编程
  • 五、查询方式和中断方式详细流程
    • 1、查询方式
    • 2、中断方式
  • 六、例程

一、串口通信概念

1、串口通信的作用

串口通信主要用于单片机与外部设备的通信。51单片机自身有圈双工的异步通信串口。

2、串口通信的通信方式

串口通信基本通信方式有两种:并行通信串行通信
51单片机之串口通信详解_第1张图片
串行通信:传送数据的各位按顺序一位一位发送或者接收

并行通信:传送数据各位同时发送或接收

3、串行通信的通信方式

串行通信根据帧信息的格式分为异步通信同步通信

异步通信:一帧数据先用一个起始位“0”表字符开始,然后是5~8位数据,即该字符的代码,规定低位在前,高位在后,接下来是奇偶校验位(可以省略),最后一个停止位“1”表示字符结束

同步通信:发送方在数据或字符前面用1~2字节同步字符指示一帧的开始,同步字符是双方约定好的,接收方检测到与规定的同步字符符合时,开始接收数据,发送方按顺序连续传送N个数据,N个数据传完后,发送1-2字节的校验码。

接收端和发送端的同步由时钟实现

同步通信省去了字符开始和结束的标志,一帧可以连续传送若干个数据,所以速度高于异步传送。

4、通信方向

串口通信的通信方向分为单工、半双工、全双工三种。

单工传送:通信接口只能发送或者接收。

半双工传送:通信接口可以接收也可以发送,但是发送和接收不能同时进行。

全双工传送:两机的发送和接收可以同时进行

一般情况下,我们的51单片机采用的为全双工,通过TXD,RXD两个通信接口同时进行数据的发送和接收。

需要注意的是,51单片机在实物连线上要反接,一机的TXD应接另一机的RXD,RXD接另一机的TXD。而一些特殊型号的单片机标注正接,即RXD接RXD,TXD接TXD。

5、串行通信接口的作用

我们单片机内部的CPU只能处理并行数据,要进行串行通信,就必须要接我们的串行接口,按串行通信协议,进行数据的处理。具体的有

A:实现数据格式化
按串行数据格式,对CPU的并行数据进行处理。

B:进行串行数据和并行数据的转换
发送端,并行转串行送接收端;
接收端,串行转并行送CPU;

C:控制数据的传输速率
接口应具备对数据传输速率----波特率的控制选择能力(具有波特率发生器)

D:进行传送错误检测
发送时,接口对传送数据在的生成奇偶校验位或校验码;在接收时接口检查校验位或校验码,以确定传送中是否有误码。

51单片机内含的通信接口:
51单片机内含一个全双工的异步通信接口,通过对串行接口写控制字可以选择其数据格式,内含波特率发生器,提供可选波特率,可完成双机通信或多机通信。

二、串行口的结构和工作原理

1、串行口结构

51单片机之串口通信详解_第2张图片

串行口主要由两个数据缓冲寄存器SBUF和一个输入移位寄存器组成,内部还有一个串行控制寄存器SCON和一个波特率发生器(T1定时器或内部时钟及分频器组成)

我们串行口发送的数据先逐位进入接收端移位寄存器,再送入接收端SBUF。移位寄存器和SBUF采用了双缓冲结构,避免两帧数据发送混乱。

2、串行口工作原理

51单片机之串口通信详解_第3张图片
A:发送机CPU向SBUF写入数据,启动发送过程

B:按SCON设定好的控制方式和设定的波特率,由低位到高位一位一位的按移位时钟发送到电缆线上

C:数据通过电缆线到达接收机

D:接收机按照设定的波特率,按移位时钟一位一位的由低到高移入SBUF

因此我们的发送机,接收机波特率必须保持一致,才可以正常的收发数据,即发送机移出的刚好被接收机移入。

E:发送机发完一帧数据(发送缓冲器空),硬件置位发送中断标志位TI(SCON.1)位可作为查询标志,如果设置为允许中断,将引起中断,发送机可再发送下一帧数据。(先发后查

F:接收机,预先置位REN(SCON.4)即允许接收,再按波特率由低到高进入接收机移位寄存器,数据收齐后(接收缓存器满),硬件置位RI(SCON.0),可作为查询标志,如果设置为允许中断,将引起接收中断,CPU方可从SBUF中读入这帧数据。(先查后收

总结:
① 查询方式发送的过程:发送一个数据→查询TI→发送下一个数据(先发后查)
查询方式接收的过程:查询RI→读入一个数据→查询RI→读入下一个数据(先查后收)
②通信双方波特率必须相同

3、波特率的设定

第一种方式:
系统时钟分频值

第二种方式:
定时器T1提供(针对基础51来讲)

波特率计算:
当串口工作在工作方式0和2时,波特率固定。
方式0时 fosc / 12
方式2时 SMOD=0 fosc / 32 或 SMOD=1 fosc / 64

方式1时
波特率=(2^SMOD/32)*(单片机时钟频率/(256-X)) //X是初值
51单片机之串口通信详解_第4张图片
但一般情况下,我们是先确定波特率,再确定定时计数器初值
51单片机之串口通信详解_第5张图片

三、串行口的控制寄存器

1、串口工作方式寄存器SCON

51单片机之串口通信详解_第6张图片
51单片机之串口通信详解_第7张图片

2、电源控制寄存器PCON

51单片机之串口通信详解_第8张图片

四、串行口的具体应用编程

1、定好波特率
串行口波特率有两种方式:固定波特率和可选波特率
当使用可变波特率时,应先计算T1的计数初值,并对T1初始化
当使用固定波特率时,选择方式0、2

2、填写控制字
对SCON寄存器设置工作方式,若为接受程序,需置为REN=1(允许接收),同时将TI、RI置零(串口中断标志位)
3、选择串行通信方式
串行通信可采用两种方式:查询方式和中断方式
TI和RI是一帧数据发送或接收完的标志,可用于查询;如果允许中断,可引起中断。

查询方式:
发送一个数据→查询TI→发送下一个数据(先发后查)
查询RI→读入一个数据→查询RI→读入下一个数据(先查后收)

中断方式:
发送程序:发送一个数据→等待中断,在中断中发送下一个数据
接受程序:等待中断,在中断中再接受一个数据

注意:两种方式中,都要软件请TI、RI标志位,即用程序语句清0

4、约定标志字符

为了收发双方的协调,除了两边的波特率要保持一致,也可以约定标志字符作为发送数据的起始,先发送标志字符,待对方收到并回应之后,再正式发数据。
当我们采用多机通信时,标志字符就相当于是各个分机的地址

五、查询方式和中断方式详细流程

1、查询方式

51单片机之串口通信详解_第9张图片

2、中断方式

51单片机之串口通信详解_第10张图片

六、例程

#include "reg52.h"			

typedef unsigned int u16;	  
typedef unsigned char u8;

void UsartInit()
{
     
	SCON=0X50;			//  0101 0000  设置为工作方式1  
	TMOD=0X20;			//  0010 0000  设置计数器工作方式2
	PCON=0X80;			//  1000 0000波特率加倍
	TH1=0XF3;				//计数器初始值设置,波特率9600
	TL1=0XF3;
	ES=1;			//打开接收中断
	EA=1;			//打开总中断
	TR1=1;			//打开计数器
}

void main()
{
     	
	UsartInit();  //串口初始化
	while(1);		
}

void Usart() interrupt 4  //串行口中断
{
     
	u8 receiveData;
	receiveData=SBUF;//出去接收到的数据
	RI = 0;//清除接收中断标志位 软件清零
	SBUF=receiveData;//将接收到的数据放入到发送寄存器
	while(!TI);			 //等待发送数据完成
	TI=0;				 //清除发送完成标志位
}


你可能感兴趣的:(51单片机,单片机,串口通信)