關於串列埠通訊波特率的幾點思考

2022-01-24 15:46:20 字數 3156 閱讀 2867

首先想說,12mhz真的是有問題。

我使用的是

stc89c52rc的微控制器,他的最小系統板的的晶振是12mhz,但是這個開發板上買的晶振就沒寫頻率!!!我一直以為這是預設的11.0592mhz,因為之前用的最小系統板都是這個頻率。在沒有使用串列埠通訊的時候,不管是11.0592m還是12m,都對程式的影響不是很大,所以一直沒有太注意這方面的問題。

直到今天,需要用到uart串列埠通訊,搞了快兩天,輸出到電腦端一直是亂碼!!!真的差點都放棄了。現在想想幸好當時沒有放棄。現在終於想通了。

其實就是晶振的問題。實際上我的這個板子上是12mhz,而書上和我在網上找到的例程上面都是按照11.0592m計算的。所以我在乙個錯誤的基礎上面,肯定找不到正確的出路。

首先,通訊波特率的定時器初值的計算公式:

th1 = tl1 = 256 - 晶振/12/16/波特率/2.

如果寫了pcon=0x80,就不需除2.,pcon為電源管理暫存器,他的最高位可以把波特率提高一倍。

在這裡 ,256是8位定時器的溢位值,也就是tl1的溢位值。12是說乙個乙個機器週期等於12個時鐘週期,值得關注的是16,在51微控制器內建的串列埠模組中,他採取的方式是把一位訊號採集16次,然後把第7、8、9次取出來,如果這三次中其中有兩次是高電平的話,就認定這一位資料是1,如果兩次資料是低電平,就認為是0.這樣可以提高通訊的容錯率。

首先先說一下為什麼波特率 要設定成4800,9600,19200等等類似這樣的 數?為什麼不是12345?我在一片部落格中找到了可能的答案。

傳送門:

1:根據電、傳輸介質等的物理特性結合串列埠裝置使用的要求

為了保證有效通訊,根據電、傳輸介質等的物理特性結合串列埠裝置使用的要求,確定rs232最大傳輸速率只能是115200,然後逐級二分得到57600,28800,19200……為適應這些速率,設計相應的晶振頻率。

2:這是由電信線路特性決定的

**線路的帶通是300--3khz,當時hayes先搞的modem,所以用的2400hz訊號,對應波特率是2400。由於基本頻率確定了,以後採用的提高通訊速率的方法都是在2400基礎上倍頻的,所以形成了9600,19200。

不管哪種說法,都是先有波特率再有晶振頻率。重點:先有波特率再有晶振頻率!!!!

也就是說,人們首先通過實驗發現了合適的傳輸波特率,然後根據這個波特率及其倍頻,計算出了合適的微控制器時鐘頻率,也即是我們的晶振頻率。

使用多了會發現,採用這個公式計算的時候,有時候會出現小數點的情況。這也是為什麼晶振使用11.0592的原因。當使用這個頻率的晶振,計算的時候,基本不會出現小數點 。而使用12m的時候,很多小數點。

那麼我們先不管這個11.0592到底是怎麼來的?我們就看一下這個頻率和12m的頻率的對比,他們分別使用的時候,計算出來的th1的初值到底是多少。

下面**的資料是我通過上面的公式計算出來的。

可以看出,在12m的時候,只有把波特率2400bps/s最合適,誤差是0.16%,這樣就不會產生亂碼了,th1和tl1都設為0xf3。其他小數點都不合適,四捨五入的話,誤差率也比較大。9600的情況下會有7.8%的誤差,所以會產生亂碼,其實我試了一次,9600波特率的時候,無法實現傳輸。但是我不是很清楚他的這個誤差是怎麼算出來的,如果你看到這個,又恰巧你知道 這個問題,那麼想麻煩你在下面回覆一下,謝謝。

在12m晶振下,我嘗試了用2400波特率和4800波特率進行傳輸,結果如下,

這是4800波特率的,可以看到,誤差還是挺大的了。

這是2400波特率的傳輸,發現基本沒有錯誤:

還有一點,就是我發現,在程式裡面 是直接把那個公式寫進去還是先自己算出來值化為16進製制,在賦給th1和tl1,這兩種情況的傳輸效果是不同的。我估計就是因為12m晶振的問題,因為用公式算出來 的值小數點挺多的,會產生誤差 ,而自己給的是乙個確定的值。所以盡量自己先算出來,然後賦值,這樣比較精確,實在不知道的話,就把小數點的尾數是進製還是捨去都試一遍,看看哪個的傳輸效率更高一點。

下面是直接用公式的,發現誤差很大。基本上收不到資料。

2400的波特率計算公式也是一樣,基本收不到資料,只有自己計算出來才行

為什麼51微控制器的晶振一般使用11.0592?

用11.0592晶振的原因是51微控制器的定時器導致的。用51微控制器的定時器做波特率發生器時,如果用11.0592mhz的晶振,根據公式算下來需要定時器設定的值都是整數;如果用12mhz晶振,則波特率都是有偏差的,比如9600,用定時器取0xfd,實際波特率10000,一般波特率偏差在4%左右都是可以的,所以也還能用stc90c516 晶振12m 波特率9600 ,倍數時誤差率6.99%,不倍數時誤差率8.51%,資料肯定會出錯。 這也就是串列埠通訊時大家喜歡用11.0592mhz晶振的原因,在波特率倍速時,最高可達到57600,誤差率0.00%。 用12mhz,最高也就4800,而且有0.16%誤差率,但在允許範圍,所以沒多大影響。

總結:

1、檢查你的晶振頻率,盡量自己先算出定時器初始值。然後賦給th1。

2、如果你的晶振是12mhz的,那麼很遺憾,雖然你的頻率很高,但是當你使用uart串列埠的時候會很難受。只能選取2400,    0xf3,有乙個小技巧,你也可以使用倍頻,把pcon| = 0x80,然後使用4800.計算出來的值和2400一樣,但是快了一倍。

3、如果你的晶振是11.0592mhz的話。也慢不到**去,普通需求還是可以滿足的。但是他的優勢體現在你使用uart串列埠的時候,很多波特率可以選擇。所以就很nice。

串列埠 波特率概念

波特率 系統中單位時間內傳輸的碼元 脈衝 個數。碼元 和進製有關,對於m進製碼元,位元率 資訊速率 rb與波特率 碼元速率 rb的關係式為 rb rb lbm。式中 lbm log2m,表示m的以2為底的對數。顯然,對於二進位制碼元,由於lb2 1,所以rb rb,即波特率與位元率在數 值上相等,但...

串列埠波特率的理解

bit就是位,也叫位元位,是計算機中最小的單位 byte是位元組,也就是b 1位元組 byte 8位 bit 既 位只有兩種形式0和1,只能表示2種狀態,而位元組是有8個位組成的。可以表示256個狀態。1byte 8 bit,1kb 1024 byte,1mb 1024 kb,1g 1024 mb,...

串列埠波特率等概念

1 位元率 9600bps 就是每秒中傳輸9600bit,也就是相當於每一秒中劃分成了9600等份。如此,那麼每1bit的時間就是1 9600秒 104.16666666666666666666666666667us。約0.1ms。既然是9600等份,即每1bit緊接著下乙個位元,不存在額外的間隔。...