计算机与外界的信息交换称为通信。通信的基本方式可分为并行通信和串行通信两种。
并行通信:
并行通信的特点:
- 控制简单、传输速度快
- 由于传输线较多,长距离传送时成本高且接收方的各位同时接收存在困难
串行通信:
串行通信是指 使用一条数据线,将数据一位一位地依次传输,每一位数据占据一个固定的时间长度。其只需要少数几条线就可以在系统间交换信息,特别适用于计算机与计算机、计算机与外设之间的远距离通信。
如下图,我们不需要考虑是怎么依次传送的,这些都交给硬件来实现:
串行通信的特点:
- 传输线少,长距离传送时成本低,
- 数据的传送控制比并行通信复杂。
1.异步通信
异步通信是指通信的发送与接收设备使用各自的时钟控制数据的发送和接收过程。为使双方的收发协调,要求发送和接收设备的时钟尽可能一致。
异步通信是以字符(构成的帧)为单位进行传输,字符与字符之间的时间间隔是任意的,但每个字符中的各位是以固定的时间传送的,即字符之间不一定有“位间隔”的整数倍的关系,但同一字符内的各位之间的距离均为 “位间隔”的整数倍 。
如下图所示:
2.同步通信
同步通信时要建立发送方时钟对接收方时钟的直接控制,使双方达到完全同步。此时,传输数据的位之间的距离均为“位间隔”的整数倍,同时传送的字符间不留间隙,即保持位同步关系,也保持字符同步关系。
串行通信的制式:
单工:单向的(或者是收或者是发)
半双工:(串行通信)收/发不可同时进行
全双工:(串行通信)收/发可同时进行
传输速率:
比特率是每秒钟传输二进制代码的位数,单位是:位/秒(bps)。如每秒钟传送240个字符,而每个字符格式包含10位(1个起始位、1个停止位、8个数据位),这时的比特率为:
10位×240个/秒 = 2400 bps
串行接口的结构:
引脚RXD(P3.0):串行数据接收端。
引脚TXD(P3.1):串行数据发送端。
发送数据过程:
发送数据时,发送时钟的下降沿将数据串行移位输出;
接收数据的过程:
接收数据时,接收时钟的上升沿开始对数据位采样。
串行数据缓冲器SBUF:
有两个物理上独立的接收、发送缓冲器SBUF,它们占用同一地址99H。
串行发送数据时,CPU向SBUF写入数据,此时99H表示发送SBUF;串行接收数据时,CPU从SBUF读出数据,此时99H表示接收SBUF。
发送数据:
SBUF=0x80;
接收数据:
unsigned char c;//char c;
while (!RI); //等待接收数据
RI=0; //需要软件清标志位
c=SBUF; //读取数据
串行控制寄存器SCON:
串行控制寄存器SCON地址98H用于设置串行口的工作方式、监视串行口的工作状态、控制发送与接收的状态等,既可以字节寻址又可以位寻址的8位特殊功能寄存器。
REN: 串行接受允许控制位。该位 由软件置位或复位。当REN=1,允许接收;当REN=0,禁止接收。
TI: 发送中断标志位。TI=1,表示已结束一帧数据发送,可由软件查询TI位标志,也可以向CPU申请中断。
注意:TI在任何工作方式下都必须由软件清0。
RI: 接收中断标志位。RI=1,表示一帧数据接收结束。可由软件查询RI位标志,也可以向CPU申请中断。
注意:RI在任何工作方式下也都必须由软件清0。
SM2(SCON.5): 方式2和方式3的多机通信控制位
- SM2=1时,允许多机通信。根据收到的RB8控制是否激活RI
RB8=1,说明是地址帧,将接收到的数据装入SBUF,并激RI=1,同时向CPU申请中断,在中断服务中将数据从SBUF读走;
RB8=0,说明是数据帧,不激活RI,RI=0,将接收到的前8位数据丢弃。 - SM2=0时,单机发送/接收工作方式,则接收一帧数据后,不论收到的RB8为0和1,均可使接收到的数据装入SBUF,并激活RI=1
SM0和SM1为工作方式选择位,可选择四种工作方式:
电源控制寄存器PCON:
SMOD:在串行口工作方式 1、2、3 中,
是波特率加倍位 (产生高波特率时启用平时不用,比如用11.0592晶振产生57600波特率时就要设置成SMOD=1)
SMOD=1 时,波特率加倍(PCON=0x80;)
SMOD=0 时,波特率不加倍(PCON=0x00;)
(在PCON中只有这一个位与串口有关)
中断允许控制寄存器IE(A8H):
作用:CPU对中断系统所有中断以及某个中断源的开放和屏蔽是由中断允许寄存器IE控制的。
ES,串行口中断允许位;=0 时禁止中断; =1 时允许中断。
波特率的计算:
波特率:数据传输速率,指每秒钟传送二进制位的个数,单位bit/s
波特率越高,串口数据传输速度越快
- 方式0的波特率 = fosc/12
- 方式2的波特率 =(2SMOD/64)· fosc
- 方式1的波特率 =(2SMOD/32)·(T1溢出率)
- 方式3的波特率 =(2SMOD/32)·(T1溢出率)
编程步骤:
串行口工作(收发数据)之前,应进行初始化,主要是设置产生波特率的定时器1、串行口控制和中断控制。
具体步骤如下:
- 设置T1的工作方式(编程TMOD寄存器);
- 计算T1的初值,装载TH1、TL1,(通常选用定时器模式2,自动重装初值定时器比较适用);
- 启动T1(编程TCON中的TR1位);
- 确定串行口控制(编程SCON寄存器,REN= 1使能接收);
- 设置PCON寄存器中的SMOD,确定波特率是否需要倍速。
- 如需串行口在中断方式工作时,要进行中断设置编程IE、IP寄存器。
- 串口中断,一般串口发送均会采用查询模式,串口接收较多采用中断模式,EA=1开全总中断,ES=1开串口中断。AT89C51的串口收发中断共用中断服务程序,因此中断服务函数中需要判断TI与RI的值。
- 向SBUF写入数据启动串口发送,读SBUF可取出接收到的数据。