天天看点

51单片机——串行通信1 概述2 串行通信口的结构与原理3 串行通信口的控制寄存器4 四种工作方式与波特率的设置

目录

1 概述

1.1 并行通信和串行通信

1.2 串行通信的两种方式

1.2.1 异步通信

1.2.2 同步通信

1.3 串行通信的数据传送方向

2 串行通信口的结构与原理

2.1 串行通信口的结构

2.2 串行通信口的工作原理

2.2.1 接收数据过程

 2.2.2 发送数据过程

3 串行通信口的控制寄存器

3.1 串行控制寄存器(SCON)

3.2 电源控制寄存器(PCON)

4 四种工作方式与波特率的设置

4.1 方式0

4.1.1 方式0-发送数据

4.1.2 方式0-接收数据

4.2 方式1

4.2.1 方式1-发送数据

4.2.2 方式1-接收数据

4.3 方式2

4.3.1 方式2-发送数据

4.3.2 方式2-接收数据

4.4 方式3

4.5 波特率的设置

4.5.1 方式0的波特率

4.5.2 方式2的波特率

4.5.3 方式1和方式3的波特率

1 概述

        通信的概念比较广泛,在单片机技术中,单片机与单片机或单片机与其他设备之间的数据传输称为通信。

1.1 并行通信和串行通信

        根据数据传输方式的不同,可将通信分并行通信和串行通信两种。同时传输多位数据的方式称为并行通信。同时传输一位数据的方式称为串行通信。

        如图1(a)所示,在并行通信方式下,单片机中的8位数据10011101通过8条数据线同时送到外部设备中。并行通信的特点是数据传输速度快,但由于需要的传输线多,故成本高,只适合近距离的数据通信。逐位传输数据的方式称为串行通信。

        如图1(b)所示,在串行通信方式下,单片机中的8位数据10011101通过一条数据线逐位传送到外部设备中。串行通信的特点是数据传输速度慢,但由于只需要一条传输线,故成本低,适合远距离的数据通信。

51单片机——串行通信1 概述2 串行通信口的结构与原理3 串行通信口的控制寄存器4 四种工作方式与波特率的设置
图1 通信方式 

1.2 串行通信的两种方式

        串行通信又可分为异步通信和同步通信两种。51系列单片机采用异步通信方式。

1.2.1 异步通信

        在异步通信中,数据是一帧一帧传送的。异步通信如图2 所示,这种通信是以帧为单位进行数据传输,一帧数据传送完成后,可以接着传送下一帧数据,也可以等待,等待期间为空闲位(高电平)。
51单片机——串行通信1 概述2 串行通信口的结构与原理3 串行通信口的控制寄存器4 四种工作方式与波特率的设置

图2 异步通信

        (1)帧数据格式

        在串行异步通信时,数据是以帧为单位传送的。异步通信的帧数据格式如图3所示。从图中可以看出,一帧数据由起始位、数据位、奇偶校验位和停止位组成。 

51单片机——串行通信1 概述2 串行通信口的结构与原理3 串行通信口的控制寄存器4 四种工作方式与波特率的设置

 图3 异步通信的帧数据格式

        ① 起始位。

        表示一帧数据的开始,起始位一定为低电平。当单片机要发送数据时,先送一个低电平(起始位)到外部设备,外部设备接收到起始信号后,马上开始接收数据。

        ② 数据位。

        它是要传送的数据,紧跟在起始位后面。数据位的数据可以是5~8位,传送数据时是从低位到高位逐位进行的。

        ③ 奇偶校验位。

        该位用于检验传送的数据有无错误。奇偶校验是检查数据传送过程中是否发生错误的一种校验方式,分为奇校验和偶校验。奇校验是指数据位和校验位中“1”的总个数为奇数,偶校验是指数据位和校验位中“1”的总个数为偶数。以奇校验为例,若单片机传送的数据位中有偶数个“1”,为保证数据和校验位中“1”的总个数为奇数,奇偶校验位应为“1”,如果在传送过程中数据位中有数据产生错误,其中一个“1”变为“0”,那么传送到外部设备的数据位和校验位中“1”的总个数为偶数,外部设备就知道传送过来的数据发生错误,会要求重新传送数据。数据传送采用奇校验或偶校验均可,但要求发送端和接收端的校验方式一致。在帧数据中,奇偶校验位也可以不用。

        ④ 停止位。

        它表示一帧数据的结束。停止位可以是1位、1.5位或2位,但一定为高电平。一帧数据传送结束后,可以接着传送第二帧数据,也可以等待,等待期间数据线为高电平(空闲位)。如果要传送下一帧,只要让数据线由高电平变为低电平(下一帧起始位开始),接收器就开始接收下一帧数据。

        (2)51系列单片机的几种帧数据方式

        51 系列单片机在串行通信时,根据设置的不同,其传送的帧数据有以下四种方式:

        ① 方式0。

        称为同步移位寄存器输入/输出方式,它是单片机通信中较特殊的一种方式,通常用于并行I/O接口的扩展,这种方式中的一帧数据只有8位(无起始位、停止位)。

        ② 方式1。

        在这种方式中,一帧数据中有1位起始位、8位数据位和1位停止位,共10位。

        ③ 方式2。

        在这种方式中,一帧数据中有1位起始位、8位数据位、1位可编程位和1位停止位,共11位。

        ④ 方式3。

        这种方式与方式2相同,一帧数据中有1位起始位、8位数据位、1位可编程位和1位停止位,它与方式2的区别仅在于波特率(数据传送速率)设置不同。

1.2.2 同步通信

        在异步通信中,每一帧数据发送前要用起始位,结束时要用停止位,这样会占用一定的时间,导致数据传输速度较慢。为了提高数据传输速度,在计算机与一些高速设备进行数据通信时,常采用同步通信。同步通信的帧数据格式如图4所示。
51单片机——串行通信1 概述2 串行通信口的结构与原理3 串行通信口的控制寄存器4 四种工作方式与波特率的设置

 图4 同步通信的帧数据格式

        从图中可以看出,同步通信的数据后面取消了停止位,前面的起始位用同步信号代替,在同步信号后面可以跟很多数据,所以同步通信传输速度快。但由于在通信时要求发送端和接收端严格保持同步,这需要用复杂的电路来保证,所以单片机很少采用这种通信方式。

1.3 串行通信的数据传送方向

        串行通信根据数据的传送方向可分为三种方式:单工方式、半双工方式和全双工方式。这三种传送方式如图5所示。
51单片机——串行通信1 概述2 串行通信口的结构与原理3 串行通信口的控制寄存器4 四种工作方式与波特率的设置

图5 数据传送方式 

        ① 单工方式。在这种方式下,数据只能向一个方向传送。单工方式如图5(a)所示,数据只能由发送端传输给接收端。

        ② 半双工方式。在这种方式下,数据可以双向传送,但同一时间内,只能向一个方向传送,只有一个方向的数据传送完成后,才能往另一个方向传送数据。半双工方式如图5(b)所示,通信的双方都有发送器和接收器,一方发送时,另一方接收,由于只有一条数据线,所以双方不能在发送的同时进行接收。

        ③ 全双工方式。在这种方式下,数据可以双向传送,通信的双方都有发送器和接收器,由于有两条数据线,所以双方在发送数据的同时可以接收数据。全双工方式如图5(c)所示。

2 串行通信口的结构与原理

        单片机通过串行通信口可以与其他设备进行数据通信,将数据传送给外部设备或接受外部设备传送来的数据,从而实现更强大的功能。

2.1 串行通信口的结构

        51单片机的串行通信口的结构如图6所示。
51单片机——串行通信1 概述2 串行通信口的结构与原理3 串行通信口的控制寄存器4 四种工作方式与波特率的设置

 图6 串行通信口的结构

        与串行通信口有关的部件主要有:

        ① 两个数据缓冲器SBUF。

        SBUF是可以直接寻址的特殊功能寄存器(SFR),它包括发送SBUF和接收SBUF,发送SBUF用来发送串行数据,接收SBUF用来接收数据,两者共用一个地址(99H)。在发送数据时,该地址指向发送SBUF;而在接收数据时,该地址指向接收SBUF。

        ② 输入移位寄存器。

        在接收控制器的控制下,将输入的数据逐位移入接收SBUF。

        ③ 串行控制寄存器 SCON。

        SCON 的功能是控制串行通信口的工作方式,并反映串行通信口的工作状态。

        ④ 定时器T1。

        T1用作波特率发生器,用来产生接收和发送数据所需的移位脉冲,移位脉冲的频率越高,接收和传送数据的速率越快。

2.2 串行通信口的工作原理

        串行通信口有接收数据和发送数据两个工作过程,下面以图6所示的串行通信口结构为例来说明这两个工作过程。

2.2.1 接收数据过程

        在接收数据时,若RXD端(与P3.2引脚共用)接收到一帧数据的起始信号(低电平),SCON寄存器马上向接收控制器发出允许接收信号,接收控制器在定时器/计数器T1产生的移位脉冲信号控制下,控制输入移位寄存器,将 RXD 端输入的数据由低到高逐位移入输入移位寄存器中,数据全部移入输入移位寄存器后,移位寄存器再将全部数据送入接收 SBUF中,同时接收控制器通过或门向CPU发出中断请求,CPU马上响应中断,将接收SBUF中的数据全部取走,从而完成了一帧数据的接收。后面各帧的数据接收过程与上述相同。

 2.2.2 发送数据过程

        相对于接收过程来说,串行通信口发送数据的过程较简单。当CPU要发送数据时,只要将数据直接写入发送SBUF中,就启动了发送过程。在发送控制器的控制下,发送门打开,先发送一位起始信号(低电平),然后依次由低到高逐位发送数据,数据发送完毕,最后发送一位停止位(高电平),从而结束一帧数据的发送。一帧数据发送完成后,发送控制器通过或门向CPU发出中断请求,CPU响应中断,将下一帧数据送入SBUF,开始发送下一帧数据。

3 串行通信口的控制寄存器

        串行通信口的工作受串行控制寄存器SCON和电源控制寄存器PCON的控制。

3.1 串行控制寄存器(SCON)

        SCON 寄存器用来控制串行通信的工作方式及反映串行通信口的一些工作状态。SCON寄存器是一个8位寄存器,它的地址为98H,其中每位都可以位寻址。SCON寄存器各位的名称和地址如下。
51单片机——串行通信1 概述2 串行通信口的结构与原理3 串行通信口的控制寄存器4 四种工作方式与波特率的设置

        ① SM0、SM1位:串行通信口工作方式设置位。

        通过设置这两位的值,可以让串行通信口工作在四种不同的方式,具体见表1,这几种工作方式在后面将会详细介绍。

表1 串行通信口工作方式设置位及其功能

51单片机——串行通信1 概述2 串行通信口的结构与原理3 串行通信口的控制寄存器4 四种工作方式与波特率的设置

        ② SM2位:用来设置主-从式多机通信。

        当一个单片机(主机)要与其他几个单片机(从机)通信时,就要对这些位进行设置。当SM2=1时,允许多机通信;当SM2=0时,不允许多机通信。

        ③ REN位:允许/禁止数据接收的控制位。

        当REN=1时,允许串行通信口接收数据;当REN=0时,禁止串行通信口接收数据。

        ④ TB8位:方式2、3中发送数据的第9位。

        该位可以用软件规定其作用,可用作奇偶校验位,或在多机通信时,用作地址帧或数据帧的标志位,在方式0和方式1中,该位不用。

        ⑤ RB8位:方式2、3中接收数据的第9位。

        该位可以用软件规定其作用,可用作奇偶校验位,或在多机通信时,用作地址帧或数据帧的标志位,在方式1中,若SM2=0,则RB8是接收到的停止位。

        ⑥ TI位:发送中断标志位。

        当串行通信口工作在方式0时,发送完8位数据后,该位自动置“1”(即硬件置“1”),向CPU发出中断请求,在CPU响应中断后,必须用软件清0;在其他几种工作方式中,该位在停止位开始发送前自动置“1”,向CPU发出中断请求,在CPU响应中断后,也必须用软件清0,以准备开始发送下一帧数据。

        ⑦ RI位:接收中断标志位。

        当串行通信口工作在方式0时,接收完8位数据后,该位自动置“1”,向CPU发出接收中断请求,在CPU响应中断后,必须用软件清0;在其他几种工作方式中,该位在接收到停止位期间自动置“1”,向CPU发出中断请求,在CPU响应中断取走数据后,必须用软件对该位清0,以准备开始接收下一帧数据。在上电复位时,SCON各位均为“0”。

3.2 电源控制寄存器(PCON)

        PCON寄存器是一个8位寄存器,它的字节地址为87H,不可位寻址,并且只有最高位SMOD与串行通信口控制有关。PCON寄存器各位的名称和字节地址如下。
51单片机——串行通信1 概述2 串行通信口的结构与原理3 串行通信口的控制寄存器4 四种工作方式与波特率的设置

        SMOD位:波特率设置位。

        在串行通信口工作在方式1~3时起作用。若SMOD=0,波特率不变;当SMOD=1时,波特率加倍。在上电复位时,SMOD=0。

4 四种工作方式与波特率的设置

        串行通信口有四种工作方式,工作在何种方式受SCON寄存器的控制。在串行通信时,要改变数据传送速率(波特率),可对波特率进行设置。

4.1 方式0

        当SCON寄存器中的SM0=0、SM1=0时,串行通信口工作在方式0。

        方式0称为同步移位寄存器输入/输出方式,常用于扩展I/O端口。在单片机发送或接收串行数据时,通过RXD端发送数据或接收数据,而通过TXD端送出数据传输所需的移位脉冲。

        在方式0时,串行通信口又分两种工作情况:发送数据和接收数据。

4.1.1 方式0-发送数据

        当串行通信口工作在方式0时,若要发送数据,通常在外部接8位串/并转换移位寄存器74LS164,具体连接电路如图7所示。其中RXD端用来输出串行数据,TXD端用来输出移位脉冲,P1.0端用来对74LS164进行清0。
51单片机——串行通信1 概述2 串行通信口的结构与原理3 串行通信口的控制寄存器4 四种工作方式与波特率的设置

 图7 串行通信在方式0时的数据发送电路

        在单片机发送数据前,先从P1.0引脚发出一个清0信号(低电平)到74LS164的CLR引脚,对其进行清0,让D7~D0全部为“0”,然后单片机在内部执行写SBUF指令,开始从RXD端(P3.0引脚)送出8位数据,与此同时,单片机的TXD端输出移位脉冲到74LS164的CLK引脚,在移位脉冲的控制下,74LS164接收单片机RXD端送到的8位数据(先低位后高位),数据发送完毕,在74LS164的D7~D0端输出8位数据。另外,在数据发送结束后,SCON寄存器的发送中断标志位TI自动置“1”。

4.1.2 方式0-接收数据

        当串行通信口工作在方式0时,若要接收数据,一般在外部接8位并/串转换移位寄存器74LS165,具体连接电路如图8 所示。在这种方式时,RXD端用来接收输入的串行数据,TXD端用来输出移位脉冲,P1.0端用来对74LS165的数据进行锁存。
51单片机——串行通信1 概述2 串行通信口的结构与原理3 串行通信口的控制寄存器4 四种工作方式与波特率的设置

 图8 串行通信口在方式0时的数据接收电路

        在单片机接收数据前,先从 P1.0 引脚发出一个低电平信号到74LS165 的

51单片机——串行通信1 概述2 串行通信口的结构与原理3 串行通信口的控制寄存器4 四种工作方式与波特率的设置

引脚,让74LS165锁存由D7~D0端输入的8位数据,然后单片机内部执行读SBUF指令,与此同时,单片机的TXD端送移位脉冲到74LS165的CLK1引脚,在移位脉冲的控制下,74LS165中的数据逐位从RXD端送入单片机,单片机接收数据完毕,SCON寄存器的接收中断标志位RI自动置“1”。

        在方式0中,串行通信口发送和接收数据的波特率都是fosc/12。

4.2 方式1

        当SCON寄存器中的SM0=0、SM1=1时,串行通信口工作在方式1。

        在方式1时,串行通信口可以发送和接收每帧10位的串行数据。其中TXD端用来发送数据,RXD端用来接收数据。

        在方式1中,一帧数据中有10位,包括1位起始位(低电平)、8位数据位(低位在前)和1位停止位(高电平)。在方式1时,串行通信口又分两种工作情况:发送数据和接收数据。

4.2.1 方式1-发送数据

        在发送数据时,若执行写SBUF指令,发送控制器在移位脉冲(由定时器/计数器T1产生的信号再经16或32分频而得到)的控制下,先从TXD端送出一个起始位(低电平),然后再逐位将8位数据从 TXD 端送出,当最后一位数据发送完成,发送控制器马上将SCON的TI位置“1”,向CPU发出中断请求,同时从TXD端输出停止位(高电平)。

4.2.2 方式1-接收数据

        在方式1时,需要设置SCON中的REN=1,串行通信口才允许接收数据。由于不知道外部设备何时会发送数据,所以串行通信口会不断检测RXD端,当检测到RXD端有负跳变(由“1”变为“0”)时,说明外部设备发来了数据的起始位,于是启动RXD端接收,将输入的8位数据逐位移入内部的输入移位寄存器。8位数据全部进入输入移位寄存器后,如果满足RI位为“0”、SM2位为“0”(若SM2不为“0”,但接收到的数据停止位为“1”也可以)的条件,输入移位寄存器中的8位数据才可以放入SBUF,停止位的“1”才能送入SCON的RB8位中,RI位就会被置“1”,向CPU发出中断请求,让CPU取走SBUF中的数据,如果条件不满足,输入移位寄存器中的数据将无法送入SBUF而丢弃,重新等待接收新的数据。

4.3 方式2

        当SCON寄存器中的SM0=1、SM1=0时,串行通信口工作在方式2。

        在方式2时,串行通信口可以发送和接收每帧11位的串行数据,其中1位起始位、8位数据位、1位可编程位和1位停止位。TXD端用来发送数据,RXD端用来接收数据。

        在方式2时,串行通信口又分两种工作情况:发送数据和接收数据。

4.3.1 方式2-发送数据

        在方式2时,发送的一帧数据有11位,其中有9位数据,第9位数据取自SCON中的TB8位。在发送数据前,先用软件设置TB8位的值,然后执行写SBUF指令(如MOV SBUF,A),发送控制器在内部移位脉冲的控制下,从TXD端送出一个起始位(低电平),然后逐位送出8位数据,再从TB8位中取出第9位并送出,当最后一位数据发送完成,发送控制器马上将SCON的TI位置“1”,向CPU发出中断请求,同时从TXD端输出停止位(高电平)。

4.3.2 方式2-接收数据

        在方式2时,同样需设置SCON的REN=1,串行通信口才允许接收数据,然后不断检测RXD端是否有负跳变(由“1”变为“0”),若有,说明外部设备发来了数据的起始位,于是启动RXD端接收数据。当8位数据全部进入输入移位寄存器后,如果RI位为“0”、SM2位为“0”(若SM2不为“0”,但接收到的第9位数据为“1”也可以),输入移位寄存器中的8位数据才可以送入SBUF,第9位会放进SCON的RB8位,同时RI位置“1”,向CPU发出中断请求,让CPU取走SBUF中的数据,否则输入移位寄存器中的数据将无法送入SBUF而丢弃。

4.4 方式3

        当SCON中的SM0=1、SM1=1时,串行通信口工作在方式3。方式3与方式2一样,传送的一帧数据都为11位,工作原理也相同,两者的区别仅在于波特率不同,方式2的波特率固定为fosc/64或fosc/32,而方式3的波特率则可以设置。

4.5 波特率的设置

        在串行通信中,为了保证数据的发送和接收成功,要求发送方发送数据的速率与接收方接收数据的速率相同,而将双方的波特率设置相同就可以达到这个要求。在串行通信的四种方式中,方式0的波特率是固定的,而方式1~方式3的波特率则是可变的。波特率是数据传送的速率,它用每秒传送的二进制数的位数来表示,单位符号是bit/s。

4.5.1 方式0的波特率

        方式0的波特率固定为时钟振荡频率的1/12,即方式0的波特率 = fosc/12

4.5.2 方式2的波特率

        方式2的波特率由PCON寄存器中的SMOD位决定。

        当SMOD = 0时,方式2的波特率为时钟振荡频率的1/64;

        当SMOD = 1时,方式2的波特率加倍,为时钟振荡频率的1/32,即

方式2的波特率 =

51单片机——串行通信1 概述2 串行通信口的结构与原理3 串行通信口的控制寄存器4 四种工作方式与波特率的设置

4.5.3 方式1和方式3的波特率

        方式1和方式3的波特率除了与SMOD位有关,还与定时器/计数器T1的溢出率有关。方式1和方式3的波特率可用下式计算:

方式1、3的波特率 = T1的溢出率·

51单片机——串行通信1 概述2 串行通信口的结构与原理3 串行通信口的控制寄存器4 四种工作方式与波特率的设置

/32

        T1的溢出率是指定时器/计数器T1在单位时间内计数产生的溢出次数,也即溢出脉冲的频率。

        在将定时器/计数器T0设作工作方式3时,T1可以工作在方式0、方式1或方式2三种方式下。

        当T1工作于方式0时,它对脉冲信号(由时钟信号fosc经12分频得到)进行计数,计到

51单片机——串行通信1 概述2 串行通信口的结构与原理3 串行通信口的控制寄存器4 四种工作方式与波特率的设置

时会产生一个溢出脉冲到串行通信口作为移位脉冲;

        当T1工作于方式1和2时,则分别要计到

51单片机——串行通信1 概述2 串行通信口的结构与原理3 串行通信口的控制寄存器4 四种工作方式与波特率的设置
51单片机——串行通信1 概述2 串行通信口的结构与原理3 串行通信口的控制寄存器4 四种工作方式与波特率的设置

−X(X为T1的初值,可以设定)才产生溢出脉冲。

        如果要提高串行通信口的波特率,可让T1工作在方式2,因为该方式计数时间短,溢出脉冲频率高,并且能通过设置T1的初值来调节计数时间,从而改变T1产生的溢出脉冲的频率(又称T1的溢出率)。

        当T1工作在方式2时,T1两次溢出的时间间隔,也即T1的溢出周期为

T1的溢出周期 = (

51单片机——串行通信1 概述2 串行通信口的结构与原理3 串行通信口的控制寄存器4 四种工作方式与波特率的设置

− X)·12/ fosc

        T1的溢出率为溢出周期的倒数,即

T1的溢出率 = fosc/[12·(

51单片机——串行通信1 概述2 串行通信口的结构与原理3 串行通信口的控制寄存器4 四种工作方式与波特率的设置

− X)]

        故当T1工作在方式2时,串行通信口工作方式1、3的波特率为

        方式1、3的波特率 = (

51单片机——串行通信1 概述2 串行通信口的结构与原理3 串行通信口的控制寄存器4 四种工作方式与波特率的设置
/32)·fosc/[12·(
51单片机——串行通信1 概述2 串行通信口的结构与原理3 串行通信口的控制寄存器4 四种工作方式与波特率的设置

− X)] 

        由上式可推导出T1在方式2时,其初值X为

X =

51单片机——串行通信1 概述2 串行通信口的结构与原理3 串行通信口的控制寄存器4 四种工作方式与波特率的设置
− (
51单片机——串行通信1 概述2 串行通信口的结构与原理3 串行通信口的控制寄存器4 四种工作方式与波特率的设置

·fosc)/(384·波特率)

        举例:单片机的时钟频率fosc=11.0592MHz,现要让串行通信的波特率为2400bit/s,可将串行通信口的工作方式设为1、T1的方式设为2,并求出T1应设的初值。

        求T1初值的过程如下。

        先进行寄存器设置:为了让波特率不倍增,将 PCON 寄存器中的数据设为00H,这样SMOD位就为“0”;设置TMOD寄存器中的数据为20H,这样T1就工作在方式2。再计算并设置T1的初值:

X =

51单片机——串行通信1 概述2 串行通信口的结构与原理3 串行通信口的控制寄存器4 四种工作方式与波特率的设置
51单片机——串行通信1 概述2 串行通信口的结构与原理3 串行通信口的控制寄存器4 四种工作方式与波特率的设置
·fosc/384·波特率 = 256 −(
51单片机——串行通信1 概述2 串行通信口的结构与原理3 串行通信口的控制寄存器4 四种工作方式与波特率的设置
× 11.0592 ×
51单片机——串行通信1 概述2 串行通信口的结构与原理3 串行通信口的控制寄存器4 四种工作方式与波特率的设置

)/(384 × 2400)= 244

        十进制数244转换成十六进制数为F4H,将T1的初值设为F4H。

        由于设置波特率和初值需要计算,比较麻烦,一般情况下可查表来进行设置。常见的波特率设置见表2。

表2 常用的波特率设置

51单片机——串行通信1 概述2 串行通信口的结构与原理3 串行通信口的控制寄存器4 四种工作方式与波特率的设置

继续阅读