51的定時(shí)計數器和串口的波特率到底關(guān)系
SM0 SM1 SM2 REN TB8 RB8 TI RI
SM0、SM1 為串行口工作模式設置位,這樣兩位可以對應進(jìn)行四種模式的設置。串行口工作模式設置。
波特率在使用串口做通訊時(shí),一個(gè)很重要的參數就是波特率,只有上下位機的波特率一樣時(shí)才可以進(jìn)行正常通訊。波特 率是指串行端口每秒內可以傳輸的波特位數。這里所指的波特率,如標準9600 不是每秒種可以傳送9600個(gè)字節,而是指每秒可以傳送9600 個(gè)二進(jìn)位,而一個(gè)字節要8 個(gè)二進(jìn)位,如用串口模式1 來(lái)傳輸那么加上起始位和停止位,每個(gè)數據字節就要占用10 個(gè)二進(jìn)位,9600 波特率用模式1 傳輸時(shí),每秒傳輸的字節數是9600÷10=960 字節。
51芯片的串口工作模式0的波特率是固定的,為fosc/12,以一個(gè)12M 的晶振來(lái)計算,那么它的波特率可以達到1M。模式2的波特率是固定在fosc/64 或fosc/32,具體用那一種就取決于PCON 寄存器中的SMOD位,如SMOD 為0,波特率為focs/64,SMOD 為1,波特率為focs/32。
模式1和模式3的波特率是可變的,取決于定時(shí)器1或2(52芯片)的溢出速率,就是說(shuō)定時(shí)器 1每溢出一次,串口發(fā)送一次數據。那么我們怎么去計算這兩個(gè)模式的波特率設置時(shí)相關(guān)的寄存器的值呢?可以用以下的公式去計算。
上式中如設置了PCON寄存器中的SMOD位為1時(shí)就可以把波特率提升2倍。通常會(huì )使用定時(shí)器1工作在定時(shí)器工作模式2下,這時(shí)定時(shí)值中的TL1做為計 數,TH1做為自動(dòng)重裝值,這個(gè)定時(shí)模式下,定時(shí)器溢出后,TH1的值會(huì )自動(dòng)裝載到TL1,再次開(kāi)始計數,這樣可以不用軟件去干預,使得定時(shí)更準確。在這 個(gè)定時(shí)模式2下定時(shí)器1溢出速率的計算公式如下:
溢出速率=(計數速 率)/(256-TH1初值)
上式中的“計數速率”與所使用的晶體振蕩器頻率有關(guān),在51 芯片中定時(shí)器啟動(dòng)后會(huì )在每一個(gè)機器周期使定時(shí)寄存器TH 的值增加一,一個(gè)機器周期等于十二個(gè)振蕩周期,所以可以得知51芯片的計數速率為晶體振蕩器頻率的1/12,一個(gè)12M 的晶振用在51芯片上,那么51的計數速率就為1M。通常用11.0592M 晶體是為了得到標準的無(wú)誤差的波特率,那么為何呢?計算一下就知道了。如我們要得到9600 的波特率,晶振為11.0592M 和12M,定時(shí)器1 為模式2,SMOD 設為1,分別看看那所要求的TH1 為何值。代入公式:
11.0592M
9600=(2÷32)×((11.0592M/12)/(256-TH1))
TH1=250
12M
9600=(2÷32)×((12M/12)/(256-TH1))
TH1≈249.49
上面的計算可以看出使用12M晶體的時(shí)候計算出來(lái)的TH1不為整數,而TH1的值只能取整數,這樣它就會(huì )有一定的誤差存在不能產(chǎn)生精確的9600 波特率。當然一定的誤差是可以在使用中被接受的,就算使用11.0592M 的晶體振蕩器也會(huì )因晶體本身所存在的誤差使波特率產(chǎn)生誤差,但晶體本身的誤差對波特率的影響是十分之小的,可以忽略不計。
評論