在电子技术领域,MCS - 51 单片机凭借其广泛的应用和稳定的性能备受关注。MCS - 51 单片机内部配备了一个全双工的异步串行通信接口,这一接口在单片机的数据传输中起着关键作用。其结构如图 4 - 18 所示,当串口工作时,单片机 P3 口的 P3.0 引脚和 P3.1 引脚会处于第二功能状态,分别作为串口的数据接收端 RXD 和发送端 TXD。

从角度来看,串口控制寄存器 SCON 对串口的工作方式起到决定性作用,而串口的波特率则与定时 / 计数器 1 的溢出率有着直接关联。此外,串口在发送数据和接收数据的过程中,都能够产生串口中断请求,这为数据的高效处理提供了保障。
发送缓冲区具有只能写入不能读出的特性。在发送数据时,在发送控制器的精准控制下,发送缓冲区中的并行数据会被转换为串行数据,并插入必要的格式信息,从而形成完整的字符数据帧,终通过 TXD 引脚发送出去。接收缓冲区则恰恰相反,只能读出不能写入。接收数据时,由 RXD 引脚接收字符数据帧,在接收控制器的作用下,字符数据帧中的格式信息被滤除,然后数据被移位寄存器转换成并行数据并存入接收缓冲区。由此可见,MCS - 51 单片机的串口是全双工的,能够同时进行数据的发送和接收,大大提高了数据传输的效率。
MCS - 51 单片机的串口拥有 4 种工作方式,每种方式都有其独特的应用场景。
方式 0:并行 I/O 接口扩展
方式 0 主要用于并行 I/O 接口的扩展,并非真正意义上的数据通信方式。在方式 0 下,串口作为 8 位同步移位寄存器,既可以进行移位输入也可以进行移位输出。如该方式的时序(见图 4 - 19)所示,TXD 是移位脉冲的输出引脚,RXD 是数据移位输入或输出的引脚,并且方式 0 的字符数据帧中只有 8 个数据位,没有格式信息。

数据发送:发送数据前,首先要将 TI 清 0,然后向 SBUF 中写入数据即可启动串口的发送,例如指令 “MOV SBUF,A”。之后,引脚 TXD 和 RXD 分别会出现移位脉冲和数据位。当所有数据位发送完毕后,串口发送中断请求标志位 TI 会被单片机硬件置 1,表明数据发送过程结束。需要注意的是,单片机硬件在任何时候都不会自动将 TI 清 0,再次发送数据前,必须用软件指令将 TI 清 0,如执行指令 “CLR TI”。
数据接收:接收数据前,必须令 REN = 1 且 RI = 0,以启动串口的接收过程。之后,TXD 引脚会出现移位脉冲,串口等待 RXD 引脚上出现的数据位,并将其送入移位寄存器。当接收完一个完整数据帧后,硬件将移位寄存器中的数据送入接收缓冲区 SBUF,并将接收中断请求标志位 RI 置 1,表明数据接收完毕。再次接收数据前,需将 SBUF 中的数据取走,并将 RI 清 0。取 SBUF 中的数据可以用指令 “MOV A,SBUF”,该指令将接收缓冲区的数据送入累加器 A。同样,只能用软件指令将 RI 清 0,如指令 “CLR RI”,因为单片机硬件不会自动将 RI 清 0。
方式 1:8 位数据传输
方式 1 时,串口可接收和发送 8 位数据,其时序如图 4 - 21 所示。1 个字符帧中有 10 个二进制位,包括 8 个数据位、1 个起始位和 1 个停止位。TXD 和 RXD 分别是发送数据和接收数据的引脚。

数据发送:与方式 0 相似,发送前先将 TI 清 0,然后向 SBUF 中写入数据启动发送,被发送的数据从 TXD 向外输出,低位在前高位在后。一帧数据发送完毕后,TI 被单片机硬件置 1,再次发送数据前,必须用软件指令将 TI 清 0。
数据接收:令 REN = 1 且 RI = 0 启动接收过程,通过 RXD 接收字符数据帧,接收顺序为先低位再高位。实际上,数据的接收是通过采样实现的,每个数据位上 RXD 被采样 3 次,其中两次相同的采样值作为采样结果送入接收端的移位寄存器。一个完整字符帧接收完毕后,RI 被置 1,并且接收的 8 个数据位被送入接收缓冲区,而停止位 “1” 被送入接收方 SCON 的 RB8 中。若再次接收数据,则必须提前将 RI 清 0。
方式 2 和方式 3:多机通信
串口工作方式 2 和方式 3 属于多机通信方式(多机通信的具体实现方法见前文关于 SM2 的描述),主机与从机的连接关系如图 4 - 23 所示,其时序如图 4 - 24 所示。方式 2 和方式 3 的差别是波特率计算公式不同。其字符帧包含 11 个二进制位,与方式 1 相比,在停止位前多了 TB8 位,该 TB8 位来自于发送方 SCON 寄存器中的 TB8 位,发送方的 TB8 位终将被送入接收方 SCON 寄存器的 RB8 位中。
数据发送:与其他工作方式的发送过程相同,发送前需将 TI 清 0,然后向 SBUF 中写入数据以启动发送,数据由 TXD 向外发送,数据发送完毕后,TI 被硬件置 1,再次发送数据前,必须用指令将 TI 再次清 0。
数据接收:串口接收数据前,需令 REN = 1 且 RI = 0,数据由 RXD 引脚接收。在字符数据帧中,停止位和 D7 之间的位来自发送方的 TB8,并被送入接收方 SCON 寄存器的 RB8 位中。因此在图 4 - 24 所示接收时序中,停止位和 D7 之间的位用 RB8 表示。一个字符数据帧接收完毕后,RI 不一定被硬件置 1,RI 被硬件置 1 的情况有两种,分别是:①SM0 = 0;②SM0 = 1 并且 RB8 = 1。再次接收数据前,必须将 RI 清 0,并令 REN = 1。