單片機c語言教程:C51開關(guān)分支語句
波特率 在使用串行口做通信時,一個很重要的參數(shù)就是波特率,只有上下位機的波特率 一樣時才能進行正常通信。波特率是指串行端口每秒內(nèi)能傳輸?shù)牟ㄌ匚粩?shù)。有一些開始學習 的朋友認為波特率是指每秒傳輸?shù)淖止?jié)數(shù),如標準 9600 會被誤認為每秒種能傳送 9600 個字節(jié),而實際上它是指每秒能傳送 9600 個二進位,而一個字節(jié)要 8 個二進位,如用串 口模式 1 來傳輸那么加上起始位和停止位,每個數(shù)據(jù)字節(jié)就要占用 10 個二進位,9600 波特 率用模式 1 傳輸時,每秒傳輸?shù)淖止?jié)數(shù)是 9600÷10=960 字節(jié)。51 芯片的串行口工作模式 0 的波特率是固定的,為 fosc/12,以一個 12M 的晶體震蕩器來計算,那么它的波特率能達到 1M。 模式 2 的波特率是固定在 fosc/64 或 fosc/32,具體用那一種就取決于 PCON 寄存器中的 SMOD 位,如 SMOD 為 0,波特率為 focs/64,SMOD 為 1,波特率為 focs/32。模式 1 和模式 3 的波 特率是可變的,取決于定時器 1 或 2(52 芯片)的溢出速率。那么我們怎么去計算這兩個模 式的波特率設(shè)置時相關(guān)的寄存器的值呢?能用以下的公式去計算。
波特率=(2SMOD÷32)×定時器 1 溢出速率
上式中如設(shè)置了 PCON 寄存器中的 SMOD 位為 1 時就能把波特率提升 2 倍。通常會使用 定時器 1 工作在定時器工作模式 2 下,這個時候定時值中的 TL1 做為計數(shù),TH1 做為自動重裝值 , 這個定時模式下,定時器溢出后,TH1 的值會自動裝載到 TL1,再次開始計數(shù),這樣能不 用軟件去干預(yù),使得定時更準確。在這個定時模式 2 下定時器 1 溢出速率的計算公式如下:
溢出速率=(計數(shù)速率)/(256-TH1) 上式中的“計數(shù)速率”與所使用的晶體振蕩器頻率有關(guān),在 51 芯片中定時器啟動后會
在每一個機器周期使定時寄存器 TH 的值增加一,一個機器周期等于十二個振蕩周期,所以
能得知 51 芯片的計數(shù)速率為晶體振蕩器頻率的 1/12,一個 12M 的晶體震蕩器用在 51 芯片上, 那么 51 的計數(shù)速率就為 1M。通常用 11.0592M 晶體是為了得到標準的無誤差的波特率,那 么為何呢?計算一下就知道了。如我們要得到 9600 的波特率,晶體震蕩器為 11.0592M 和 12M,定 時器 1 為模式 2,SMOD 設(shè)為 1,分別看看那所要求的 TH1 為何值。代入公式:
11.0592M
9600=(2÷32)×((11.0592M/12)/(256-TH1))
TH1=250 //看看是不是和上面實例中的使用的數(shù)值一樣?
12M
9600=(2÷32)×((12M/12)/(256-TH1)) TH1≈249.49
上面的計算能看出使用 12M 晶體的時候計算出來的 TH1 不為整數(shù),而 TH1 的值只能取整數(shù),這樣它就會有一定的誤差存在不能產(chǎn)生精確的 9600 波特率。當然一定的誤差是能 在使用中被接受的,就算使用 11.0592M 的晶體振蕩器也會因晶體本身所存在的誤差使波特率產(chǎn)生誤差,但晶體本身的誤差對波特率的影響是十分之小的,能忽略不計。
評論