林志琦, 任超越, 張 睿
(長春工業(yè)大學(xué) 電氣與電子工程學(xué)院, 吉林 長春 130012)
隨著計算機(jī)網(wǎng)絡(luò)化與微機(jī)分級分布式應(yīng)用系統(tǒng)的發(fā)展,通信在各方面顯得尤為重要。通信是指計算機(jī)與外界進(jìn)行信息傳輸,既包含計算機(jī)和計算機(jī)之間的傳輸,也包括計算機(jī)和外部設(shè)備,例如終端、掃描儀和移動硬盤等設(shè)備之間的傳輸[1]。單片機(jī)的串口通信是自動化工業(yè)、智能終端、光電系統(tǒng)等領(lǐng)域非常重要的信息傳輸手段。在光電系統(tǒng)中,單片機(jī)一般充當(dāng)控制器的角色,通過串口發(fā)送一定格式的數(shù)據(jù)來控制與之相連設(shè)備的動作,同時設(shè)備也會將一些自身的狀態(tài)信息反饋給單片機(jī),供單片機(jī)進(jìn)行判斷并進(jìn)行相應(yīng)的控制[2]。例如對云臺的控制,當(dāng)鍵盤輸入信息時,單片機(jī)和軟件相互配合對信息進(jìn)行識別,根據(jù)所識別的信息向云臺中的步進(jìn)電機(jī)發(fā)出指令,實現(xiàn)對方向角、俯仰角控制、速度控制和程序控制等功能[3]。云臺控制器通常以單片機(jī)為核心,通過單片機(jī)串口通信實現(xiàn)控制。
文中對標(biāo)準(zhǔn)51單片機(jī)串口數(shù)據(jù)傳輸?shù)姆绞竭M(jìn)行了改進(jìn)。標(biāo)準(zhǔn)51單片機(jī)在進(jìn)行串口傳輸數(shù)據(jù)時存在不足,當(dāng)串口傳輸速度增加時,波特率誤差將會增大,隨著誤差的增大,傳輸?shù)臄?shù)據(jù)會出現(xiàn)錯誤,直接影響了串口傳輸?shù)馁|(zhì)量。文中經(jīng)過對標(biāo)準(zhǔn)51單片機(jī)傳輸方式的改進(jìn),串口波特率誤差明顯減小,串口傳輸質(zhì)量顯著提高。
標(biāo)準(zhǔn)的51單片機(jī)有2個16位的定時計數(shù)器,2個外部中斷,5個中斷源,1個全雙工的異步串行通信接口[4]。在標(biāo)準(zhǔn)的51單片機(jī)中,沒有專門的波特率發(fā)生器,而是由定時計數(shù)器T1的溢出作為串口數(shù)據(jù)傳輸?shù)亩〞r基準(zhǔn)。在標(biāo)準(zhǔn)51單片機(jī)剛推出時,串口的數(shù)據(jù)傳輸速率在300~2 400 bit/s,傳輸每位二進(jìn)制數(shù)的時間在416~3 300 μs之間,而當(dāng)時的51單片機(jī)指令周期為1 μs,采用8位自動加載的工作方式時,最大溢出時間為256 μs,不能達(dá)到傳輸一位數(shù)據(jù)所需的時間。為了滿足416~3 300 μs的定時時間,標(biāo)準(zhǔn)51單片機(jī)的設(shè)計者在定時T1的溢出與串行數(shù)據(jù)收發(fā)移位寄存器之間加入了一個16/32進(jìn)制可選的計數(shù)器,對定時計數(shù)器的溢出進(jìn)行分頻,使其定時時間得到延長,從而滿足416~3 300 μs的定時需求[5],其工作原理如圖1所示。
圖1 51單片機(jī)波特率發(fā)生器工作原理圖
標(biāo)準(zhǔn)51單片機(jī)每計一個數(shù)的時間為一個機(jī)器周期,一個機(jī)器周期等于12個時鐘周期,如果用12 MHz晶振時產(chǎn)生9 600 bit/s的波特率,其誤差為3.3%,它是指傳輸一位數(shù)據(jù)的誤差,當(dāng)傳輸一幀數(shù)據(jù)時的誤差為33%,隨著誤差的增大,傳輸?shù)臄?shù)據(jù)會出現(xiàn)錯誤,其誤差過大的原因如下:
采用波特率計算公式:
(1)
(2)
式中:X----定時器初值。
這里以晶振頻率12 MHz,SMOD=0,波特率=9 600 bit/s為例, 根據(jù)式(1)、式(2)推導(dǎo)出:
(3)
由式(3)可以看出,如果定時器初值X想得到一個整數(shù)值,那么晶振頻率必須是波特率乘以32再乘以12的整數(shù)倍,通過計算可知6、12、 24 MHz等晶振頻率都不是波特率乘以32再乘以12的整數(shù)倍,所以X不可能為整數(shù)值,然而在裝載定時器初值時,X必須為整數(shù)(因為單片機(jī)計時時只能記錄整數(shù)個時鐘周期),所以產(chǎn)生誤差,其誤差產(chǎn)生的來源是由于T1溢出率存在誤差。選擇9 600 bit/s的波特率,傳送一個位數(shù)據(jù)所需要的時間為104.167 μs,那么
(4)
其中,T1溢出率在6、12、24 MHz等晶振頻率下(見圖1),經(jīng)過16分頻和2分頻,在SMOD=0時,根據(jù)式(4)T1的誤差放大了32倍,造成了誤差大于3.3%無法發(fā)送準(zhǔn)確數(shù)據(jù)的情況,所以51單片機(jī)在6、12、24 MHz等晶振頻率下無法產(chǎn)生任意波特率。
由于標(biāo)準(zhǔn)的51單片機(jī)的這種結(jié)構(gòu),當(dāng)串口通信速度由300~2 400 bit/s提高到9 600~115 200 bit/s,甚至256 000 bit/s時,就會出現(xiàn)誤差大于3.3%的情況,這也是標(biāo)準(zhǔn)51單片機(jī)設(shè)計的一個缺陷。以9 600 bit/s的波特率為例進(jìn)行分析。9 600 bit/s的串行數(shù)據(jù)傳輸速率,傳輸每位二進(jìn)制數(shù)據(jù)所需的時間為1/9 600=104.167 μs,這時要求T1的溢出時間為104.167 μs/32=3.255 μs或104.167 μs/16=6.510 μs,在通常的12 MHz時鐘頻率下,計數(shù)時間單位是1 μs,要產(chǎn)生3.255 μs或6.510 μs的延時,只能用3 μs或4 μs近似,這時的誤差為
和
這樣采取舍入的方法誤差見表1。
由表1可見,誤差已超過了最大誤差3.3%。標(biāo)準(zhǔn)51單片機(jī)發(fā)送一幀數(shù)據(jù)時,每3位檢測一次,以每個數(shù)據(jù)幀10位數(shù)據(jù),能識別的最大誤差為33%計算,則每個數(shù)據(jù)位的誤差應(yīng)小于(33%)/10=3.3%。
表1 在時鐘頻率為12 MHz、波特率為9 600 bit/s的情況下傳輸每位二進(jìn)制數(shù)的時間誤差
通過上面的分析知道,在波特率增加后,每位二進(jìn)制數(shù)據(jù)位的傳輸時間變短,而這個時間的16或32分之一就更小,而這時定時計數(shù)器以1 μs為時間單位的情況下,小數(shù)點后面的舍取對定時時間的影響很大,即這個誤差被放大了16倍或32倍[6]。定時時間大一個或小一個時間單位,它們的誤差都超過了3.3%。也就是由于標(biāo)準(zhǔn)51單片機(jī)波特率產(chǎn)生方式的特殊結(jié)構(gòu),在6、12、24 MHz等時頻都超過了3.3%。也就是說,由于標(biāo)準(zhǔn)51單片機(jī)波特率產(chǎn)生方式的特殊結(jié)構(gòu),在6、12、24 MHz等時頻率下產(chǎn)生不了任意的波特率。
在實際工作中,通常采用可行的方法是選擇一個小數(shù)時鐘頻率,如11.059 2 MHz,或22.118 4 MHz,此時可以產(chǎn)生9 600,19 200和38 400的波特率,但很難產(chǎn)生57 600和115 200等其他波特率。同時由于采用非整數(shù)時鐘頻率,使得定時很難產(chǎn)生整數(shù)的定時時間。而在標(biāo)準(zhǔn)的51單片機(jī)中為了產(chǎn)生整數(shù)的定時時間,通常采用6、12、24 MHz等時鐘頻率,為了解決這一矛盾,文中提出了一種可以讓標(biāo)準(zhǔn)51單片機(jī)在6、12、24 MHz等時鐘頻率下產(chǎn)生任意波特率的獨(dú)特、新穎的方法。
由以上分析可知,產(chǎn)生波特率誤差的原因由于對定時器T1的溢出時間進(jìn)行了1/16或1/32的分頻,使得定時器T1的溢出時間變短并且?guī)в行?shù),同時誤差也被放大了,實現(xiàn)這種去掉誤差放大現(xiàn)象的方法如圖2所示。
(a) 累積誤差
(b) 特殊方法
(c) 自動重新加載
標(biāo)準(zhǔn)51單片機(jī)的波特率累計誤差信號的產(chǎn)生見圖2(a),從圖中可以看到,收發(fā)一位串行數(shù)據(jù)的時間被平均分為16份或32份,這樣對每份的精度要求就提高了很多,如果采取特殊的方法,不是平均分配每次溢出的時間,那么就可以減小對每次溢出的精度要求,基于這種想法,我們將16次(或32次)溢出分為兩部分,一部分是連續(xù)的快速15次(或31次)溢出[7],此時定時器T1的初值為0FFH,定時器只需一個定時脈沖就可以溢出,這樣需要15個(或31個)時間單位,另外一部分定時時間為串行數(shù)據(jù)傳輸一位所需的時間減去那15(或31個)個單位時間,此時上電初始化的TL1的值由這個時間確定:
(5)
標(biāo)準(zhǔn)51單片機(jī)的定時器工作方式為自動重新加載方式[8],開始定時由TL1中的初值開始進(jìn)行加計數(shù),加到0FFH后再加一溢出,同時把其他TH1中的數(shù)值0FFH自動加載到TL1中,繼續(xù)進(jìn)行第二次定時,在上電初始化時TL1滿足傳輸一位二進(jìn)制數(shù)減去15(或31)的定時時間值,這樣就可以高精度的實現(xiàn)總的溢出時間為傳輸一位二進(jìn)制數(shù)時間的波特率(發(fā)生器見圖2(b))。當(dāng)然還有一個最大的問題,這種方法只能產(chǎn)生一次,滿足要求的波特率發(fā)生器定時,因為除了第一次的定時時間為初始化時的TL1值外,以后就都是由重新加載值0FFH了,為了重復(fù)以上過程,不斷產(chǎn)生滿足要求的波特率信號,在連續(xù)送15(31)次連續(xù)快速的溢出后要重新初始化一次TL1,這個任務(wù)由定時器T0完成[9]。
將T0定時時間為傳輸一幀數(shù)據(jù)的時間[10]。在T0中斷服務(wù)程序中,對TL1重新初始化一次,TH1仍然保持0FFH不變,就可以使上面的高精度波特率發(fā)生過程不斷重復(fù)下去(見圖2(c))。
經(jīng)過在多種型號的標(biāo)準(zhǔn)51單片機(jī)上實驗驗證時得到的實驗數(shù)據(jù)見表2。
表2 標(biāo)準(zhǔn)51單片機(jī)在6、12、24 MHz的時鐘頻率下產(chǎn)生任意的波特率的初始值
根據(jù)實驗,傳輸一位數(shù)據(jù)的時間波形如圖3所示。
(a) 改善之前
(b) 改善之后
沒有改進(jìn)之前的波形見圖3(a),傳輸一位數(shù)據(jù)所需要的時間為94.57 μs,而理論上波特率為9 600時,所需要的時間為104.167 μs,此時傳輸每位二進(jìn)制數(shù)的誤差為-9.21%。不能準(zhǔn)確收發(fā)數(shù)據(jù),改進(jìn)之后傳輸數(shù)據(jù)波形見圖3(b)。傳輸一位數(shù)據(jù)所需要的時間為104.63 μs,此時傳輸每位二進(jìn)制數(shù)據(jù)的誤差為0.44%;數(shù)據(jù)收發(fā)無誤。
標(biāo)準(zhǔn)51單片機(jī)在6、12、24 MHz的時鐘頻率下產(chǎn)生任意的波特率的測試程序:
#include
void main (void)
{
PCON = 0x80;
SCON = 0x50;/* SCON: mode 1, 8-bit UART, enable rcvr */
TMOD |= 0x22; /* TMOD: timer 1, timer 0, mode 2, 8bit reload */
TH1 = 0xff; /* TH1: reload value for 1200 baud @ 16MHz */
TL1 = 237; /*show tab 1*/
TH0 = 231; /*abut baud show tab 1 */
TL0 = 231; /*show tab 1*/
TCON = 0x50; /* :timer 1 & timer 0 run whih one time */
PT0 = 1;
ET0 = 1;
EA = 1;
while (1) { /* test progrqm loop output to uart 0~255 */
char i;
for(i=0;i<255;i++)
{
SBUF=i;
while (!TI)
{}
TI=0;
}
}
}
void plus_int1(void) interrupt 1
{
TL1 = 237; /*show tab 1*/
}
根據(jù)標(biāo)準(zhǔn)51單片機(jī)串口傳輸?shù)娜毕荩岢隽宋闹刑厥飧倪M(jìn)方法,并介紹了這種特殊方法的工作原理。實驗結(jié)果證明,對標(biāo)準(zhǔn)51單片機(jī)串口傳輸?shù)姆绞礁倪M(jìn)后,串口傳輸一位的誤差為0.44%,相比改進(jìn)之前的誤差有了明顯的改善。實現(xiàn)了標(biāo)準(zhǔn)51單片機(jī)在6、12、24 MHz等時鐘頻率下能夠產(chǎn)生任意的波特率。
[1] 李鵬.MCS-51系列單片機(jī)串行通信波特率的研究[J].電腦知識與技術(shù),2013(28):6265-6267.
[2] 宣明.微型機(jī)械及相關(guān)理論和技術(shù)[J].光學(xué)精密工程,1994,2(3):1-5.
[3] 韓雙喜.基于DSP的運(yùn)動姿態(tài)控制系統(tǒng)設(shè)計[J].世界電子元器件,2013(2):44-47.
[4] 陳粵初,竇振中.單片機(jī)應(yīng)用系統(tǒng)設(shè)計與實踐[M].北京:北京航空航天大學(xué)出版社,1991.
[5] 李會杰,李俊廷,張偉,等.一種51系列單片機(jī)的解密方法[J].長春工業(yè)大學(xué)學(xué)報,2017,38(4):335-339.
[6] 于建群,王立鼎,劉軍山.集成毛細(xì)血管電泳芯片的結(jié)構(gòu)及其制作技術(shù)研究進(jìn)展[J].中國機(jī)械工程,2003,14(2):166-175.
[7] 徐駿平,胡兵,馬平化,等.USB接口技術(shù)在激光打標(biāo)中的應(yīng)用[J].激光雜志,2006,27(3):77-78.
[8] 陳翠華,柴金華.模數(shù)轉(zhuǎn)換與波特率設(shè)置對大氣激光語音通信質(zhì)量的影響[J].量子電子學(xué)報,2006,32(2):225-230.
[9] 林志琦,李會杰,郎永輝,等.用四象限光電探測器獲得光斑參數(shù)[J].光學(xué)精密工程,2009,17(4):764-770.
[10] 張新寶,王海璇,周勝利,等.基于串口提高M(jìn)CU-51矩形單脈沖脈寬精度的方法[J].吉林大學(xué)學(xué)報,2016,34(4):496-500.