目录
一、串行通信基础
1.1 并行通信与串行通信
1.1.1 并行通信
1.1.2 串行通信
1.2 同步通信与异步通信
1.3 串行通信的传输模式
二、串行口的结构
2.1 串行口控制寄存器SCON
2.1.1 SM0、SM1
2.1.2 SM2
2.1.3 REN
2.1.4 TB8
2.1.5 RB8
2.1.6 TI
2.1.7 RI
2.2 特殊功能寄存器PCON
三、串行口的4种工作方式
3.1 方式0
3.2 方式1
3.3 方式2
3.4 方式3
四、波特率的制定方法
4.1 波特率的定义
4.2 定时器T1产生波特率的计算
一、串行通信基础
1.1 并行通信与串行通信
单片机的数据通信有并行通信与串行通信两种方式。
1.1.1 并行通信
并行通信是指多个进程或者任务同时进行通信的一种方式。在并行通信中,多个进程或者任务可以同时发送和接收消息,而不需要等待其他进程或者任务完成通信操作。
并行通信的好处是可以提高系统的吞吐量和响应速度。通过并行通信,不同的进程或者任务可以并行地进行通信操作,从而可以更快地完成任务。此外,并行通信还可以提高系统的可伸缩性,使系统能够处理更多的并发请求。
1.1.2 串行通信
串行通信是指只有一个进程或者任务在进行通信的一种方式。在串行通信中,进程或者任务按照一定的顺序来发送和接收消息,只有前一个进程或者任务完成通信操作后,下一个进程或者任务才能进行通信。
串行通信的好处是简单和直观,通信操作按照顺序进行,不需要考虑同步和资源竞争问题。此外,串行通信的实现成本相对较低,不需要考虑并行处理的复杂性。
单片机并行通信与串行通信示意图
1.2 同步通信与异步通信
串行通信又有两种方式:同步串行通信与异步串行通信。
同步串行通信是指发送方向接收方发送数据后,必须等待接收方接收完毕后才能继续进行其他操作。在同步串行通信中,发送方和接收方的操作是严格同步的,发送方发送一条消息后会阻塞等待接收方接收完成,接收方接收完消息后才会解除发送方的阻塞状态。
同步串行通信适用于需要保持严格顺序和一致性的场景,例如在传输重要数据或者进行精确计时的应用中。由于发送方必须等待接收方的反馈,同步串行通信的延迟较大,但可靠性较高。
同步通信和数据格式示意图
异步串行通信则是指发送方发送数据后可以继续进行其他操作,无需等待接收方的回应。在异步串行通信中,发送方无需等待接收方的响应,可以自由地进行其他操作。接收方则会在接收到消息后进行处理,并向发送方发送适当的确认或者回应。
异步串行通信则适用于需要高效利用系统资源和并发处理的场景。由于发送方无需等待接收方的反馈,可以继续进行其他操作,可以提高系统的吞吐量和响应速度。但异步串行通信需要考虑数据的一致性和错误处理,因此编程和调试的复杂性较高。
异步串行通信示意图
1.3 串行通信的传输模式
串行通信的传输模式按照数据传输的方向和时间关系可分为单工、半双工和全双工。
-
单工传输:在单工传输中,数据只能在一个方向上进行传输。一方作为发送方,只能发送数据,而另一方作为接收方,只能接收数据。这种传输模式类似于广播电视,只有单向传输,没有数据回传。
-
半双工传输:在半双工传输中,数据可以在两个方向上进行传输,但不能同时进行。两个通信方向上的传输是交替进行的,即一方发送数据时,另一方只能接收数据,然后再进行反向传输。这种传输模式类似于对讲机,只能单向传输,需要交替切换发送和接收方向。
-
全双工传输:在全双工传输中,数据可以在两个方向上同时进行传输。两个通信方向上的传输可以同时进行,即一方可以同时发送和接收数据。这种传输模式类似于电话通信,双方可以同时进行发言和听取。(51单片机——异步全双工)
单工、半双工和全双工的数据传输模式示意图
二、串行口的结构
串行口是一种用于数据通信的接口,可以实现单片机和外部设备之间的数据传输。串行口通常由几个关键组成部分构成。
串行口的发送器,它负责将单片机中的数据转换成串行信号,并通过串行通信线路发送出去。发送器通常包含一个移位寄存器,用于存储要发送的数据,以及一个时钟,用于控制数据的发送速度。
串行口的接收器,它负责接收外部设备发送过来的串行信号,并将其转换成并行数据供单片机使用。接收器通常也包含一个移位寄存器和一个时钟,用于接收和解码串行信号。
除了发送器和接收器,串行口还包含一些控制和配置寄存器,用于设置串行通信的参数,如波特率、数据位数、校验位等。这些寄存器可以通过编程设置,以适应不同的通信需求。
最后,串行口还包含一个中断控制器,用于处理串行口的中断请求。当接收到外部设备发送的数据时,中断控制器会触发中断请求,通知单片机进行数据处理。
串行口的内部结构图
2.1 串行口控制寄存器SCON
串行口控制寄存器(SCON)是单片机中用于控制串行通信的寄存器。
下面是SCON寄存器的位布局表格:
SCON 寄存器位 | 名称 | 描述 |
---|---|---|
Bit 7 | SM0 | 串行口工作模式选择位,用于选择串行口的工作模式 |
Bit 6 | SM1 | 串行口工作模式选择位,用于选择串行口的工作模式 |
Bit 5 | SM2 | 多机通信控制位,在方式2和方式3下进行的 |
Bit 4 | REN | 允许串行接收位,用于允许串行口接受数据 |
Bit 3 | TB8 | 发送的第9位数据位 |
Bit 2 | RB8 | 接收的第9位数据位 |
Bit 1 | TI | 发送中断标志位,用于指示发送操作是否完成 |
Bit 0 | RI | 接收中断标志位,用于指示接收操作是否完成 |
2.1.1 SM0、SM1
根据SM0和SM1的不同组合,可以选择以下四种工作模式:
SM1 | SM0 | 方式 | 功能说明 |
---|---|---|---|
0 | 0 | 0 | 同步移位寄存器方式(用于扩展 I/O口) |
0 | 1 | 1 | 8位异步收发,波特率可变(由定时器T1控制) |
1 | 0 | 2 | 9位异步收发,波特率为 晶振频率/64 或 晶振频率/32 |
1 | 1 | 3 | 9位异步收发,波特率可变(由定时器T1控制) |
2.1.2 SM2
- 当SM2=1时,串行口可以与多个设备进行通信,每个设备有独立的地址。当接收到RB8为1时,才是RI置1,产生中断请求,触发中断。
- 当SM2=0时,串行口只与单一设备进行通信,不使用地址识别功能。所有接收到的数据都被直接接收,并触发中断。
在方式1时,如果SM2=1,则只有收到有效的停止位时才会激活RI。
在方式0时,SM2必须为0。
2.1.3 REN
REN位的不同设置可以选择两种不同的工作模式:
-
当REN位为1时,表示接收使能。串行口可以接收数据,并触发中断。
-
当REN位为0时,表示接收禁止。串行口不接收数据,也不会触发中断。
2.1.4 TB8
TB8用于控制是否传输第9位数据。
在使用TB8时,需要先设置SM2位为1,表示使用9位数据传输模式。当TB8为0时,表示只传输8位数据;当TB8为1时,表示传输9位数据。
2.1.5 RB8
RB8用于控制串行口接收数据的第9位。
当RB8位为1时,表示接收到的数据帧的第9位是1;当RB8位为0时,表示接收到的数据帧的第9位是0。通过判断RB8位的值,可以识别出接收到的数据帧是否是9位长,从而进行相应的处理。
2.1.6 TI
TI用于设置或检测串行口发送中断的状态。
当TI位为1时,表示串行口发送完成,并产生了中断请求。当TI位被置1时,表示要发送的数据已经全部发送完毕,并且硬件已经准备好发送下一个字节。在中断服务子程序中,可以通过检测TI位来确定数据是否全部发送完成。
2.1.7 RI
RI用于设置或检测串行口接收中断的状态。
当RI位为1时,表示串行口接收到了数据,并产生了中断请求。当RI位被置1时,表示收到了一个字节的数据,并且硬件已经准备好接收下一个字节。在中断服务子程序中,可以通过检测RI位来确定是否接收到了新的数据。
2.2 特殊功能寄存器PCON
PCON(Power Control Register)是用于控制单片机的低功耗模式和电源管理的特殊功能寄存器。
下面是特殊功能寄存器PCON的位表格:
位 | 功能 |
---|---|
7 | SMOD:串行波特率倍频控制位 |
6 | SMOD0:串行波特率倍频控制位 |
5 | LVDF:低电压检测标志位 |
4 | POF:电源故障标志位 |
3 | GF1:通用标志位1 |
2 | GF0:通用标志位0 |
1 | PD:掉电模式标志位 |
0 | IDL:IDLE模式控制位 |
每个位的具体功能如下:
-
SMOD(位7)和SMOD0(位6)用于控制串行通信的波特率倍频。当SMOD和SMOD0都为0时,波特率不进行倍频。当SMOD为0而SMOD0为1时,波特率倍频一倍。当SMOD为1而SMOD0为0时,波特率倍频两倍。当SMOD和SMOD0都为1时,波特率倍频四倍。
-
LVDF(位5)是一个低电压检测标志位,用于指示系统电压是否低于预设的阈值。当LVDF为1时,表示电压低于阈值;当LVDF为0时,表示电压正常。
-
POF(位4)是一个电源故障标志位,用于指示系统是否发生了电源故障。当POF为1时,表示发生了电源故障;当POF为0时,表示电源正常。
-
GF1(位3)和GF0(位2)是通用标志位,可供用户自定义使用。
-
PD(位1)是一个掉电模式标志位,用于进入或退出掉电模式。当PD为1时,表示系统进入掉电模式;当PD为0时,表示系统正常工作。
-
IDL(位0)是一个IDLE模式控制位,用于控制系统进入或退出IDLE模式。当IDL为1时,表示系统进入IDLE模式;当IDL为0时,表示系统正常工作。
三、串行口的4种工作方式
串行口(Serial Port)的工作方式有四种,分别是方式0、方式1、方式2和方式3。
3.1 方式0
方式0,也称为同步移位寄存器方式,是一个8位的同步移位寄存器,工作在同步通信模式下。在这种方式下,串行口不使用波特率发生器,因此数据的发送和接收速率取决于外部的时钟源。
在方式0中,数据从串行口的RXD引脚输入或输出,并且是低位先行。
方式0的特点包括:
- 采用8位数据格式,即每次传输8位数据。
- 串行数据的发送和接收是同步进行的,即通过外部时钟信号来控制数据的发送和接收速率。
- 数据的发送和接收是通过移位寄存器来完成的。在发送时,数据从内部的并行数据寄存器(通常是某个特殊功能寄存器)装载到移位寄存器中,然后逐位移出;在接收时,数据逐位移入移位寄存器,最后移位寄存器的内容被转移到并行数据寄存器中。
- 由于是同步方式,这种方式的数据传输速度比异步方式(如方式1)要快。
- 方式0不支持硬件的起始位和停止位设置,因为它是完全同步的,没有起始位和停止位。
3.2 方式1
方式1是一种可变波特率的8位UART(通用异步收发传输器)。
在方式1下,串行口以8位数据格式进行通信,其中低8位是有效数据位,高1位作为停止位,还有1位起始位。波特率则由定时器1产生,可以通过编程定时器1的初值来调整波特率,使其适应不同的通信需求。
波特率的计算公式为:波特率 = 1/12 * (2^SMOD / 32) * 定时器溢出频率。其中,SMOD是PCON寄存器中的串行口波特率倍增位,定时器溢出频率是定时器1或定时器2溢出频率。
3.3 方式2
方式2是一种8位数据+1位起始位、1位停止位和1位可程控为1或0的第9位数据的可变波特率异步通信方式。
其数据帧格式如下:
- 8位数据:指的是数据部分,通常是一个字节的数据,最高位(MSB)或最低位(LSB)先发送。
- 1位起始位:在数据传输开始前,发送器会发送一个逻辑“0”(低电平)作为起始信号,告知接收器数据即将开始发送。
- 1位停止位:在数据传输结束后,发送器会发送一个逻辑“1”(高电平)作为停止信号,告知接收器当前数据包已经发送完毕。
- 1位可程控为1或0的第9位数据:这个额外的位可以是校验位(如奇偶校验位),也可以用于其他控制目的,根据系统的设计进行编程设置。
可变波特率意味着通信双方可以协商或配置不同的传输速率,以适应不同的通信距离和环境要求。
3.4 方式3
方式3是波特率可变的9位异步通信方式。数据帧由9位组成,其中包括一个起始位、8位数据位(可配置为8位有效数据位加上1位奇偶校验位)和一个停止位。
方式3的特点是它的波特率是可变的,这意味着数据的传输速率可以根据需要进行调整,以适应不同的通信需求。
四、波特率的制定方法
4.1 波特率的定义
波特率是指在数字通信中,每秒传输的比特数。它通常用单位"波特"(Baud)来表示。波特率决定了数据传输的速度,也就是每秒钟可以传输的比特数。
波特率的单位可以理解为每秒钟发生的状态变化次数。在串行通信中,每个比特位都被分为多个时间间隔,称为波特周期或比特周期。波特率表示每秒钟波特周期发生的次数。
4.2 定时器T1产生波特率的计算
方式0波特率固定为:fosc / 12
方式1波特率的计算公式为:(串行口为波特率可变的8位异步通信接口,SMOD为PCON寄存器的最高位值(0或1))
方式1波特率 =(2^SMOD / 32) * 定时器T1的溢出率
(注:当SMOD=1时,要比SMOD=0时的波特率加倍,所以也称SMOD位为波特率倍增位)
方式2的波特率由下式确定:
方式2波特率=( 2^SMOD / 64) * fosc
方式3的波特率由下式确定:
方式3波特率 = (2^SMOD / 32) * 定时器T1的溢出率
相关知识点:
溢出速率 = 1 / 溢出时间
溢出时间(相当于定时时间)= (2^8 – TH1初值)* Tcy
机器周期Tcy = 12时钟周期 = 12*(1/fosc)
故:溢出速率 = 1 / 溢出时间 = 1 / [(256 - TH1初值)* (12 / fosc)] = fosc / [12 *(256-TH1初值)]
计数速率 = 1 / 计数时间 = 1 / (12 / fosc) = fosc / 12
故也可写成:溢出速率 = 计数速率 / (256-TH1初值) = fosc / [12 *(256-TH1初值)]
原文链接:
https://blog.csdn.net/WalterBrien/article/details/92847894https://blog.csdn.net/WalterBrien/article/details/92847894