51單片機具有串行通信能力。其串行接口(UART)是一個全雙工的通信接口,能方便地與其他單片機實現(xiàn)雙機或多機串行通信。隨著IBM - PC機的普及和單片機應(yīng)用的迅速發(fā)展,把這兩種微型機結(jié)合起來的應(yīng)用日益廣泛,從而使之既具有較強的實時控制功能,又有很強的數(shù)據(jù)處理能力,充分發(fā)揮了不同機種的特長。在這種應(yīng)用中,雙方都采用了RS - 232C標(biāo)準(zhǔn)串行通信接口,以實現(xiàn)雙機或多機之間的通信。
在不同機種的微機通信中,眾所周知的一個問題是進(jìn)行通信的雙方應(yīng)該采用相同的傳輸速率,即雙方都應(yīng)使用同樣的傳輸波特率,這是確保通信成功的重要條件之一。下面僅對通信中波特率的設(shè)置問題作一些論述,供大家參考。
在IBM - PC/XT系統(tǒng)中,配備有異步通信適配器,該板上設(shè)有INS8250異步通信接口。PC機上波特率的設(shè)置是通過對8250初始化而實現(xiàn)的。在8250端口寄存器中,3FSH和3F9H分別設(shè)置為波特率因子的低8位和高8位值。該因子取值范圍為1~65 535,對輸入時鐘(1. 843 2 MHz)進(jìn)行分頻,產(chǎn)生16倍波特率的波特率發(fā)生器時鐘(BAUDOUT),因而
對8250初始化預(yù)置了波特率因子之后,波特率發(fā)生器方可產(chǎn)生規(guī)定的波特率。
51單片機串行通信的波特率因串行口工作方式選擇不同而異。它除了與系統(tǒng)的振蕩頻率、電源控制寄存器PCON的SMOD位有關(guān)外,還與定時器T1的設(shè)置有關(guān)。
在串行口工作方式O時,波特率固定不變,其大小為foSC/12。在串行口方式2時,波特率也只固定為兩種,與SMOD位的值有關(guān):當(dāng)SMOD-O時,波特率為foSC/64;當(dāng)SMOD=1時,波特率為foSC/32。串行口方式1、3的波特率是可變的,除與SMOD位的取值有關(guān)外,主要取決于定時器1的溢出率。當(dāng)定時器1用作串行通信的波特率發(fā)生器時,波特率可由下式確定:
波特率=T1溢出率/n
式中:n=32或16,對應(yīng)于PCON中SMOD=O或1。而Ti的溢出率取決于計數(shù)速率和定時時間常數(shù),即
T1溢出率=計數(shù)速率/256-x
此時T1工作于方式2,即8位自動裝載方式。這種方式可以避免重新設(shè)定定時初值。式中x即為在TH1和TL1中裝入的初始計數(shù)值。定時器1的計數(shù)速率與定時器工作方式的選擇有關(guān)。當(dāng)選擇T1為定時工作方式時,其計數(shù)輸入脈沖為內(nèi)部時鐘信號,即每個機器周期使寄存器值加1,而每個機器周期為12個振蕩周期,故計數(shù)速率為fosc/12。若系統(tǒng)fosc=12 MHz,則T1計數(shù)速率為fosc/12=1 MHz。由此可得出
例如,假定串行通信雙方波特率要求為9 600 b/s.系統(tǒng)振蕩頻率fosc=11. 59 MHz,當(dāng)SMOD選為1時,TH1、TL1的初值計算如下:
將此值置入TH,、TL1時,波特率發(fā)生器產(chǎn)生的實際的傳輸速率為
在這種情況下,PC機與單片機可以進(jìn)行正常的接收與發(fā)送。
根據(jù)以上條件,若系統(tǒng)采用12 MHz系統(tǒng)時鐘,按照上面公式計算可得出z≈250或249(FAH或F9H)。此時在THi和TL1中置入FAH或F9H時,實際的傳輸速率為10 416. 67或8 928. 57 b/s,其誤差分別為-8.5%或+7%。
實踐表明,PC機與單片機在這種條件下不能實現(xiàn)正常的接收與發(fā)送。
上面的計算表明,在串行通信中,當(dāng)規(guī)定了傳輸速率以后,波特率的設(shè)置與系統(tǒng)使用的振蕩頻率有著很重要的作用,可直接影響通信的成功與失敗。上例中,當(dāng)雙機約定了傳輸速率為9600 b/s時,若系統(tǒng)振蕩頻率為12 MHz或6 MHz,PC機的波特率為9 600 b/s,而單片機實際的波特率大于(或小于)9 600 b/s.則波特率誤差為8.5%。也就是說,若PC機以101.17 μs的時間發(fā)送一位數(shù)據(jù),則單片機以96 μs的時間接收一位數(shù)據(jù)。在接收一幀數(shù)據(jù)的過程中,由于誤差的累積,則產(chǎn)生了錯碼。
我們知道,在單片機的串行接收方式(1、2、3)中,CPU以16倍波特率的采樣速率不斷對接收數(shù)據(jù)(RxD)采樣,一旦檢測到由1到0的負(fù)跳變,16分頻計數(shù)器立刻復(fù)位,使之滿度翻轉(zhuǎn)的時刻恰好與輸入位的邊沿對準(zhǔn)。16分頻計數(shù)器把每個接收位的時間分為16份,在中間三位即7、8、9狀態(tài)時,位檢測器對RxD端的值采樣,并以3取2的表決方式,確定所接收的數(shù)據(jù)位。這3個狀態(tài),理論上對應(yīng)于每一位的中間段,若發(fā)送端與接收端的傳輸速率不一致,就會發(fā)生采樣偏移。這種傳輸速率的誤差在允許范圍內(nèi)不致產(chǎn)生錯位或漏碼;但當(dāng)誤差超出允許范圍時,便會發(fā)生錯位,使接收的某數(shù)據(jù)重復(fù)接收,因而產(chǎn)生接收數(shù)據(jù)錯。
下面僅對由波特率誤差引起的錯碼現(xiàn)象作一分析。例如PC機與單片機的通信速率約定為9 600 b/s,系統(tǒng)時鐘為6 MHz時,為了按約定的速率通信,PC機在8250異步通信接口中的3F8H和3F9H寄存器中設(shè)定波特率因子分別為OCH和OOH;而單片機中定時器1初值TH1=TL1 =FDH。此時,PC機發(fā)送數(shù)據(jù)與單片機接收數(shù)據(jù)情況如下:
PC機發(fā)送數(shù)據(jù) 單片機接收數(shù)據(jù)
10H—1FH 30H~3FH
以上數(shù)據(jù)表明了接收數(shù)據(jù)中出現(xiàn)的錯碼情況。通過對上述錯碼進(jìn)行剖析可以看到:當(dāng)因波特率誤差引起接收端采樣偏移時,如果這個偏移使得接收某數(shù)據(jù)位的采樣在該位中點的半位間隔時,將會對該位采樣兩次,因而形成了上面的錯碼情況。下面公式表明錯碼或漏碼發(fā)生的位數(shù)N:
即當(dāng)串行異步通信的幀格式為11位時:
●N≤11,表示一幀數(shù)據(jù)中有某位被采樣錯,且采樣出錯在第N位;
●N>ll,表示一幀數(shù)據(jù)中沒有數(shù)據(jù)位發(fā)生采樣錯。
本例中,波特率誤差為8. 5%,由上面公式得出8.5%×11=0.935>0.5,說明在這個波特率誤差下將出現(xiàn)采樣錯,且出錯位為:
即在數(shù)據(jù)幀包括起始位的第6位發(fā)生錯碼,在第6位采樣了兩次,因而得到上面錯碼情況。
由此可以類推出錯誤的接收數(shù)據(jù)。
相反,當(dāng)PC機的傳送波特率大于單片機的傳送波特率時,則會在第N位出現(xiàn)漏碼錯誤。這里不再贅述。
由上面的公式還可以推斷出,當(dāng)波特率相對誤差小于4. 5%時,這種采樣的偏移將不影響正常的數(shù)據(jù)接收。但一般為了保證傳輸?shù)目煽啃?,通常波特率誤差不大于2.5%,而盡量選擇最小的傳輸誤差率。
在波特率的設(shè)置中,還有一個問題值得注意,這就是SMOD位的選擇也影響著波特率的準(zhǔn)確率。請看下面例子:
設(shè)波特率為2 400 b/s,fosc=6 MHz時,SMOD可以任選為0或1。但是由于對SMOD不同的選擇,產(chǎn)生了不同的波特率誤差:
上面的分析說明了SMOD值雖然是可以任意選擇的,但在某些情況下,它直接影響著波特率誤差范圍,因而在波特率設(shè)置時,對SMOD的選取也需要做適當(dāng)?shù)目紤]。
以上對串行通信所必須涉及的波特率設(shè)置問題作了一些分析。由此可以看出,在異機種的串行通信中,波特率的設(shè)置是很重要的問題,它直接關(guān)系著串行通信的成功與失敗,因此在波特率設(shè)置時需要給予足夠的認(rèn)識。