新聞中心

EEPW首頁 > 嵌入式系統 > 設計應用 > 51 單片機串行通訊中波特率的自動檢測

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

作者: 時間:2012-10-16 來源:網絡 收藏

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


上一頁 1 2 下一頁

評論


相關推薦

技術專區(qū)

關閉