摘要:傳統(tǒng)方法設(shè)計單片機(jī)串行口波特率時,往往要使用特殊頻率的晶振。本文在分析MCS-51單片機(jī)串行口工作原理的基礎(chǔ)上,提出基于12MHz晶振的單片機(jī)系統(tǒng),通過編程實現(xiàn)所需波特率的插值調(diào)整設(shè)計方法。
關(guān)鍵詞:單片機(jī) 串行口 波特率 調(diào)整
引言
單片機(jī)在當(dāng)今的儀表及工業(yè)測控設(shè)備上應(yīng)用相當(dāng)廣泛,在構(gòu)成分布式系統(tǒng)進(jìn)行較長距離數(shù)據(jù)通信或是要求用有限的硬件資源進(jìn)行數(shù)據(jù)交換時,都要用到串行口。也正是串行口使得MCS-51單片機(jī)增色不少,成為單片機(jī)開發(fā)應(yīng)用中不可缺少的部分。
1 MCS-51單片機(jī)串行口工作原理
MCS-51單片機(jī)串行口采用異步通信方式。異步通信方式是以字為單位來傳送數(shù)據(jù)的。每一個字由起始位、數(shù)字位、奇偶檢驗位、停止位等構(gòu)成,稱為一幀,如圖1所示。在幀格式中,一個字由起始位開始,至停止位結(jié)束。起始位為0,用來通知接收端一個新的字開始到來,同時,起始位還被用作接收端的同步時鐘,以保證后面的接收能正確進(jìn)行。起始位后是5~8位數(shù)據(jù),接著是奇偶校驗位(可省略),最后是停止位。停止位為1。

下面以單片機(jī)串行口工作方式3為例說明其工作原理。串口在發(fā)送時,內(nèi)部有一個16(當(dāng)SMOD=1時)分頻計數(shù)器,用于計算T1的溢出。當(dāng)16分頻計數(shù)器每次滿度翻轉(zhuǎn)時(由全1變?nèi)?)的那個機(jī)器周期,即把1位寫入“SBUF”中的數(shù)據(jù)送到TXD口上。
圖2為接收時序圖。在接收時,接收器在每一個接收時鐘的上升沿(T1的溢出信號)采樣接收數(shù)據(jù)線RXD。當(dāng)發(fā)現(xiàn)出現(xiàn)負(fù)跳變時,16分頻計數(shù)器就立刻復(fù)位,以使計數(shù)器滿度翻轉(zhuǎn)的刻度恰好與輸入位的邊沿對準(zhǔn)。在以后的接收里,16分頻計數(shù)器計算T1的溢出,每滿度翻轉(zhuǎn)1次就接收1位數(shù)據(jù)。在計數(shù)器第7、8、9狀態(tài)時,所對應(yīng)的T1溢出作為位檢測采樣控制脈沖。每個脈沖控制位檢測器對RXD端口采樣1次,這3個脈沖理論上對應(yīng)于每一位的中央段,采樣的結(jié)果按三中取二法確定RXD的值,以抑制干擾。如果所接收的第一位不是0,說明不是一幀數(shù)據(jù)的起始位,該位被摒棄,接收電路復(fù)位,等待下一個負(fù)跳變。
參看串口接收脈沖時序圖,若所接收的數(shù)據(jù)與接收終端自身的波特率設(shè)置有差異,即在接收起始位時,由于起始位的同步作用,7、8、9三個位采樣檢測脈沖處在該數(shù)據(jù)位的中斷。隨著接收的進(jìn)行,檢測采樣脈沖將逐步偏離接收數(shù)據(jù)的中央,在接收停止位時偏移達(dá)到最大值。但由于下一幀起始接收停止位時偏移達(dá)到最大值。但由于一幀起始位的同步作用,致使前面累積的誤差對以后的接收不影響。因此只要這種偏移在允許范圍內(nèi)就不至于發(fā)生錯位或漏碼。由分析可知,當(dāng)檢測時鐘脈沖對于接收數(shù)據(jù)的累積誤差達(dá)50%,則采樣的最后一位數(shù)據(jù)已處于檢測時鐘有效與無效的臨界狀態(tài),這時就可能出錯?紤]到器件的離散性,累積誤差不應(yīng)大于標(biāo)準(zhǔn)值的25%。因此,對于常用的9位和11位一幀的串行傳輸,通常規(guī)定其最大的波特率允許誤差分別為2.8%和2.3%。

2 波特率傳統(tǒng)設(shè)計方法
MCS-51單片機(jī)串行口波特率的傳統(tǒng)設(shè)計,通常是把定時器T1置于工作方式2(8位自動重裝定時初值方式)。這樣,只要給T1裝入初值,啟動T1便會產(chǎn)生相應(yīng)的溢出,串行口工作方式1、3的波特率計算公式為

整理后,得到定時器T1在相應(yīng)波特率時的初裝值:

式中:SMOD-波特率倍增位;fosc-振蕩頻率;X-定時器初值
若用戶板采用的是常用的12 MHz晶振,即有許多常見的波特率由式(2)算得X值非整數(shù)。此,常見的參考資料會使用特定的晶振來獲取所需的波特率。
其實,由前面分析可知,數(shù)據(jù)傳輸以幀為單位,每幀開關(guān)的起始位同時具有同步時鐘的作用。因此,只要在每幀內(nèi)的誤差足夠小就可以了,追求過高的精度并無多大的意義。表1給出了幾種采用12 MHz晶振得到的常用波特率及其誤差值。
表1 采用12MHz晶振產(chǎn)生的常用波特率
| 波特率/Bs-1 | fosc/MHz | SMOD | 定時器T1 | 誤差/% | ||
| C/T | 方式 | 重裝初值 | ||||
| 方式1、3:62500 4800 2400 1200 137.5 | 12 12 12 12 12 | 1 1 1 1 0 | 0 0 0 0 0 | 2 2 2 2 2 | FFH F3H E6H CCH 1DH | 0.16 0.16 0.16 0.12 |





