—— 《To the Moon》
目录
前言
在上一篇文章中学习如何用数码管显示秒表和时钟,接下来学习串口通信。
一、通信的基本概念
51单片机不仅可以实现串口通信,还可以通过IO口模拟实现多种其他通信,比如 SPI,IIC等,学习这些通信前,我们很有必要了解下通信的基本概念。通信的方式可以分为多种,按照数据传输方式可分为串行通信和并行通信。按照通信的数据同步方式,可分为异同通信和同步通信。按照数据的传输方向又可分为单工,半双工和全双工通信。
二、串行通信和并行通信
2.1 串行通信
串行通信是指使用一条数据线,将数据一位一位地依次传输,每一位数据占据一个固定的时间长度。其只需要少数几条线就可以在系统间交换信息,特别适用于计算机与计算机,计算机与外设之间的远距离通信,先传输低位在传输高位。如下图所示:
串行通信的特点:传输线少,长距离传送时成本低,且可以利用电话网等现成的设备,但数据的传送控制比并行通信复杂。
2.2 并行通信
并行通信通常是将数据字节的各位用多条数据线同时进行传送,通常是8位,16位,32位等数据一起传输。如下图所示:
并行通信的特点:控制简单,传输速度快;由于传输线较多,长距离传送时成本高且接收方的各位同时接受存在困难,抗干扰能力差。
三、异步通信与同步通信
3.1 异步通信
异步通信是指通信的发送与接受设备适用各自的时钟控制数据的发送和接收过程。为使双方的收发协调,要求发送和接收设备的时钟尽可能一致。
异步通信是以字符(构成的帧)为单位进行传输,字符与字符之间的间隙(时间间隔)是任意的,但每个字符中的各位是以固定的时间传送的,即字符之间不一定有“位间隔”的整数倍的关系,但同一字符的各位之间的距离均为“位间隔”的整数倍。如下图所示:
异步通信的特点:不要求收发双方时钟的严格一致,实现容易,设备开销较小,但每个字符要附加2~3位用于起止位,各帧之间还有间隔,因此传输效率不高。
3.2 同步通信
同步通信时要建立发送方时钟对接收方时钟的直接控制,使双方达到完全同步。此时,传输数据的位之间的距离均为“位间隔”的整数倍,同时传送的字符间不留间隙,即保持位同步关系,也保持字符同步关系。发送方对接收方的同步可以通过两种方法实现。如下图所示:
四、单工,半双工与全双工通信
4.1 单工通信
![](https://i-blog.csdnimg.cn/blog_migrate/973af1a3ebdf29c7cd623705c3a25f00.png)
4.2 半双工通信
![](https://i-blog.csdnimg.cn/blog_migrate/190eac996d1a82f286f1750812450f4d.png)
4.3 全双工通信
![](https://i-blog.csdnimg.cn/blog_migrate/9e94a85ba0d3a1ac5c604610c604e3cd.png)
五、通信速率
衡量通信性能的一个非常重要的参数就是通信速率,通常以比特率(Bitrate)来表示。比特率是每秒钟传输二进制代码的位数,单位是:位/秒(bps).如每秒钟传送240个字符,而每个字符格式包含10位(1个起始位,1个停止位,8个数据位)这时的比特率为:10位×240个/秒=2400 bps。
后面会一段一个“‘波特率’”的概念,它表示每秒传输了多少个码元。而码元是通信信号调制的概念,通信常用时间间隔相同的符号来表示一个二进制数字,这样的信号成为码元。如常见的通信传输中,用 0V 表示数字 0, 5V 表述数字 1 ,那么一个码元可以表示两种状态 0 和 1,所以一个码元等于一个二进制比特位,此时波特率的大小与比特率一致;如果在通信传输中,有 0V,2V,4V 以及 6V分别表示二进制数 00,01,10,11 那么每个码元可以表示四种状态,即两个二进制比特位,所以码元数是二进制比特位数的一半,这个时候的波特率为比特率的一半 。由于很多常见的通信中一个码元都是表示两种状态,所以我们常常直接以波特率来表示比特率。
六、单片机串口通信介绍
6.1 串口通信简介
串口通信,是指外设和计算机间通过数据信号线,地线等按位进行传输数据的一种通信方式,属于串行通信方式。串口是一种接口标准,它规定了接口的电器标准,没有规定接口插件电缆以及使用的协议。
6.1.1 接口标准
串口通信的接口标准有甚多,有RS-232C、 RS-232、 RS-422A、 RS-485 等。 常用的是 RS-232 和 RS-485。RS-232 其实是 RS-232C 的改进,原理是一样的。 这里我们就以 RS-232C 接口进行讲解。
RS-232C 是 EIA(美国电子工业协会)1969 年修订 RS-232C 标准。RS-232C 定义了数据终端设备(DTE)与数据通信设备(DCE)之间的物理接口标准。
RS-232C 接口规定使用 25 针连接器,简称 DB25,连接器的尺寸及每个插 针的排列位置都有明确的定义,如下图所示:
RS-232C 还有一种 9 针的非标准连接器接口,简称 DB9。串口通信使用的大 多都是 DB9 接口。DB25 和 DB9 接头有公头和母头之分,其中带针状的接头是 公头,而带孔状的接头是母头。9 针串口线的外观图如下图所示:
从上图中可以看到公头和母头的管脚定义顺序是不一样,这一点需要特别注 意。这些管脚都有什么作用呢? 9 针串口和 25 针串口常用管脚的功能说明如 下图所示: 注括号意思是DB9的管脚,没有带括号的DB25的管脚,我们通常用DB9,直接看DB9就可以。
在串口通信中,通常我们只使用 2、3、5 三个管脚,即 TXD、RXD、SGND, 其他管脚功能大家看不明白也没关系。
RS-232C 对逻辑电平也做了规定,如下:
在 TXD 和 RXD 数据线上:
- 逻辑 1 为-3~-15V 的电压
- 逻辑 0 为 3~15V 的电压
在 RTS、CTS、DSR、DTR 和 DCD 等控制线上:
- 信号有效( ON 状态) 为 3~15V 的电压
- 信号无效( OFF 状态) 为-3~-15V 的电压
由此可见,RS-232C 是用正负电压来表示逻辑状态,与晶体管-晶体管逻辑集 成电路(TTL)以高低电平表示逻辑状态的规定正好相反。而我们 51 单片机使用 的就是 TTL 电平,所以要实现 51 单片机与计算机的串口通信,需要进行 TTL 与 RS-232C 电平转换,通常使用的电平转换芯片是 MAX232。
在串口通信中通常 PC 机的 DB9 为公头,单片机上使用的串口 DB9 为母头, 通过一根直通串口线进行相连。在 9 针串口线实物图即为直通型串口线,串口线 (COM)母头连接计算机 DB9 的公头,串口线公头连接单片机上使用的 DB9 母 头,这样就是将 2、3、5 管脚直接相连。如果你要实现两台计算机串口通信, 那么就需要一根交叉串口线,将 2 对 3、3 对 2、5 对 5 连接,交叉串口线一 般两头都是母头。
串口通信中还需要注意的是,串口数据收发线要交叉连接,计算机的 TXD 要对应单片机的 RXD,计算机的 RXD 要对应单片机的 TXD,并且共 GND,如下图:
有的朋友就会问了,在计算机与单片机进行串口通信时,使用的不是直通线 吗,这时候怎么让 TXD 与 RXD 交叉连接?前面我们说了单片机处理的是 TTL 电平,需要使用 RS232 电平转换芯片,将 RS232 电平转换芯片串行数据输出管 脚交叉连接在 DB9 母头上即可,本章后面硬件设计部分会介绍。
6.1.2 通信协议
RS232的通信协议比较简单,通常遵循 96-N-8-1 格式。
“96”表示的是通信波特率为9600。串口通信中通常适用的是异步串口通信,即没有时钟线,所以两个设备要通信,必须要保持一直的波特率,当然,比特率常用值还有4800 115200 等。
“N”表示的是无校验位,由于串口通信相对更容易受到外部干扰导致传输数据出现偏差,可以在传输过程加上校验位来解决这个问题。校验方法有奇校验 (odd)、偶校验(even)、0 校验(space)、1 校验(mark)以及无校验(noparity)。 具体的介绍,大家可以百度串口通信了解。
“8”表示的是数据位数为 8 位,其数据格式在前面介绍异步通信中已讲过。当然数据位数还可以为 5、6、7 位长度。
“1”表示的是 1 位停止位,串口通讯的一个数据包从起始信号开始,直到停止信号结束。数据包的起始信号由一个逻辑 0 的数据位表示,而数据包的停 止信号可由 0.5、1、1.5 或 2 个逻辑 1 的数据位表示,只要双方约定一致即可。
6.1.3 串口内部结构
6.2 串口相关寄存器
6.2.1 串口控制寄存器SCON
位 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
字节地:98H | SMO | SM1 | SM2 | REN | TB8 | RB8 | TI | RI |
SMO 和 SM1 为工作方式选择位:
SMO | SM1 | 方式 | 说明 | 波特率 |
0 | 0 | 0 | 移位寄存器 | fose/12 |
0 | 1 | 1 | 10位异步收发器(8位数据) | 可变 |
1 | 0 | 2 | 11位异步收发器(9位数据) | fose/64或fose/32 |
1 | 1 | 3 | 11位异步收发器(9位数据) | 可变 |
- SM2:多机通信控制位,主要用于方式 2 和方式 3。当 SM2=1 时可以利用收到 的 RB8 来控制是否激活 RI(RB8=0 时不激活 RI,收到的信息丢弃;RB8=1 时收 到的数据进入 SBUF,并激活 RI,进而在中断服务中将数据从 SBUF 读走)。当 SM2=0 时,不论收到的 RB8 为 0 和 1,均可以使收到的数据进入 SBUF,并激活 RI (即此时 RB8 不具有控制 RI 激活的功能)。通过控制 SM2,可以实现多机通信。
- REN:允许串行接收位。由软件置 REN=1,则启动串行口接收数据;若软件置REN=0,则禁止接收。
- TB8:在方式 2 或方式 3 中,是发送数据的第 9 位,可以用软件规定其作用。 可以用作数据的奇偶校验位,或在多机通信中,作为地址帧/数据帧的标志位。 在方式 0 和方式 1 中,该位未用到。
- RB8:在方式 2 或方式 3 中,是接收到数据的第 9 位,作为奇偶校验位或地 址帧/数据帧的标志位。在方式 1 时,若 SM2=0,则 RB8 是接收到的停止位。
- TI:发送中断标志位。在方式 0 时,当串行发送第 8 位数据结束时,或在其 它方式,串行发送停止位的开始时,由内部硬件使 TI 置 1,向 CPU 发中断申请。 在中断服务程序中,必须用软件将其清 0,取消此中断申请。
- RI:接收中断标志位。在方式 0 时,当串行接收第 8 位数据结束时,或在其 它方式,串行接收停止位的中间时,由内部硬件使 RI 置 1,向 CPU 发中断申请。 也必须在中断服务程序中,用软件将其清 0,取消此中断申请。
6.2.2 电源控制寄存器PC0N
位 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
字节地:97H | SMOD |
SMOD:波特率倍增位。在串口方式 1、方式 2、方式 3 时,波特率与 SMOD 有关,当 SMOD=1 时,波特率提高一倍。复位时,SMOD=0。
6.2.3 串行口数据缓冲寄存器SBUF
STC89xx系列单片机的串行口缓冲寄存器(SBUF)的地址是99H,实际是2个缓冲器,写SBUF的操作完成待发送数据的加载,读SBUF的操作可获得已接收到的数据。两个操作分别对应两个不同的寄存器,1个是只写寄存器,1个是只读寄存器。
串行通道内设有数据寄存器。在所有的串行通信方式中,在写入SBUF信号的控制下,把数据装入相同的9位移位寄存器,前面8位为数据字节,其最低位为移位寄存器的输出位。根据
不同的工作方式会自动将“1”或TB8的值装入移位寄存器的第9位,并进行发送。串行通道的接收寄存器是一个输入移位寄存器。在方式0时它的字长为8位,其他方式时为9位。当一帧接收完毕,移位寄存器中的数据字节装入串行数据缓冲器SBUF中,其第9位则装入SCON寄存器中的RB8位。如果由于SM2使得已接收到的数据无效时,RB8和SBUF中内容不变。
由于接收通道内设有输入移位寄存器和SBUF缓冲器,从而能使一帧接收完将数据由移位寄存器装入SBUF后,可立即开始接收下一帧信息,主机应在该帧接收结束前从SBUF缓冲器中将数据取走,否则前一帧数据将丢失。SBUF以并行方式送往内部数据总线。
6.3 串口的工作方式
6.3.1 方式0
方式 0 时,串行口为同步移位寄存器的输入输出方式。主要用于扩展并行输入或输出口。数据由RXD(P3.0)引脚输入或输出,同步移位脉冲由TXD(P3.1)引脚输出。发送和接收均为8位数据,低位在先,高位在后。波特率固定为fosc/12.对应的输入输出时序图如下所示:
6.3.2 方式1
方式1是10位数据的异步通信口,TXD为数据发送引脚,RXD为数据接收引脚,传送一帧数据的格式如下所示。其中1位起始位,8位数据位,1位停止位。
对应输入输出的时序图如下所示:
用软件置REN为1时,接收器以所选择波特率的16倍速采样RXD引脚电平,检测到RXD引脚输入电平发生负跳变时,则说明起始位有效,将其移入输入移位寄存器,并开始接收这一帧信息的其余位。接收过程中,数据从输入移位寄存器右边移入,起始位移位寄存器最左边时,控制电路进行最后一次移位。当RI=0,且SM2=0(或接收到的停止位1)时,将接收到的9位数据的前8位数据装入接收SBUF,第9位(停止位)进入RB8,并置RI=1,向CPU请求中断。
6.3.3 方式2和方式3
方式2或方式3时为11为数据的异步通信口,TXD为数据发送引脚,RXD为数据接收引脚。其数据局格式如下:
对应的输入输出时序图如下所示:
发送开始时,先把起始位0输出到TXD引脚,然后发送 移位寄存器的输出位(D0)到TXD引脚。每一个移位脉冲都使输出移位寄存器的各位右移一位,并由TXD引脚输出。第一次移位时,停止位“1”移入输出寄存器的第9位上,以后每次移位,左边都移入0。当停止位移至输出位时,左边其余位全为0,检测电路检测到这一条时,使控制电路进行最后一次移位,并置 TI=1,向CPU请求中断。
接收时,数据从右边移入输入移位寄存器,在起始位 0 移到最左边时,控制电路进行最后一次移位。当 RI=0,且 SM2=0(或接收到的第9位数据位1)时,接收到的数据装入接收缓存器 SBUF和 RB8(接收数据的第9位),置 RI=1,向CPU请求中断。如果条件不满足,则数据丢失,且不置位RI,继续搜索 RXD 引脚的负跳变。
6.4 波特率的计算
在串行通信中,收发双方对发送或接收数据的速率要有约定。通过软件可对单片机串行口编程为四种工作方式,其中方式0和方式2的波特率是固定的,而方式1和方式3的波特率是可变的,
由定时器T1的溢出率来决定
串行口的四种工作方式对应三种波特率。由于输入的移位时钟的来源不同,所以,各种方式的波特率计算公式也不相同。
- 方式0的波特率 = fosc/12
- 方式2的波特率 =(2SMOD/64)· fosc
- 方式1的波特率 =(2SMOD/32)·(T1溢出率)
- 方式3的波特率 =(2SMOD/32)·(T1溢出率)
6.5 串口如何使用
串行口工作之前,应对其进行初始化,主要是设置产生波特率的定时器1、串行口控制和中断系统。具体步骤:
- 确定T1(定时器1)的工作方式——编辑TMOD寄存器
- 计算T1(定时器1)的初值,装载TH1,TL1
- 启动T1——SETB TR1
- 确定串行口控制——编辑SCON
- 如果使用中断,需开启串口中断控制位(IE 寄存器)
编写波特率为2400位/秒(11.03MHZ),工作方式二 的串口启动,代码如下:
MOV TMOD ,#20H
MOV TH1,#070H
MOV TL1,#070H
MOV PCON,#00H
MOV SCON,#10000000B
SETB TR1
七、 串行通信的秒表设计
7.1 实验内容
通过单片机双机串行通信,在秒表实验的基础上实现基于串行通信的秒表设计。单片机上电后,甲机单片机定时,把秒数(0-**-*-99S)发送给乙机,乙机把接收到的秒数在数码管上显示,甲机和乙机的串行接口以查询的方式工作,工作方式均设为工作方式2,这样串行通信的波特率可以使用单片机内部的时钟。
7.2 实验分析
串行通信的秒表设计,由甲机进行计时,将秒数传输给乙机;乙机接收秒数,并对秒数进行处理,然后由数码管进行显示。甲机需要用到定时器0——负责定时,和定时器1——设置波特率。
乙机需要用到定时器1——设置波特率。
为确保通信成功,通信双方必须在软件上有系列的约定通常称为软件通信“协议”。现举
例简介双机异步通信软件“协议”如下:通信双方均选用2400波特的传输速率。
甲机和乙机的串行接口以查询的方式工作,甲机——查询是否发送成功,JNB TI;乙机——查询是否接收成功,JNB RI。
秒表是实现可以参考上一篇文章中的秒表显示。
7.3 代码实现
甲机传输,代码如下:
ORG 0000H
AJMP MAIN
ORG 000BH
AJMP T_0
ORG 0030H
MAIN:
MOV TMOD ,#21H
MOV TH0,#03CH
MOV TL0,#0B0H
MOV PCON,#00H
MOV SCON,#10000000B
MOV TH1,#070H
MOV TL1,#070H ;2400
SETB EA
SETB ET0
SETB TR0
SETB TR1
MOV R6,#0
STAR:
NOP
SJMP STAR
T_0:
MOV TH0,#03CH
MOV TL0,#0B0H
INC R4
CJNE R4,#20,QUIT
MOV R4,#0
INC R6
CJNE R6,#100,QUIT
MOV R6,#0
QUIT:
MOV A,R6
MOV SBUF,A
WAIT:
JNB TI,WAIT
CLR TI
RETI
END
乙机接收,代码如下:
ORG 0000H
AJMP MAIN
ORG 0030H
MAIN:
MOV TMOD ,#20H
MOV TH1,#070H
MOV TL1,#070H
MOV PCON,#00H
MOV SCON,#10010000B
MOV R7,#0
SETB TR1
STAR:ACALL RECIVER
ACALL BTD
ACALL DISP
SJMP STAR
RECIVER:
JNB RI,QUIT
CLR RI
MOV A,SBUF
MOV R7,A
QUIT:RET
BTD:
MOV A,R7
MOV B,#10
DIV AB
MOV 31H,A
MOV 30H,B
RET
DISP:
MOV DPTR,#TABLE
MOV P2,#11100011B
MOV A,30H
MOVC A,@A+DPTR
MOV P0,A
ACALL DELAY
MOV P2,#11100111B
MOV A,31H
MOVC A,@A+DPTR
MOV P0,A
ACALL DELAY
RET
DELAY:MOV R6,#5
LP:MOV R5,#250
DJNZ R5,$
DJNZ R6,LP
RET
ORG 0200H
TABLE:
DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH
END