全双工增强型 UART
标准UART 操作
串口为全双工结构表示可以同时发送和接收它还具有接收缓冲在第一个字节从寄存器读出之前
可以开始接收第二个字节但是如果第二个字节接收完毕时第一个字节仍未读出其中一个字节将会丢失
串口的发送和接收寄存器都是通过SFR SBUF 进行访问的写入SBUF 的数据装入发送寄存器对SBUF
的读操作是对物理上分开的接收寄存器进行访问
串口有 4 种操作模式
模式0
串行数据通过RxD 进出TxD 输出时钟每次发送或接收以LSB 最低位作首位每次8 位波
特率固定为MCU 时钟频率的1/12
模式1
TxD 脚发送RxD 脚接收每次数据为10 位一个起始位0 8 个数据位LSB 在前及一个停
止位1 当接收数据时停止位存于SCON 的RB8 内波特率可变由定时器1 溢出速率决定
模式2
TxD 脚发送RxD 脚接收每次数据为11 位一个起始位0 8 个数据位LSB 在前一个可编
程第9 位数据及一个停止位1
发送时第9 个数据位SCON 内TB8 位可置为0 或1 例如将奇偶位PSW 内P 位移至TB8
接收时第9 位数据存入SCON 的RB8 位停止位忽略波特率可编程为MCU 时钟频率的1/32 或1/64
由PCON 内SMOD1 位决定
模式3
TxD 脚发送RxD 脚接收每次数据为11 位一个起始位0 8 个数据位LSB 为首位一可编
程的第9 位数据及一个停止位1 事实上模式3 除了波特率外均与模式2 相同其波特率可变并由定时
器1 溢出率决定
初始化
在上述 4 种模式中发送过程是以任意一条以写 SBUF 作为目标寄存器的指令开始的,模式
0 时接收通过设置 R1=0 及 REN=1 初始化;其它模式下如若 REN=1 则通过起始位初始化
串口模式 1 功能图
串口模式 1 时序图
串行端口控制寄存器 SCON
1. 串行端口控制及状态寄存器即SCON 如图所示其中包括模式选
择位以及发送和接收的第9位数据TB8及RB8 ;以及串行端口中断
位TI 及RI
2. SCON 地址98H
3. 可位寻址 7 6 5 4 3 2 1 0;复位值 00H
SM0/FE SM1
SM2
REN
TB8
RB8
TI
RI
4. 图 串行控制寄存器SCON
位
符号 功能
SCON.7
FE
帧错误位。当检测到一个无效停止位时通过UART接收
器设置该位但它必须由软件清零要使该位有效PCON
寄存器中的SMOD0 位必须置1
SCON.7
SM0 和 SM1 定义串口操作模式。要使该位有效,PCON 寄
存器中的 SMOD0 必须置 0
SCON.6
SM1
SM1 和SM0 定义串行口操作模式见下表
SM0 SM1 UART 模式
波特率
0
0
0 同步移位寄存器 fosc/12 或fosc/6
取决于时钟模式
1
2
1
0
0
1
/32
8 位UART
可变
9 位UART
fosc /64 或fosc
1
1
3
9 位UART
可变
SCON.5
SM2 在模式2和3 中多处理机通信使能位。在模式2 或3 中
若SM2=1 且接收到的第9 位数据RB8 是0, 则RI 接
收中断标志不会被激活。在模式1 中若SM2=1且没有接
收到有效的停止位,则RI 不会被激活。在模式0 中SM2
必须是0
SCON.4
REN 允许接收位。由软件置位或清除REN=1时允许接收
REN=0 时禁止接收
SCON.3
TB8
模式2和3 中发送的第9 位数据。可以按需要由软件置
位或清除
SCON.2
RB8
模式2和3 中已接收的第9 位数据。在模式1 中或
sm2=0 RB8 是已接收的停止位;在模式0 中RB8 未用
SCON.1
TI
发送中断标志。模式0中在发送完第8 位数据时,由硬
件置位。其它模式中在发送停止位之初,由硬件置位在
任何模式中都必须由软件来清除TI
SCON.0
RI
接收中断标志模式0中接收第8 位结束时由硬件置位其
它模式中在接收停止位的中间时刻由硬件置位在任何
模式(SM2 所述情况除外)必须由软件清除RI
定时/计数器 0/1 模式控制寄存器 TMOD
定时器0 和1 的操作
定时器0 和1
定时和计数功能由特殊功能寄存器TMOD 的控制位C/T 进行选择这两个定时/计数器有4 种操作模
式通过TMOD 的M1 和M0 选择两个定时/计数器的模式0 1 和2 都相同模式3 不同如下所述
模式0
将定时器设置成模式0 时类似8048 定时器即8 位计数器带32 分频的预分频器图2 所示为模式0
工作方式
此模式下定时器寄存器配置为13 位寄存器当计数从全为1 翻转为全为0 时定时器中断
标志位TFn 置位当TRn=1 同时GATE=0 或INTn=1 时定时器计数置位GATE 时允许由外部输入INTn
控制定时器这样可实现脉宽测量TRn 为TCON 寄存器内的控制位图3
该13 位寄存器包含THn 全部8 个位及TLn 的低5 位TLn 的高3 位不定可将其忽略置位运行标
志TRn 不能清零此寄存器
模式0 的操作对于定时器0 及定时器1 都是相同的两个不同的GATE 位TMOD.7 和TMOD.3 分
别分配给定时器0 及定时器1
模式1
模式1 除了使用了THn 及TLn 全部16 位外其它与模式0 相同
模式2
此模式下定时器寄存器作为可自动重装的8 位计数器TLn 如图4 所示TLn 的溢出不仅置位TFn
而且将THn 内容重新装入TLn THn 内容由软件预置重装时THn 内容不变模式2 的操作对于定时器0
及定时器1 是相同的
模式3
在模式 3 中定时器 1 停止计数效果与将 TR1 设置为 0 相同
波特率
PCON
SMOD 是串行口波特率倍增位,当 SMOD=1 时,串行口波特率加倍。
51 单片机 12M 晶振和 11.0592M 晶振选取的差别
标准的 51 单片机晶振是 1.2M-12M,一般由于一个机器周期是 12 个
时钟周期,所以先 12M 时,一个机器周期是 1US,好计算,而且速
度相对是最高的(当然现在也有更高频率的单片机)。
11.0592M 是因为在进行通信时,12M 频率进行串行通信不容易实现
标准的波特率,比如 9600,4800,而 11.0592M 计算时正好可以得
到,因此在有通信接口的单片机中,一般选 11.0592M
计算一下就知道了。如我们要得到 9600 的波特率,晶振为 11.0592M
和 12M,定时器 1 为模式 2,SMOD 设为 1,分别看看那所要求的 TH1
为何值。代入公式:
11.0592M 9600=(2÷32)×((11.0592M/12)/(256-TH1)) TH1=
250
12M 9600=(2÷32)×((12M/12)/(256-TH1)) TH1≈249.49
上面的计算可以看出使用 12M 晶体的时候计算出来的 TH1 不为整
数,而 TH1 的值只能取整数,这样它就会有一定的误差存在不能产
生精确的 9600 波特率。当然一定的误差是可以在使用中被接受的,
就算使用 11.0592M 的晶体振荡器也会因晶体本身所存在的误差使波
特率产生误差,但晶体本身的误差对波特率的影响是十分之小的,可
以忽略不计。