新聞中心

EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計應(yīng)用 > 51 單片機串行通訊中波特率的自動檢測

51 單片機串行通訊中波特率的自動檢測

作者: 時間:2012-10-16 來源:網(wǎng)絡(luò) 收藏

本文介紹一種在 80C51 應(yīng)用中自動檢測的方法。按照經(jīng)驗,程序起動后所接收到的第1個字符用于測量。
這種方法可以不用設(shè)定難于記憶的開關(guān),還可以免去在有關(guān)應(yīng)用中使用多種不同的煩惱。人們可以設(shè)想:一種可靠地實現(xiàn)自動波特檢測的方法是可能的,它無須嚴(yán)格限制可被確認(rèn)的字符。問題是:在各種的條件下,如何可以在大量允許出現(xiàn)的字符中找出波特率的定時間隔。
顯然,最快捷的方法是檢測一個單獨位時間(single bit time),以確定接收波特率應(yīng)該是多少??墒?,在 RS-232 模式下,許多 ASCII 字符并不能測量出一個單獨位時間。對于大多數(shù)字符來說,只要波特率存在合理波動(這里的波特率是指標(biāo)準(zhǔn)波特率),從起始位到最后一位“可見”位的數(shù)據(jù)傳輸周期就會在一定范圍內(nèi)發(fā)生變化。此外,許多系統(tǒng)采用 8 位數(shù)據(jù)、無奇偶校驗的格式傳輸 ASCII 字符。在這種格式里,普通 ASCII 字節(jié)不會有 MSB 設(shè)定,并且,UART總是先發(fā)送數(shù)據(jù)低位(LSB),后發(fā)送數(shù)據(jù)高位(MSB),我們總會看見數(shù)據(jù)的停止位。
在下面的波特率檢測程序中,先等待輸入管腳的起始信號(下降沿),然后起動定時器T0。在其后的串行數(shù)據(jù)的每一個上升沿,將定時器 T0的數(shù)值捕獲并保存。當(dāng)定時器T0溢出時,其最后一次捕獲的數(shù)值即為從串行數(shù)據(jù)起始位到最后一個上升沿(我們假設(shè)是停止位)過程所持續(xù)的時間。
CmpTable 表格列出了每一波特率的最大測量時間。這些數(shù)據(jù)是經(jīng)過選擇的,所以,4 個數(shù)據(jù)位時間(加上起始位時間)仍可產(chǎn)生正確的波特率。
使用這種方法時,必須遵守一個假設(shè):這種技術(shù)僅取決于所接收到的一個字符,接收這個字符的波特率必須大于最低波特率。本質(zhì)上來說,這意味著這個字符必須來自正常敲擊鍵盤時所產(chǎn)生的字符。
在PC上,我們不可能快速、連續(xù)地敲擊兩個字符,以欺騙程序。但是,PC的功能鍵具有一個問題,因為它會連續(xù)發(fā)送兩個緊挨著的字符,使程序檢測得到錯誤的波特率。在為 12MHz時鐘頻率而設(shè)計的的例子程序中,其總采樣時間大約為 65mS,大約可以在 RS-232 通訊中以300bps的速度發(fā)送兩個字符。
假如使用了奇偶校驗,當(dāng)4 個MSB以及所接收字節(jié)的奇偶校驗位均這同一值時,就可能會發(fā)生錯誤。這類錯誤的發(fā)生取決于系統(tǒng)是使用了奇校驗或偶校驗,可能發(fā)生于小寫的字母“p”到“z”,還有花括號({})、垂直條(|)、波紋線(~),以及刪除鍵“delete”。值得注意的是,慣常的提示符按鍵(如,空格鍵、回車鍵、及返回鍵),是沒有這些限制的(奇數(shù)還是偶數(shù)的限制?)。
在以此方式運行程序時,如第一個字節(jié)已經(jīng)過去,但串行口(UART)的波特率未能正確設(shè)置,那將造成用于檢測波特率的第一個字符丟失。同樣,如果在正常通訊中檢測到串行口的通訊“幀”錯誤,絕大部分“實時”程序必須重復(fù)這一檢測波特率的過程。
如需采用另外設(shè)定的晶體振蕩頻率、波特率,請使用下列公式計算 CmpTable的表項目:
51 單片機串行通訊中波特率的自動檢測
記住,表項目是兩個字節(jié)的數(shù)值,所以上述公式的結(jié)果一定要分成高位字節(jié)及低位字節(jié)(如果采用十六進(jìn)制,則容易得出高位、低位字節(jié))。當(dāng)然,也可以用匯編程序來完成所有的運算。
上述的公式是由以下得來的:
51 單片機串行通訊中波特率的自動檢測
51 單片機串行通訊中波特率的自動檢測
備注:在 8-N-1 格式的數(shù)據(jù)通訊中,‘#-of-bits’(“可見”位數(shù))是 9,以及‘bits-to-recognize’(最小認(rèn)可位數(shù))是5。
51 單片機串行通訊中波特率的自動檢測
;**********************************************
;自動的波特率檢測程序
;**********************************************************
$ Title(Automatic Baud Rate Detection Test)
$ Date(12–16–91)
$ MOD552
;*******************************************************
; Definitions
;*************************************************
RX BIT P3.0 ;串行口的接收管腳
CharH DATA 30h ;捕獲定時器T0的高位字節(jié)
CharL DATA 31h ;捕獲定時器T0的低位字節(jié)
BaudRate DATA 32h ;存貯最終確定的波特率
Display EQU P4 ;顯示結(jié)果的端口
;*******************************************************
; Reset and Interrupt Vectors
;***************************************************
ORG 8000h
Start: ACALL AutoBaud ;檢測波特率
MOV Display, BaudRate ;顯示波特率值
SJMP Start
;**********************************************************
; Subroutines
;**********************************************************
;AutoBaud Rate Detect Routine.
;通過測量接收第一個字符所需要的時間來確定波特率。部分接收字符可能會發(fā)生錯誤,
;主要是那些以3(4?)位同樣數(shù)值結(jié)束的字符。波特率指針(檢測結(jié)果)保存在ACC中。
;********************************************************


上一頁 1 2 下一頁

關(guān)鍵詞: 51單片機 串行通訊 波特率

評論


相關(guān)推薦

技術(shù)專區(qū)

關(guān)閉