1.1 串行输入/输出口概述
计算机与它的外围设备之间的基本通信模式有两种:并行通信模式和串行通信模式。采用并行通信模式时,例如通过并行输入/输出口P1控制交通灯,所有数据位同时通过并行输入/输出口进行传送。并行通信模式的优点是数据传送速度快,所有的数据位同时传输;缺点是电路复杂,一个并行的数据有多少位,就需要多少条传输线。
采用串行通信模式时,所有的数据位按一定的顺序、通过一条传输线逐个地进行传送。串行通信模式的优点是电路简单,仅需要一条传输线;缺点是数据传送速度慢。串行通信模式又可以再分为两种模式:同步通信模式和异步通信模式。
AT89S51单片机提供同步通信模式和异步通信模式两种串行通信模式。异步通信模式工作在UART(Universal Asynchronous Receiver and Transmitter),可以同时进行数据的发送和接收。
AT89S51单片机串行通信的接收部分具有缓冲能力,即已经接收到的第一个字节在被读取之前就可以开始接收第二个字节。但是应当注意,如果第二个字节完成接收,而第一个字节仍没有被读取,一个字节的数据将被丢失。
串行输入/输出具有独立的发送和接收缓冲寄存器,它们共同被称作为串行数据缓冲寄存器(SBUF),并占用特殊功能寄存器的同一个地址(99H)。发送缓冲寄存器只能写入不能读出,接收缓冲寄存器只能读出不能写入,因此它们的区分可以通过指令来实现。
串行输入/输出的数据使用管脚RXD(管脚10)和管脚TXD(管脚11)可以同时接收和发送数据。管脚RXD和管脚TXD也就是管脚P3.0和管脚P3.1,这里它们被按P3口的第二功能来使用。
1.2 串行输入/输出口的工作方式
AT89S51串行口的工作可以被分为4种工作方式。这4种工作方式的简述如下: ■ 工作方式0
串行口工作方式0为同步移位寄存器方式。在这种方式下,串行数据的发送和接收都是通过管脚RXD进行,管脚TXD用来传送同步移位脉冲。串行数据一帧的数据位数为8位,传输时低位在前,高位在后。数据传输的波特率是固定的,为单片机时钟频率的1/12。如果单片机的时钟频率为12MHz,则数据传输的波特率是1MB。串行口工作方式0的数据传输波特率不受电源控制寄存器(PCON)中SMOD位的影响。 本章将介绍利用串行口工作方式0实现数码管的显示。 ■ 工作方式1
串行口工作方式1为异步通信(UART)方式。串行数据一帧的数据位数为10位:1位起始位(它的值为0)、8位数据位和1位停止位(它的值为1)。数据位传输时低位在前,高位在后。串行数据的发送通过管脚TXD进行;串行数据的接收通过管脚RXD进行。数据传输的波特率是可变的。
在接收时,数据帧中的停止位进入串行口控制寄存器(SCON)的位RB8。 ■ 工作方式2
串行口工作方式2为异步通信(UART)方式。串行数据一帧的数据位数为11位,1位
起始位(它的值为0),8位数据位,1位可编程位和1位停止位(它的值为1)。数据位传输时低位在前,高位在后,紧接着是可编程位。串行数据的发送通过管脚TXD进行;串行数据的接收通过管脚RXD进行。数据传输的波特率是固定的,是单片机的时钟频率的1/32或者1/64。具体工作在那一种波特率由电源控制寄存器(PCON)中SMOD位的内容决定,当SMOD位被置1,波特率是单片机时钟频率的1/32;当SMOD位被清0,波特率是单片机时钟频率的1/64。
在发送时,数据帧中可编程位的值取决于串行口控制寄存器(SCON)的位TB8。例如把程序状态字(PSW)的位P的值送入TB8可以实现数据传输的奇偶校验。在接收时,数据帧中的可编程位送入串行口控制寄存器(SCON)的位RB8,停止位这时被丢弃。 ■ 工作方式3
串行口工作方式3除数据传输的波特率是可变的以外,其它与工作方式2相同
1.3 串行输入/输出口工作控制寄存器
控制串行输入/输出口工作的控制寄存器有2个:串行口控制寄存器(SCON)和电源控制寄存器(PCON)。
■ 串行口控制寄存器(SCON)
串行口控制寄存器(SCON)在特殊功能寄存器中的字节地址为98H,它即可以进行字节寻址,也可以进行位寻址。这个寄存器的格式如表1所示。
表1 串行口控制寄存器(PCON)的格式表 PCON 位地址 复位值 D7 SM0 9F 0 D6 SM1 9E 0 D5 SM2 9D 0 D4 REN 9C 0 D3 TB8 9B 0 D2 RB8 9A 0 D1 TI 99 0 D0 RI 98 0
在表1中,每一位的具体功能如下。
SM0和SM1:串行口工作方式控制位,工作方式的功能说明如表2所示。
表2 串行口的工作方式 SM0 0 0 1 1 SM1 0 1 0 1 工作方式 0 1 2 3 功能说明 同步移位寄存器方式 8位异步通信(UART)方式,波特率可变 9位异步通信(UART)方式,波特率为focs/64或者focs/32 9位异步通信(UART)方式,波特率可变 表中focs为单片机的时钟频率
SM2:串行口工作方式2和3的多机通信控制位。 REN:串行接收使能控制位。
TB8:串行口工作方式2和3时被发送的第9位数据。 RB8:串行口工作方式2和3时被接收的第9位数据。 TI:发送中断标志位。 RI:接收中断标志位。
■ 电源控制寄存器(PCON)
电源控制寄存器(PCON)在特殊功能寄存器中的字节地址为87H,它没有位寻址功能,只能进行字节寻址。这个寄存器的格式如表3所示。
表3 电源控制寄存器PCON的格式表 PCON 复位值 D7 SMOD 0 D6 — X D5 — X D4 — X D3 GF1 0 D2 GF0 0 D1 PD 0 D0 IDL 0
电源控制寄存器PCON中仅有D7位,SMOD,在串行输入/输出口的控制中被应用,它被用来控制串行通信的波特率。SMOD为1时的波特率是它为0时的2倍。
2.基于串行输入/输出口的数码管电路
前面在并行输入/输出口的应用中分别介绍了使用P1口实现交通灯的控制和数码管的显示。如果希望同时实现交通灯的控制和数码管的显示,那么仅使用P1口则是不够的,这时需要使用更多的输出端口。
如前所述,AT89S51芯片向用户提供的并行输入/输出口是有限的,因此必须想办法进行扩展。应用串行口工作方式0的同步移位寄存器方式是扩展输入/输出能力的一种方法。 串行口工作方式0的输出时序图如图1所示。
RDX (DATA OUT)TXD (SHIFT CLOCK)D0D2D2D1D2D2D3D2D2D4D2D5D6D2D2D7
图1 串行口工作方式0的输出时序图
当向串行数据缓冲寄存器SBUF写入一个数据,在管脚RXD和管脚TXD将自动产生如图1所示的信号。管脚RXD输出数据,管脚TXD输出同步移位时钟。同步移位时钟的周期等于单片机的工作周期,因此输出一个字节的数据需要8个单片机的工作周期。
串行口输出一个字节的数据需要8个单片机的工作周期这点在编程时应该注意,不能连续地编写2条向串行数据缓冲寄存器(SBUF)写入数据的指令。因为如果第一个数据还没有被全部发送出去,这时向串行数据缓冲寄存器(SBUF)再写入一个数据,新写入的数据将覆盖没有完成发送的第一个数据的剩余内容,导致数据传输错误。
管脚RXD的输出数据不能直接送入数码管,这是因为串行数据通过一条线输出,而数码管的工作则同时需要8个输入信号。使用8位移位寄存器(串行输入,并行输出)74LS164可以把图1所示的串行信号转换成数码管所需要的并行信号以满足数码管的需要。74LS164的功能表如表4所示。
表4 74LS164的功能表
输 入 MR CLK DSA DSB 0 × × × 1 0 × × 1 ↑ 1 1 1 ↑ 0 × 1 ↑ × 0 输 出 Q0 Q1 Q2 Q3 Q4 Q5 Q6 Q7 0 0 0 0 0 0 0 0 Q00 Q10 Q20 Q30 Q40 Q50 Q60 Q70 1 Q00 Q10 Q20 Q30 Q40 Q50 Q60 0 Q00 Q10 Q20 Q30 Q40 Q50 Q60 0 Q00 Q10 Q20 Q30 Q40 Q50 Q60
应用串行口工作方式0和74LS164的数码管的显示电路如图2所示。对比基于串行输出口的数码管电路和基于并行输出口的数码管电路,这里电路的硬件开销并没有增加,74LS164在这里完成了串/并转换和电流放大双重任务。
+5VC410uF+4039383736353433323130292827272727272719C50.1uFP0.0(AD0)P0.1(AD1)P0.2(AD2)P0.3(AD3)P0.4(AD4)P0.5(AD5)P0.6(AD6)P0.7(AD7)P2.7(A15)P2.6(A14)P2.5(A13)P2.4(A12)P2.3(A11)P2.2(A10)XTAL2P2.1(A9)XTAL1P1.5(MOSI)P1.6(MISO)P3.2(INT0)P3.0(RXD)P1.7(SCK)P3.3(INT1)P3.1(TXD)P3.6(WR)P3.7(RD)P3.4(T0)P3.5(T1)C110uF+ALE/PROG10RSTP1.0P1.1P1.2P1.3P1.41112131415161718R110kC230pF1213121110654320CRY12MHzC330pF764219105123456789ABQ7Q6Q5Q474LS164Q3Q2Q1GNDabcdefgdpfeagdbcom3R2P2.0(A8)EA/VPPPSENVCC21cdh89MRQ0+5V 图2 基于串行输出口的数码管的显示电路
执行指令:
SBUF=0x3f;
可以输出共阴极数码管字符“0”的显示代码。显示代码以图1所示的时序从单片机输出。首先显示代码的最低位数据从AT89S51的管脚RXD送到74LS164的管脚DSA和DSB,接着同步移位脉冲从AT89S51的管脚TXD送到74LS164的管脚CLK,在同步移位脉冲上升沿的作用下,显示代码的最低位数据被移入74164的管脚Q0。第2个同步移位脉冲的上升沿接着把代码的最低位数据移入74164的管脚Q1,把跟着最低位的数据移入74LS164的管脚Q0。依次类推,8个同步移位脉冲完成把整个显示代码移入74LS164的输出管脚,其中最低位在管脚Q7,最高位在管脚Q0。串/并转换的整个过程需要8个单片机机器周期。如果单片机的时钟频率为12MHz,该过程需要8us。在转换过程的8us中,数码管的显示是不断变化的错误显示,但是这个时间很短,我们的眼睛分辨不出这个变化。实际上图2所示的基于串行输出口的数码管电路和基于并行输出口的数码管电路的工作区别是分辨不出来的。
在向P1口传送显示代码编写的字符显示程序的基础上,把程序中的直接地址P1换成直接地址SBUF就可以用于图2所示电路显示字符。
3.数码管应用的进一步讨论
3. 1 多位数据的显示
图2所示的基于串行输出口的数码管电路都只能支持一个数码管的显示,即一次只能显示一位数据。如果需要显示多位数据,例如希望数据能从00H~FFH顺序循环地显示,图2所示的电路必须进行改进。改进后的数码管的显示电路如图3所示。
764219105abcdefgdpfeagdbcom3R1764219105abcdefgdpfeagdbcom3R2cdhcdh131211101312111065436548Q7Q6Q5Q4Q3Q2Q1Q0Q7Q6Q5Q4Q3Q2Q1U174LS164U274LS164MR128912from RXD from TXD +5V9+5VMRAABBQ03
图3 基于串行输出口的2位数码管显示电路
在图3所示的电路中,使用了2个74LS164来驱动2个数码管。依次类推,采用串行传输方式,微控制器可以启动多个数码管。从单片机TXD管脚来的同步移位信号同时加到2个74LS164的管脚CLK,从单片机RXD管脚来的串行数据信号加到第一个74LS164的串行数据输入口,从第一个74LS164的管脚Q7移出的串行数据再加到第二个74LS164的串行数据输入口。
在采用同步移位方式的串行输出时,每传送一个字节的数据需要8个机器周期,因此2个显示代码的输出语句间隔必须大于8个机器周期。
3.2 16进制数到10进制数的转换
计算机内部采用2进制数进行数据处理,但是人类更习惯使用10进制数。如果在数据的显示之前,首先把16进制数据转换为10进制数据,然后再把数据转换为显示代码送去显示则可以获得更好的效果。
因篇幅问题不能全部显示,请点此查看更多更全内容