参考博客:http://cqy-chenqiyao.blog.163.com/blog/static/66857812200921494227849/
串行工作方式0
1. 数据发送
当数据写入SBUF后,数据从RXD端在移位脉冲(TXD)的 控制下,逐位移入74LS164,74LS164能完成数据的串并转换。当8位数据全部移出后,TI由硬件置位,发生中断请求。若CPU响应中断,则从0023H单元开始执行串行口中断服务程序,数据由74LS164并行输出。其接口逻辑如下图所示。
2. 数据接收
要实现数据接收,必须首先把SCON中的允许接收位REN设置为1。当REN设置为1时,数据就在移位脉冲的控制下,从RXD端输入。当接收到8位数据时,置位接收中断标志位RI,发生中断请求。其接口逻辑如下图所示。由逻辑图可知,通过外接74LS165,串行口能够实现数据的并行输入。
串行工作方式1
方式1为10位为一帧的异步串行通信方式。其帧格式为1个起始位、8个数据位和1个停止位。如下图所示。
1. 数据发送
数据写入SBUF后,开始发送,此时由硬件加入起始位和 停止位,构成一帧数据,由TXD串行输出。输出一帧数据后,TXD保持在高电平状态下,并将TI置位,通知CPU可以进行下一个字符的发送。
2. 数据接收
当REN=1且接收到起始位后,在移位脉冲的控制下,把接收到的数据移入接收缓冲寄存器(SBUF)中,停止位到来后,把停止位送入RB8中,并置位RI,通知CPU接收到一个字符。
3. 波特率的设定
工作在方式1时,其波特率是可变的,波特率的计算公式为:
其中,SMOD为PCON寄存器最高位的值,其值为1 或0。
当定时器1作波特率发生器使用时,选用工作方式2(即自动加载定时初值方式)。选择方式2可以避免通过程序反复装入定时初值所引起的定时误差,使波特率更加稳定。假定计数初值为X,则计数溢出周期为:
溢出率为溢出周期的倒数。则波特率的计算公式为:
实际使用中,波特率是已知的。因此需要根据波特率的计算公式求定时初值X。用户只需要把定时初值设置到定时器1,就能得到所要求的波特率。
串行工作方式2
方式2为11位为一帧的异步串行通信方式。其帧格式为1个起始位、9个数据位和1个停止位。如下图所示。
在方式2下,字符还是8个数据位,只不过增加了一个第9个数据位(D8),而且其功能由用户确定,是一个可编程位。
在发送数据时,应先在SCON的TB8位中把第9个数据位的内容准备好。这可使用如下指令完成:
SETB TB8 ;TB8位置“1”
CLR TB8 ;TB8位置“0”
发送数据(D0~D7)由MOV指令向SBUF写入,而D8位的内容则由硬件电路从TB 8中直接送到发送移位器的第九位,并以此来启动串行发送。一个字符帧发送完毕后,将TI位置“1”,其他过程与方式1相同。
方式2的接收过程也于方式1基本类似,所不同的只在第9数据位上,串行口把接收到的前8个数据位送入SBUF,而把第九数据位送入RB。
方式2的波特率时固定的,而且有两种。一种是晶振频率的三十二分之一;另一种是晶振频率的六十四分之一。即fosc/32和fosc/64。如用公式表示则为:
由此公式可知,当SMOD为0时,波特率为fosc/64,当SMOD为1时,波特率为fosc/32
串行工作方式3
方式3同方式2几乎完全一样,只不过方式3的波特率是可变的,有用户来确定。其波特率的确定同方式1。