SM0 SM1 SM2 REN TB8 RB8 TI RI?
SM0、SM1 為串行口工作模式設置位,這樣兩位可以對應進行四種模式的設置。串行口工作模式設置。?
波特率在使用串口做通訊時,壹個很重要的參數就是波特率,只有上下位機的波特率壹樣時才可以進行正常通訊。波特率是指串行端口每秒內可以傳輸的波特位數。這裏所指的波特率,如標準9600 不是每秒種可以傳送9600個字節,而是指每秒可以傳送9600?個二進位,而壹個字節要8?個二進位,如用串口模式1?來傳輸那麽加上起始位和停止位,每個數據字節就要占用10?個二進位,9600?波特率用模式1?傳輸時,每秒傳輸的字節數是9600÷10=960?字節。?
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芯片)的溢出速率,就是說定時器1每溢出壹次,串口發送壹次數據。那麽我們怎麽去計算這兩個模式的波特率設置時相關的寄存器的值呢?可以用以下的公式去計算。?
上式中如設置了PCON寄存器中的SMOD位為1時就可以把波特率提升2倍。通常會使用定時器1工作在定時器工作模式2下,這時定時值中的TL1做為計數,TH1做為自動重裝值,這個定時模式下,定時器溢出後,TH1的值會自動裝載到TL1,再次開始計數,這樣可以不用軟件去幹預,使得定時更準確。在這個定時模式2下定時器1溢出速率的計算公式如下:?
?溢出速率=(計數速率)/(256-TH1初值)?
? 溢出速率=fosc/[12*(256-TH1初值)]?
上式中的“計數速率”與所使用的晶體振蕩器頻率有關,在51 芯片中定時器啟動後會在每壹個機器周期使定時寄存器TH?的值增加壹,壹個機器周期等於十二個振蕩周期,所以可以得知51芯片的計數速率為晶體振蕩器頻率的1/12,壹個12M?的晶振用在51芯片上,那麽51的計數速率就為1M。通常用11.0592M?晶體是為了得到標準的無誤差的波特率,那麽為何呢?計算壹下就知道了。如我們要得到9600?的波特率,晶振為11.0592M?和12M,定時器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晶體的時候計算出來的TH1不為整數,而TH1的值只能取整數,這樣它就會有壹定的誤差存在不能產生精確的9600 波特率。當然壹定的誤差是可以在使用中被接受的,就算使用11.0592M?的晶體振蕩器也會因晶體本身所存在的誤差使波特率產生誤差,但晶體本身的誤差對波特率的影響是十分之小的,可以忽略不計。