問題:用定時器1進行串口通信時結果不正確,如下圖,原程序是把接收的數據返回主機,但是接收的數據不準確。
MA`ZOIS]2]Q$JJT{MEFW@)D.png (25.4 KB, 下載次數: 91)
下載附件
2020-4-4 17:06 上傳
原因為用定時器1計算波特率時誤差較大,當波特率大時,串口通信結果不正確。 STC89C52單片機中含有定時器2,可當做串行口波特率發生器使用。 如圖中7.2.3
51hei截圖20200404170928.png (64 KB, 下載次數: 85)
下載附件
2020-4-4 17:11 上傳
51hei截圖20200404171019.png (114.85 KB, 下載次數: 89)
下載附件
2020-4-4 17:12 上傳
51hei截圖20200404171039.png (59.68 KB, 下載次數: 88)
下載附件
2020-4-4 17:13 上傳
按上圖配置定時器2,RCLK+TCLK為1,TR2為1; 波特率計算公式:
51hei截圖20200404171109.png (86.89 KB, 下載次數: 101)
下載附件
2020-4-4 17:13 上傳
自動重裝值可由下式得到: RCAP2H,RCAP2L= 65536 /[SYSclk/(n X波特率) ]
例如:9600bps,SMOD=1: 代入公式:
9600bps=12000000/[32X(65536-RCAP2HRCAP2L)]
算得(65536-RCAP2H RCAP2L)=39; 用該方式也有誤差,但誤差相對定時器1小的多,所以使用該方式能解決用定時器1波特率計算誤差大的問題。 - #include <reg52.h>
- #define uchar unsigned char
- #define uint unsigned int
- uchar flag=0,a;
- void usarinit();
- void main()
- {
- usarinit();
- while(1)
- {
- if(flag==1)
- {
- ES=0;
- flag=0;
- SBUF=a;
- while(!TI);
- TI=0;
- ES=1;
- }
- }
- }
- void usarinit()//設置波特率為9600bps
- {
- SCON=0X50;
- T2CON=0X34; //RCLK=1,TCLK=1,TR2=1
- PCON=0X80;
- RCAP2H=(65536-39)/256;
- RCAP2L=(65536-39)%256;
- ES=1;
- EA=1;
- }
- void usar() interrupt 4
- {
- RI=0;
- P2=SBUF;
- a=SBUF;
- flag=1;
- }
復制代碼 stc89c52用戶手冊:http://www.zg4o1577.cn/bbs/dpj-82368-1.html
|