EXPERIENCE EXCHANGE
经验交流
单片机从机的波特率自适应设置※
■ 航天信息股份有限公司 严天华 周辉
我们在设计单片机串行通信程序时,一般用其
晶体振荡器的频率来计算具体的波特率时间常数。
当晶体振荡频率改变时,其底层软件也必须跟着修
改,不免有些麻烦。为此,笔者经过实践,找到一
种可以两全其美的办法 : 从机侦测主机位信息并
自动设置与主机同样的波特率, 以适应主机。 其
一,可以不考虑晶体振荡频率;其二,从机可以自
动适应主机的波特率, 从而与主机正常通信。
为便于说明,以 AT89C52 为实例,AT89C52 为
从机, PC 机为主机。
1 硬件原理图
电原理如图 1 所示。DB9 接到 PC机的串口上;
晶体振荡器频率可选用 11.0592 MHz、14.7456 MHz。
2 自适应设置理论原理
AT89C52 的串行口有 4 种工作方式, 方式 1、3
最常用。 T2 的波特率发生方式类似于常数自动重
装入方式,用 X16 代替(RCAP2H、RCAP2L),则串
行口方式 1、 3 的波特率公式为
波特率 = fosc / 32(65536 - X16 )
(1)
由式(1)可得,单片机每接收 1位需要的时间
为
接收 1 位的时间 = 32(65536 - X16 ) / fosc (2)
单片机 AT89C52为 12 分频指令系统,所以其机
器周期为
机器周期 = 12/ fosc (3)
我们可以很容易得到单片机接收 1位所需要的
机器周期, 假定为 NUM, 则由式 (2)、(3) 得
U2
AT89C52-20JG
2
3
4
5
6
7
8
9
P1.0
P1.1
P1.2
P1.3
P1.4
P1.5
P1.6
P1.7
P0.0/AD0
P0.1/AD1
P0.2/AD2
P0.3/AD3
P0.4/AD4
P0.5/AD5
P0.6/AD6
P0.7/AD7
P2.0/A8
P2.1/A9
P2.2/A10
P2.3/A11
P2.4/A12
P2.5/A13
P2.6/A14
P2.7/A15
43
42
41
40
39
38
37
36
24
25
26
27
28
29
30
31
33
32
19
18
VCC
+ C7
10µF
R1
8.2kO
RST
XTAL1
X2
XTAL2
C1
30pF
C2
30pF
22.1184MHz
+
1
3
4
5
C3
2.2µF
C4
2.2µF
C1-
C2+C2+
C2-
U3
MAX232CPE
C1+
V+
VCC
C6
2.2µF
C5
2.2µF
+
+
RXD
XRXD
XTXD
TXD
J1
DB9
5
9
4
8
3
7
2
66
1
2
6
V-
9
R2O
8
R2I
7
T2O
T2I 10
图1 硬件原理图
2003.6
Mi crocontrol lers & Embedded Systems
75
RXD/P3.0
TXD/P3.1
XTAL1
XTAL2
T1/P3.5
T0/P3.4
RXD
TXD
11
13
XTAL1
XTAL2
21
20
17
16
15
14
10
RST
INT1/P3.3
INT0/P3.2
ALE/PROG
PSEN
RST
RD/P3.7
WR/P3.6
VCC
35
EA/VPP
经验交流 EXPERIENCE EXCHANGE
NUM × 12/ fosc= 32 (65536 - X16 ) / fosc 厖 (4)
由式 (4) 可得, 波特率定时时间常数为
X16 = NUM × 3/ 8 (5)
由 此 , 得 到 单 片 机 接 收 1 位 的 机 器 周 期 数
NUM。
3 自动检测主机信息的方法
不失一般性,假定串行通信的字符协议为 1 位
起始位,8 位数据位,无奇偶校验位,1 位停止位。
由定时器 2 工作原理知道,C/T2 = 0,TR2 = 0,
则其加 1 计数,其计数速率为 fosc/12,每加 1 需要的
时间为 12/fosc, 刚好就是一个机器周期。 所以, 只
要在传输数据的某位开始处启动定时器,在该位传
输结束时停止计数器,然后获取该范围的计数值,
就是式 (5) 中的 NUM。
如果主机(PC机)发给单片机01H(十六进制),
则单片机 P3.0 接收数据如图 2 波形所示。起始位开
始时, 启动定时器 T2; 高电平来到时,关闭定时
器 T2, 则计数值就为 NUM。
TR2=1
TR2=0
图2 确定NUM的示意图
4 软件实现
这里给出获取定时
常数的流程图,如图3和
图 4所示。该流程图是按
主机发 0x01 来设计的。
实现该方法的软件
源代码见本刊网络补充
版 (htt p:// www.dpj.com.
cn)。
5 波特率误差分析
及实验结果
(1) 串行通信误差
要求
实践表明,当波特
率的相对误差小于 4.5%
时, 不会影响数据的正
确接收。 一般要保证传
输的可靠性, 要求误差
不大于 2.5%。
开始
清空缓冲区
停止定时器T2
设置定时初值
P3.0=0?
Y
启动定时器T2
P3.0=1?
Y
停止定时器T2
读取计数值
返回
N
N
图3 获取8位数据的
定时计数值
76
2003.6
(2) 误差来源
按照本文原理设置波特
率, 则误差来源有四 :
◇ 定时器 T2启动延迟和
停止点的滞后造成的
误差Δ T1;
◇ 定时器计数本身有一
个机器周期的误差Δ
T 2= ± 1;
◇ 计算 X 16 定时常数时,
由于 8 位单片机计算
产生的误差Δ X16;
◇ 晶体振荡器本身频率
的误差。
开始
获取8位周期数
周期数× 3
除以64
四舍五入运算
65536-计算值
返回
图4 计算定时时间
常数
由式 (5) 知道, Δ X 16 = Δ X 16 ’ +(Δ T1+
Δ T2) × 3/8。
(3) 误差分析计算
波特率 (实 际 ) = fosc / 32 [65536 - ( X16 ±Δ X16)] (6)
波特率相对误差 =(波特率 (实 际 ) - 波特率 (理 论 ) )/
波特率 (理 论 ) × 100%
波特率相对误差 =
1
65536
?
?1
?
??
?
X
16
?
1
?
??
?
× 100%(7)
由式(7)知道,X16 的值越大,波特率相对误
/(
X
?
16
)
差越大 ;X16 的值越小,波特率相对误差越小。
(4) 实际测试结果及误差
实验条件:单片机为 AT89C52,晶体振荡器的
频率为 22.1184 MHz。
实验方法:用 PC机分别以 110、300、600、1200、
2400、4800、9600、19200、38400、56000 及 115200 向
单片机发数 0x01,单片机都能正确返回,可见波特
率常数自动设置成功。
实验结果如表 1 所列。
◇ 假设 PC和单片机的晶体振荡器的频率误差
为 0;
◇ PC 机的实际波特率 =1.8432 MHz/(16 ×波特
率因子);
◇ 单片机的实际波特率=22.1184 MHz/32 (65536
- X16 );
◇ PC 机与单片机实际通信 bps 误差 =( PC机实
际 bps - 单片机实际 bps)/ PC 机实际 bps。
由表 1可知,该方法的波特率误差均小于2.5%,
能充分保证数据的正确通信。
选 PC 机
波特率/bps
(选用)
110
300
600
1200
2400
4800
9600
14400
19200
38400
56000
57600
115200
结 语
PC 机实际
波特率/bps
(计算值)
110.028656
300
600
1200
2400
4800
9600
14400
19200
38400
57600
57600
115200
1 位计数
(单片机检测)
16719
6131
3066
1531
764
383
191
127
95
47
31
31
15
表 1
定时
时间常数
(单片机计算)
59266
63236
64386
64961
65248
65392
65464
65488
65500
65518
65524
65524
65530
本文的波特率设置原理,既适合 12时钟的单片
机,也适合 6 时钟的单片机。软件经过修改,很容
易用于其它系列单片机中, 尤其在应用程序下载
EXPERIENCE EXCHANGE
经验交流
PC 机与单片机实际
通信波特率误差/%
(计算)
0.191386
0.173910
0.173910
0.173910
0.0
0.0
0.0
0.0
0.0
0.0
0.0
0.0
0.0
单片机实际
波特率/bps
(计算值)
110.239235
300.521729
601.043457
1202.086914
2400
4800
9600
14400
19200
38400
57600
57600
115200
版社, 1992
(IAP)软件时,不
愧 为 一 种 好 的 设
计思路。
参考文献
1 余 永 权 .
A T M E L 8 9 系列
Flash 单 片 机 原 理
及 应 用. 北京:电
子工业出版社, 1997
2 陈汝全,等.
单 片 机 实 用 技 术 .
北京:电子工业出
3
徐爱钧,等. 单片机高级语言C51应用程序
设计. 北京:电子工业出版社, 1998
(收稿日期 :2002-12-05)
2003.6
Mi crocontrol lers & Embedded Systems
77