通常情況下,8051系列單片機外接晶振頻率一般是12MHz、24MHz、48MHz如圖7-6-1,為什么會這樣選取呢?從前面的章節(jié)已經(jīng)介紹8051系列單片機的每12個時鐘周期為一個指令周期,當8051系列單片機外接12MHz晶振時,指令周期=12/12MHz=1us;若外接24MHz晶振時,指令周期=12/24MHz=0.5us;若外接48MHz晶振時,指令周期=12/48MHz=0.25us。8051系列單片機外接能夠被除盡的晶振,在使用單片機內(nèi)部的定時器/計數(shù)器資源時作定時器使用時能夠得到精確定時應用;當使用匯編語言編程時,可以清楚知道當前每一行代碼執(zhí)行的時間。
8051系列單片機外接能夠被除盡的晶振即12MHz、24MHz、48MHz這些晶振時,波特率的精確性就得不到保證。
假若現(xiàn)在單片機外接的晶振為12MHz時,以T/C2作波特率發(fā)生器,根據(jù)波特率公式:
波特率=Fosc/2x16x(65536-t)
9600=12MHz/2x16x(65536-t)
t=65496.9375
“65496.9375”不是一個整數(shù)值,是一個帶有小數(shù)點的數(shù)值。對于常用的8位、9位、11位一幀的數(shù)據(jù)接收與傳輸,最大的允許誤差分別是6.25%、5.56%、4.5%。雖然波特率允許誤差,但是這樣通信時便會產(chǎn)生積累誤差,進而影響數(shù)據(jù)的正確性。唯一的解決辦法就是更改單片機外接的晶振頻率,更改為常用于產(chǎn)生精確波特率的晶振如11.0592MHz、22.1184MHz。
假若現(xiàn)在單片機外接的晶振為11.0592MHz時,以T/C2作波特率發(fā)生器,根據(jù)波特率公式:
波特率=Fosc/2x16x(65536-t)
9600=11.0592MHz/2x16x(65536-t)
t=65500=0xFFDC
雖然使用11.0592MHz、22.1184MHz的晶振能夠產(chǎn)生精確的波特率,但是用于系統(tǒng)精確的定時服務不是十分的理想。例如單片機外接11.0592MHz晶振時,指令周期=12/11.0592MHz≈1.085us,是一個無限循環(huán)的小數(shù)。當單片機外接22.1184MHz晶振時,指令周期=12/22.1184MHz≈0.5425us,也是一個無限循環(huán)的小數(shù)。
串口工作在方式1時分別采用T/C1和T/C2產(chǎn)生常用波特率初值表如下。
波特率
(11.0592MHz)
初值
波特率
(12MHz)
初值
TH1、TL1
(SMOD=0)
TH1、TL1
(SMOD=1)
TH1、TL1
(SMOD=0)
TH1、TL1
(SMOD=1)
1200
0xE7
0xD0
1200
0xE5
0xCB
2400
0xF3
0xE7
2400
0xF2
0xE5
4800
0xF9
0xF3
4800
0xF9
0xF2
9600
0xFC
0xF9
9600
0xFC
0xF9
14400
0xFD
0xFB
14400
0xFD
0xFB
19200
0xFE
0xFC
19200
0xFE
0xFC
波特率
(11.0592MHz)
初值
波特率
(12MHz)
初值
RCAL2H
RCAL2L
RCAL2H
RCAL2L
1200
0xFE
0xE0
1200
0xFE
0xC8
2400
0xFF
0x70
2400
0xFF
0x64
4800
0xFF
0xD8
4800
0xFF
0xB2
9600
0xFF
0xDC
9600
0xFF
0xD9
14400
0xFF
0xE8
14400
0xFF
0xE6
19200
0xFF
0xEE
19200
0xFF
0xED
如果大家想通過設置不同的晶振獲取更加多的波特率的值,可以下載以下工具進行計算:
軟件下載地址:http://files.cnblogs.com/wenziqi/單片機多功能調(diào)試助手.rar