找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開始

搜索
查看: 5125|回復(fù): 0
打印 上一主題 下一主題
收起左側(cè)

解決12M晶振52單片機(jī)串口通信波特率設(shè)置誤差問題

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主


問題:用定時(shí)器1進(jìn)行串口通信時(shí)結(jié)果不正確,如下圖,原程序是把接收的數(shù)據(jù)返回主機(jī),但是接收的數(shù)據(jù)不準(zhǔn)確。

原因?yàn)橛枚〞r(shí)器1計(jì)算波特率時(shí)誤差較大,當(dāng)波特率大時(shí),串口通信結(jié)果不正確。
STC89C52單片機(jī)中含有定時(shí)器2,可當(dāng)做串行口波特率發(fā)生器使用。
如圖中7.2.3



按上圖配置定時(shí)器2,RCLK+TCLK1,TR21
波特率計(jì)算公式:

自動(dòng)重裝值可由下式得到:
RCAP2H,RCAP2L= 65536 /[SYSclk/(n X波特率) ]

例如:9600bps,SMOD=1:
代入公式:
           9600bps=12000000/[32X(65536-RCAP2HRCAP2L)]
算得(65536-RCAP2H RCAP2L=39;
用該方式也有誤差,但誤差相對(duì)定時(shí)器1小的多,所以使用該方式能解決用定時(shí)器1波特率計(jì)算誤差大的問題。
  1. #include <reg52.h>
  2. #define uchar unsigned char
  3. #define uint unsigned int
  4. uchar flag=0,a;
  5. void usarinit();
  6. void main()
  7. {
  8.         usarinit();
  9.         while(1)
  10.         {
  11.                 if(flag==1)
  12.                 {
  13.                         ES=0;
  14.                         flag=0;
  15.                         SBUF=a;
  16.                         while(!TI);
  17.                         TI=0;
  18.                         ES=1;
  19.                 }
  20.         }
  21. }
  22. void usarinit()//設(shè)置波特率為9600bps
  23. {
  24.         SCON=0X50;
  25.         T2CON=0X34; //RCLK=1,TCLK=1,TR2=1               
  26.         PCON=0X80;   
  27.         RCAP2H=(65536-39)/256;
  28.         RCAP2L=(65536-39)%256;
  29.         ES=1;
  30.         EA=1;
  31. }
  32. void usar() interrupt 4
  33. {
  34.         RI=0;
  35.         P2=SBUF;
  36.         a=SBUF;
  37.         flag=1;
  38. }
復(fù)制代碼
stc89c52用戶手冊(cè):http://www.torrancerestoration.com/bbs/dpj-82368-1.html

評(píng)分

參與人數(shù) 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎(jiǎng)勵(lì)!

查看全部評(píng)分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩

相關(guān)帖子

回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表