標(biāo)題: 51單片機12Mhz晶振精準(zhǔn)設(shè)置波特率 [打印本頁]
作者: 海洋漁業(yè) 時間: 2019-2-9 16:35
標(biāo)題: 51單片機12Mhz晶振精準(zhǔn)設(shè)置波特率
本帖最后由 海洋漁業(yè) 于 2019-2-10 00:05 編輯
相信很多朋友在學(xué)習(xí)串口通訊的時候,因為晶振是12Mhz而不能設(shè)置4800bps以上的波特率,我在學(xué)習(xí)中也是如此,網(wǎng)上也沒有什么靠譜的方法。
作為一個新時代的青少年,通過不懈的學(xué)習(xí)(其實是看器件手冊無意間看到的)終于有了突破。
1:晶振為11.0592Mhz
我們知道T1可以作為波特率發(fā)生器,也知道波特率計算公式(方式1、3):2的SMOD的次方除以32再乘T1溢出率(晶振頻率除以12乘(256-TH1));
即:波特率=(2的SMOD次方/32)X晶振頻率/[12x(256-TH1)]
我們可以輕松的算出TH1和TL1內(nèi)的值,列如:
計算9600bps ,設(shè)SMOD=1;
9600bps=(2/32)X[11059200/12X(256-TH1)]
算得(256-TH1)=6,則TH1=250 (0XFA);
計算波特率為9600、串口工作方式為方式1的程序:
void init_serial()
{
TMOD=0X20;//設(shè)置T1工作方式為8位自動重裝
SCON=0X50;//設(shè)置串口工作方式為10位異步收發(fā)器
PCON=0X80;//SMOD置為1
TH1=(256-6);//6的由來[(11059200/12)/16]/9600 (9600為所求波特率)
TL1=(256-6);
EA=1;//開總中斷
ES=1;//開串口中斷
TR1=1;//啟動T1
}
2:晶振為12Mhz
如果我們繼續(xù)將T1作為波特率發(fā)生器,那么計算的公式也沒變化。
列如:
波特率為2400,SMOD=1;
2400bps=(2/32)X[12000000/12X(256-TH1)]
算得(256-TH1)=26.041666,是個無限循環(huán)小數(shù),如果取26帶進(jìn)公式里算,波特率四舍五入后是2404,誤差不是很大。
- void init_serial()
- {
- TMOD=0X20;//設(shè)置T1工作方式為8位自動重裝
- SCON=0X50;//設(shè)置串口工作方式為10位異步收發(fā)器
- PCON=0X80;//SMOD置為1
- TH1=(256-26);
- TL1=(256-26);
- EA=1;//開總中斷
- ES=1;//開串口中斷
- TR1=1;//啟動T1
- }
復(fù)制代碼
如果4800bps,SMOD=1;
4800bps=(2/32)X[12000000/12X(256-TH1)]
算得(256-TH1)=13.0208333,也是個無限循環(huán)小數(shù),取13,算出波特率約為4808,誤差也不大。
- void init_serial()
- {
- TMOD=0X20;//設(shè)置T1工作方式為8位自動重裝
- SCON=0X50;//設(shè)置串口工作方式為10位異步收發(fā)器
- PCON=0X80;//SMOD置為1
- TH1=(256-13);
- TL1=(256-13);
- EA=1;//開放總中斷
- ES=1;//開放串口中斷
- TR1=1;//啟動T1
- }
復(fù)制代碼
那么,就T1作為波特率發(fā)生器就夠了嗎?不行,高波特率誤差大。
如:9600bps,SMOD=1;
9600bps=(2/32)X[12000000/12X(256-TH1)]
算得(256-TH1)=6.510416(6的循環(huán))
如果我們?nèi)?,則計算出來的波特率為8928.571428(571428的循環(huán)),取6,波特率則為10416.66666(6的循環(huán)),誤差太大。
這該怎么辦呢?
有兩種方法:1.換晶振(不推薦) 2.使用T2作為波特率發(fā)生器(推薦)
以下是有關(guān)T2的器件手冊截圖
T2-1.png (812.13 KB, 下載次數(shù): 117)
下載附件
T2
2019-2-9 20:46 上傳
這里著重注意TCLK與RCLK,手冊上的描述是:RCLK=0時,將定時器1的溢出率脈沖作為串口模式1和模式3的接受時鐘,TCLK=0時,將定時器1的溢出率脈沖作為串口模式1和模式3的(這個“的”是我加上的,不知道為什么前面有后面沒有)發(fā)送時鐘。
這兩句話講的已經(jīng)夠清楚了,我們只把RCLK置為1,那我們的接受波特率就是(2的SMOD的次方/32)X(T2溢出率);如果我們只把TCLK置為1,那么我們的發(fā)送波特率就為(2的SMOD的次方/32)X(T2溢出率);如果我們將RCLK與TCLK都置為1,那么我們的波特率就是(2的SMOD的次方/32)X(T2溢出率)。
T2溢出率和T1溢出率不同它的計算公式為:晶振頻率/[2X(65536-RCAP2H RCAP2L)],此外T2是一個16位的定時/計數(shù)器,不像T0、T1既是8位又是16位。
使用T2作為波特率發(fā)生器的波特率計算公式為:(2的SMOD的次方/32)X(T2溢出率)
即波特率=(2的SMOD的次方/32)X晶振頻率/[2X(65536-RCAP2H RCAP2L)];
按照T2的波特率計算公式我們就可以隨著自己的想法設(shè)置波特率了,列如我們要設(shè)置9600bps,SMOD=1:
將9600bps代入波特率=(2的SMOD的次方/32)X晶振頻率/[2X(65536-RCAP2H RCAP2L)],
得:
9600bps=(2/32)X12000000/[2X(65536-RCAP2H RCAP2L)]
算得(65536-RCAP2H RCAP2L)=39;
所以有
- void init_serial()//設(shè)值9600bps的程序,大家可以試試
- {
- SCON=0X50; //設(shè)置串口工作模式為10位異步收發(fā)器
- T2CON=0X34; //RCLK=1,TCLK=1,TR2=1
- PCON=0X80; //SMOD=1
- RCAP2H=(65536-39)/256; // 裝入計算好的值,這是我喜歡的懶方法
- RCAP2L=(65536-39)%256;//同上,不過這是對(65536-39)求余,前者是求模(也就是求商)
- ES=1;//開串口中斷
- EA=1;//開總中斷
- }
復(fù)制代碼 本人屬于發(fā)貼新手和單片機新手,如有錯誤請您委婉點地指出。
感謝您的瀏覽,同時也要謝謝審核我的管理員,真是麻煩您了!
【這是我第一次發(fā)稿】
作者: 還有誰? 時間: 2019-2-10 15:12
很不錯的資料,收下了
作者: faxa1 時間: 2019-2-17 12:20
沒那么麻煩,用內(nèi)部晶振,完全匹配
作者: 低調(diào)的黑馬 時間: 2019-2-28 13:40
樓主東西不錯,解決了我的問題。
作者: 海洋漁業(yè) 時間: 2019-3-31 18:35
請問什么是內(nèi)部晶振?我讀書少
作者: ptlantu 時間: 2019-4-1 15:24
贊一個

作者: 吸貓患者 時間: 2019-4-2 10:00
太好了,剛遇到一個問題,解決了
作者: 噗噗噗p 時間: 2019-11-17 15:52
好帖子!解決了想要精準(zhǔn)定時和串口通信的問題
作者: lxa0 時間: 2019-11-18 02:29
我習(xí)慣用11.0592Mhz~~~~~~~~~
作者: pcbboy 時間: 2019-12-25 10:47
直接24MHZ ,速度快,波特率都沒問題
作者: xizhe2005 時間: 2019-12-25 11:19
STC單片機都不用接晶振了,內(nèi)部的就夠用了
作者: 鏡1017 時間: 2020-5-10 17:58
很有用,謝謝分享
作者: 13118302007 時間: 2020-5-10 22:17
一個善于鉆研的人,值得尊敬。
作者: aking991 時間: 2020-5-11 08:14
51單片機用12M的晶振設(shè)置波特率是有誤差沒錯,但這種通訊波特有他的誤差范圍,聽我們這邊的工程師說,誤差到0.3%都沒問題,所以用這個晶振最大只能9600都可以用的
作者: shushikuan 時間: 2020-7-9 10:42
給樓主點個贊。
作者: yylIC 時間: 2020-10-20 19:23
樓主,這個解決了大問題,很感謝
作者: 158864285 時間: 2021-3-12 21:19
太好了,剛遇到一個問題,解決了 贊贊
作者: rootn 時間: 2021-3-20 10:44
內(nèi)部怎么調(diào)用?
作者: wwh2382 時間: 2021-3-20 16:32
沒有晶振的stc下載時有設(shè)置頻率的選項,見下圖:
ClipBoard.jpg (89.41 KB, 下載次數(shù): 83)
下載附件
2021-3-20 16:32 上傳
作者: lucienyie 時間: 2022-3-15 10:01
感謝分享,幫助很大
作者: mizewei 時間: 2022-5-31 11:50
贊贊贊,才發(fā)現(xiàn)是晶振的問題,沒想到9600差這么大,換2400就好了
作者: 美琴的備胎 時間: 2022-6-5 10:20
不錯,用得到
| 歡迎光臨 (http://www.raoushi.com/bbs/) |
Powered by Discuz! X3.1 |