折腾来折腾去

pikipity的blog

第八章 串口通信

串口通信是CPU与周边其他设备传递数据的一种方式。8051单片机使用一组全双工UART,进行资料传输

UART的传输结构

UART在传输一个字节(8个位元)的时候会在开始加入一个起始位元(一般为0),在末尾加上一个结束位元(一般为1),资料的传输如下:

起始位元(0)  bit0 bit1 bit2 bit3 bit4 bit5 bit6 bit7 结束位元(1)

UART的接受端没有资料的时候为高电平(1),当检测到出现0时,开始接受数据,接收完8位数据之后,结束。注意:一个字节的数据是从最低位开始发送的。

这种传输方式也被计作8N1,第一个数字代表传输的符号数(此处为一个字节,8位,所以为"8"),第二个是是否根据数据中1的个数来进行验错(此处为"N",意思是不验错,还可以为"E",代表1的个数为偶数,"O"代表1的个数位奇数),最后一个数字是结束位元(此处结束位元为“1”)

传输速度

由于传输的数据很简单,所以通常以波特率来衡量传输速度,波特率指的是一秒钟传输的符号的个数,一般UART常用的波特率为1200、2400、4800、9600及19200等。

注意:不要和比特率混淆,波特率指的是一秒钟传输的符号的个数,根据不同的调制形式,一个符号上可负载多个比特信息。比特率指的是1秒传输的比特数。

一般发射和接受端的波特率必须一样,否则会出现误传,但是如果波特率相差不是很大的话,错误率亦不会很大。

8051中UART工作机制

当UART串口检测到有信号传入时,便将8位信号全部存到SBUF寄存器中,然后接受中断旗标置一,进入中断向量。

当向SBUF中移入数据的时候,UART便会将其发送出去,发送结束后,发送中断旗标置一,进入中断向量。

在发送和接受的过程中会使用 Timer1 来控制传输速率(波特率)

注意:尽管中断旗标不一样,但是中断向量却是同一个,都是 23H,所以在中断向量要判断到底是哪一个旗标让程序进入中断的。

UART设置

由于UART要设置Timer1来控制波特率,所以设置比较复杂。需要用到PCONSCONTMODTH1TL1

PCON

不可位元寻址

SMOD  -  -  -  GF1  GF0  PD  IDL

和UART有关的就是SMOD位,在后面的波特率计算公式中会出现。

SCON

可位元寻址

SM0  SM1  SM2  REN  TB8  RB8  TI  RI
  • SM0与SM1:传输模式选择位

    SM0 SM1 模式 描述 波特率
    0 0 0 一般用于I/O扩充 $$\frac{f_{os}}{12}$$
    0 1 1 8位元 UART $$\frac{2^{SMOD}}{32}\times\frac{f_{os}}{12(256-TH1)}$$
    1 0 2 9位元 UART $$\frac{2^{SMOD}}{64}f_{os}$$
    1 1 3 9位元 UART $$\frac{2^{SMOD}}{32}\times\frac{f_{os}}{12(256-TH1)}$$

    一般使用模式1就可以了。

  • SM2: 在模式2和3中使能通信特性,一般不用。
  • REN:使能接受,置一就是允许接受,置零就是不允许接收。
  • TB8:在模式2和3中设定传输的第九位。
  • RB8:在模式2和3中设定接受的第九位。
  • TI:发送中断旗标。不能硬件置零。
  • RI:接受中断旗标。不能硬件置零。

Timer1的设定

一般选择8位自动重载模式就可以了,根据上面的波特率就可以计算出TH1中应该重载的数值。下面是一张设置对应表。

UART设置对应表

设置举例

;PCON设置
ANL PCON,#01111111B ;这里为SMOD=0,如果SMOD=1,就 ORL PCON,#10000000B
;设置传输模式
CLR SM0
SETB SM1
CLR SM2
;设置允许接受
SETB REN
;设置波特率
MOV TMOD,#00100000B ;Timer1 8位自动重载
MOV TH1,#0FDH       ;9600bps
SETB TR1            ;Timer1开始计时
;使能中断
SETB ES
SETB EA


Comments