3 插值調(diào)整法設(shè)計(jì)波特率的方法
由以上看出,在采用12 MHz晶振的前提下,尚有9600b/s、19 200b/s等常用波特率,采用式(2)所得的結(jié)果誤差過大而不能實(shí)現(xiàn)。當(dāng)然,一般情況下通過換用晶振來獲取所需的波特率是無可非議的,但遇到諸如:(1)所開發(fā)的系統(tǒng)要求能隨時(shí)方便地切換波特率;(2)對單片機(jī)用戶板成品進(jìn)行更改串口波特率;(3)選用非整數(shù)的晶振會增大程序調(diào)試難度等這些應(yīng)用系統(tǒng)時(shí)。通過更換晶振來獲取所需要的波特率不是很理想。筆者在應(yīng)用開發(fā)過程中發(fā)現(xiàn),可以通過適當(dāng)?shù)木幊谭椒▉韺?shí)現(xiàn)所需的波特率。
由串行口的工作原理可知,T1的溢出信號作為串行口的16分頻計(jì)數(shù)器的計(jì)數(shù)脈沖信號,而計(jì)數(shù)器的翻轉(zhuǎn)溢出作為串行口的工作時(shí)序控制脈沖。故此,如果能在收發(fā)每一位數(shù)據(jù)的時(shí)間td內(nèi),讓T1產(chǎn)生相應(yīng)的溢出次數(shù)作為串行口的工作時(shí)序控制脈沖,便可讓串行口產(chǎn)生相應(yīng)的波特率了。
實(shí)際應(yīng)用中,我們采用了常用的12MHz晶振,按常規(guī),讓定時(shí)器T1作為波特率發(fā)生器,工作在方式2,裝入整數(shù)值X,產(chǎn)生比所需略高的T1溢出。而讓定時(shí)器T0以傳送每一位數(shù)據(jù)的時(shí)間td來產(chǎn)生中斷。在T0中斷服務(wù)程序中,關(guān)停定時(shí)器T1若干個(gè)周期(由計(jì)算確定),這樣,便可獲得與所需波特率相適應(yīng)的T1溢出。其實(shí)質(zhì)就是讓前15個(gè)T1溢出計(jì)數(shù)按原先設(shè)定值進(jìn)行,而在產(chǎn)生第16個(gè)T1溢出的計(jì)數(shù)過程中,根據(jù)需要對定時(shí)器T1關(guān)閉若干個(gè)周期,以使T1在第16個(gè)計(jì)數(shù)溢出周期變長,從而達(dá)到調(diào)整每一位數(shù)據(jù)傳送時(shí)間td的目的。
采用插值調(diào)整法自身所產(chǎn)生的誤差最大值為
ΔT=(1/2)N+nTb
ΔT由兩部分組成:(1)由于插值補(bǔ)償,而造成采樣檢測時(shí)間偏離數(shù)據(jù)位中間值所致誤差Tp,Tp=(1/2)N,N為插值數(shù),Tp為固定值,(2)每一位數(shù)據(jù)(經(jīng)調(diào)校后的)周期與標(biāo)準(zhǔn)波特率之間誤差Tb。Tb為累積值,在接收數(shù)據(jù)幀的最后一位時(shí)達(dá)到最大值:nTb,n為每幀數(shù)據(jù)的位數(shù)。
4 應(yīng)用設(shè)計(jì)實(shí)例
下面以12 MHz晶振設(shè)計(jì)9600 b/s的波特率為例,說明插值調(diào)整法設(shè)計(jì)波特率的方法。
(1)求取每位代碼的傳送時(shí)間td:
td=1/波特率=(1/9600)=104.17μs
(2)求取定時(shí)器初裝值X的最大值:
得X=252,算得t=16×(2 8-252)=96
(3)計(jì)算每位的偏差值(也即插值數(shù)):
N=td-t=104.17-96約等于8
(4)此時(shí)每位的誤差為
Tb=104.17-96-8=0.17μs
即接收時(shí)累積差最大值為
ΔT=(1/2)N+nTb=4+1.87=5.87μs
由此可得累積誤差率為ΔT/td=5.87/104.17=5.64%
折算為波特率誤差時(shí)為0.51%。
發(fā)送時(shí)波特率誤差為(11位/幀)
ΔT=0.17×11=1.87μs,ΔT/td=1.87/104.17=0.16%
由以上可以看到,誤差要比允許值小得多。
(5)T0的中斷周期收td的近似值104μs。
匯編源程序:
ORG 0000H
JMP MAIN ;主程序入口
ORG 000BH
JMP TINT ;T0中斷入口
MAIN:MOV TMOD,#22H;設(shè)置T1、T0為工作方式2
MOV TL0,#0A08 ;T0賦初值
MOV TH0,#98H
MOV IE,#10000010B ;允許T0中斷,禁止;
T1中斷
SETB PT0 ;T0設(shè)為高級中斷
MOV PCON,#80H ;設(shè)置波特率倍增位
MOV TL1,#0FCH ;為T1賦初值
MOV TH1,#0FCH
SETB TR0 ;啟動TR0
SETB TR1 ;啟動TR1
…… ;進(jìn)行其他設(shè)置及任務(wù)執(zhí)行
TINT:CLR TR1 ;關(guān)停TR1

SETB TR1 ;重新啟動T1
RETI ;中斷返回
注意,由于T0中斷響應(yīng)要3~8個(gè)機(jī)器周期。為使T0中斷發(fā)生在T1的第16次溢出計(jì)數(shù)中,故此T0的預(yù)裝值為0A8H。
結(jié)束語
插值調(diào)整法,是通過編程的方法來獲得所需的波特率的,省卻了傳統(tǒng)方法修改硬件的麻煩,使變換串行口波特率顯得很方便。但由于該方案采用中斷方式處理,因此,系統(tǒng)會產(chǎn)生較頻繁的中斷。在設(shè)計(jì)單片機(jī)系統(tǒng)時(shí),要充分考慮相關(guān)的問題。





