通信的基本概念
通信的方式可以分为多种:
- 按数据传送方式
- 串行通信
- 并行通信
- 按数据同步方式
- 异步通信
- 同步通信
- 按数据的传输方向
- 单工
- 半双工
- 全双工
串行通信与并行通信
串行通信
串行通信是指使用一条数据线,将数据一位一位地依次传输,每一位数据占据一个固定的时间长度。其只需要少数几条线就可以在系统间交换信息,特别适用于计算机与计算机、计算机与外设之间的远距离通信。如下图所示:
串行通信的特点:传输线少,长距离传送时成本低,且可以利用电话网等现成的设备,但数据的传送控制比并行通信复杂。
并行通信
并行通信通常是将数据字节的各位用多条数据线同时进行传送,通常是 8位、16 位、32 位等数据一起传输。如下图所示:
并行通信的特点:控制简单、传输速度快;由于传输线较多,长距离传送时成本高且接收方的各位同时接收存在困难,抗干扰能力差。
异步通信与同步通信
异步通信
异步通信是指通信的发送与接收设备使用各自的时钟控制数据的发送和接收过程。为使双方的收发协调,要求发送和接收设备的时钟尽可能一致。异步通信是以字符(构成的帧)为单位进行传输,字符与字符之间的间隙(时间间隔)是任意的,但每个字符中的各位是以固定的时间传送的,即字符之间不一定有“位间隔”的整数倍的关系,但同一字符内的各位之间的距离均为“ 位间隔”的整数倍。如下图所示:
异步通信的特点:不要求收发双方时钟的严格一致,实现容易,设备开销较不高。
同步通信
同步通信时要建立发送方时钟对接收方时钟的直接控制,使双方达到完全同步。此时,传输数据的位之间的距离均为“位间隔”的整数倍,同时传送的字符间不留间隙,即保持位同步关系,也保持字符同步关系。发送方对接收方的同步可以通过两种方法实现。如下图所示:
单工、半双工与全双工通信
单工通信
单工是指数据传输仅能沿一个方向,不能实现反向传输。如下图所示:
半双工通信
半双工是指数据传输可以沿两个方向,但需要分时进行。如下图所示:
全双工通信
全双工是指数据可以同时进行双向传输。如下图所示:
通信速率
衡量通信性能的一个非常重要的参数就是通信速率,通常以比特率(Bitrate)来表示。比特率是每秒钟传输二进制代码的位数,单位是:位/秒( bps)。如
每秒钟传送 240 个字符,而每个字符格式包含 10 位(1 个起始位、1 个停止位、8 个数据位),这时的比特率为:
1 | 10位 * 240个/秒 = 2400 bps |
波特率表示每秒钟传输了多少个码元。而码元是通信信号调制的概念,通信中常用时间间隔相同的符号来表示一个二进制数字,这样的信号称为码元。如常见的通信传输中,用 0V 表示数字 0,5V 表示数字 1,那么一个码元可以表示两种状态 0 和 1,所以一个码元等于一个二进制比特位,此时波特率的大小与比特率一致;如果在通信传输中,有 0V、2V、4V 以及 6V 分别表示二进制数 00、 01、 10、 11,那么每个码元可以表示四种状态,即两个二进制比特位,所以码元数是二进制比特位数的一半,这个时候的波特率为比特率的一半。由于很多常见的通信中一个码元都是表示两种状态,所以我们常常直接以波特率来表示比特率。
单片机窗口介绍
串口通信简介
串口通信(Serial Communication),是指外设和计算机间通过数据信号线、地线等按位进行传输数据的一种通信方式,属于串行通信方式。串口是一种接口标准,它规定了接口的电气标准,没有规定接口插件电缆以及使用的协议。
接口标准
串口通信的接口标准有很多,有 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 针串口常用管脚的功能说明如下图所示:
在串口通信中,通常我们只使用 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,如下图:
通信协议
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 的数据位表示,只要双方约定一致即可。
串口内部结构
上图中右边的TXD和RXD为单片机IO口,TXD对应的是P3.1管脚,RXD对应的是P3.0管脚。
串口相关寄存器
串口控制寄存器SCON
位 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | |
---|---|---|---|---|---|---|---|---|---|
字节地址:98H | SM0 | SM1 | SM2 | REN | TB8 | RB8 | TI | RI | SCON |
SM0
和SM1
位工作方式选择位:
SM0 | SM1 | 方式 | 说明 | 波特率 |
---|---|---|---|---|
0 | 0 | 0 | 移位寄存器 | fosc/12 |
0 | 1 | 1 | 10位异步收发器(8位数据) | 可变 |
1 | 0 | 2 | 11位异步收发器(9位数据) | fosc/64或fosc/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,取消此中断申请。
电源控制寄存器PCON
位 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | |
---|---|---|---|---|---|---|---|---|---|
字节地址:97H | SMOD | PCON |
SMOD:波特率倍增位。在串口方式1、方式2、方式3时,波特率与SMOD有关,当SMOD=1时,波特率提高一倍。复位时,SMOD=0。
串口工作方式
串口的工作方式由SM0(SCON.7)
和SM1(SCON.6)
控制:
SM0 | SM1 | 方式 | 说明 | 波特率 |
---|---|---|---|---|
0 | 0 | 0 | 移位寄存器 | fosc/12 |
0 | 1 | 1 | 10位异步收发器(8位数据) | 可变 |
1 | 0 | 2 | 11位异步收发器(9位数据) | fosc/64或fosc/32 |
1 | 1 | 3 | 11位异步收发器(9位数据) | 可变 |
方式0
方式0时,串行口为同步移位寄存器的输入输出方式。主要用于扩展并行输入或输出口。数据由RXD(P3.0)引脚输入或输出,同步移位脉冲由TXD(P3.1)引脚输出。发送和接收均为8位数据,低位在先,高位在后。波特率固定为fosc/12。对应的
输入输出时序图如下所示:
- 方式0输出
- 方式0输入
方式1
方式1是10位数据的异步通信口。TXD为数据发送引脚,RXD为数据接收引脚,传送一帧数据的格式如下所示。其中1位起始位,8位数据位,1位停止位。
对应的输入输出时序图如下所示:
- 方式1输出
- 方式1输入
用软件置REN为1时,接收器以所选择波特率的16倍速率采样RXD引脚电平,检测到RXD引脚输入电平发生负跳变时,则说明起始位有效,将其移入输入移位寄存器,并开始接收这一帧信息的其余位。接收过程中,数据从输入移位寄存器右边移入,起始位移至输入移位寄存器最左边时,控制电路进行最后一次移位。当RI=0,且SM2=0(或接收到的停止位为1)时,将接收到的9位数据的前8 位数据装入接收SBUF,第9位(停止位)进入RB8,并置RI=1,向CPU请求中断。
方式2和方式3
方式2或方式3时为11位数据的异步通信口。TXD为数据发送引脚,RXD为数据接收引脚。其数据格式如下所示:
对应的输入输出时序图如下所示:
-
方式2、方式3输出
发送开始时,先把起始位0输出到TXD引脚,然后发送移位寄存器的输出位(D0)到TXD引脚。每一个移位脉冲都使输出移位寄存器的各位右移一位,并由TXD 引脚输出。第一次移位时,停止位“1”移入输出移位寄存器的第9位上,以后每次移位,左边都移入0。当停止位移至输出位时,左边其余位全为0,检测电路检测到这一条件时,使控制电路进行最后一次移位,并置TI=1,向CPU请求中断。 -
方式2、方式3输入
接收时,数据从右边移入输入移位寄存器,在起始位0移到最左边时,控制电路进行最后一次移位。当RI=0,且SM2=0(或接收到的第9位数据为1)时,接收到的数据装入接收缓冲器SBUF和RB8(接收数据的第9位),置RI=1,向CPU 请求中断。如果条件不满足,则数据丢失,且不置位RI,继续搜索RXD引脚的负跳变。
串口的使用方式
如何计算波特率
在学习51单片机串口时,非常重要的一点是学会如何计算波特率。以下列出了几种方式下波特率的计算公式:
- 方式0的波特率 = fosc / 12
- 方式2的波特率 = ( / 64) * fosc
- 方式1的波特率 = ( / 32) * (T1溢出率)
- 方式3的波特率 = ( / 32) * (T1溢出率)
其中T1溢出率 = fosc / {12 * [256 - (TH1)]}
串口初始化步骤
使用串口大致个使用以下几个步骤:
- 确定T1的工作方式(
TMOD
寄存器) - 确定串口工作方式(
SCON
寄存器) - 计算T1的初值(设定波特率),装载
TH1、TL1
- 启动T1(
TCON
中的TR1
位) - 如果使用中断,需开启串口中断控制位(
IE
寄存器)
例如:设置串口为工作方式1、波特率位9600、波特率加倍、使用中断,其配置程序如下:
1 | /******************************************************************************* |
在主函数中调用该函数并传入OXFA值即可,如下:
1 | uart_init(0xFA); // 波特率位9600 |
硬件设计
当前开发板上板载一个USB转TTL模块和一个RS232模块,这两个模块都可进行串口通信。其硬件电路如下所示:
USB转TTL模块
从上图中可以看出,通过CH340芯片把51单片机的串口与 PC 机的USB口进行连接,不仅可以实现程序的烧入,还可实现串口通信功能。根据前面介绍,串口通信需将数据收发管脚交叉连接,所以可以看到在 CH340芯片的2和3脚已做处理。电路中其他部分是自动下载电路部分,目的是控制单片机的电源,无需冷启动。使用USB转串口芯片,免去了一根串口线,使用普通 USB 数据线(支持安卓手机数据线)就可以进行串口通信。
RS232模块
此电路是按照RS232接口标准搭建,使用了一个DB9母头,电平转换芯片使用的是MAX232。如使用该模块进行串口通信,可使用一根USB转RS232线,一端与DB9母头连接,另一头与PC端USB口连接,同时将J39和J44端子的3、4短接,那么RS232模块串口与单片机串口是连接一起的,此时可通过RS232模块下载程序或串口通信。还要注意:RS232接口是不带电源的,因此需要给开发板额外供电。
因为开发板是双核的,即使用了2个单片机,另一个单片机同样需要串口下载,所以在J39和J44端子上也将单片机串口引出,通过使用黄色跳线帽将J39和J44端子的1、2脚短接,此时即可对另一个单片机下载程序和串口通信。
软件设计
本实验要实现的功能时:当串口助手发送数据给单片机,单片机原封不动转发给串口助手显示。
注意:使用黄色跳线帽将CH340旁的J39端子的UTXD和P30R短接,URXD和P31T短接,默认已短接好,如下所示:
1 |
|