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