問題:用定時(shí)器1進(jìn)行串口通信時(shí)結(jié)果不正確,如下圖,原程序是把接收的數(shù)據(jù)返回主機(jī),但是接收的數(shù)據(jù)不準(zhǔn)確。
MA`ZOIS]2]Q$JJT{MEFW@)D.png (25.4 KB, 下載次數(shù): 91)
下載附件
2020-4-4 17:06 上傳
原因?yàn)橛枚〞r(shí)器1計(jì)算波特率時(shí)誤差較大,當(dāng)波特率大時(shí),串口通信結(jié)果不正確。 STC89C52單片機(jī)中含有定時(shí)器2,可當(dāng)做串行口波特率發(fā)生器使用。 如圖中7.2.3
51hei截圖20200404170928.png (64 KB, 下載次數(shù): 85)
下載附件
2020-4-4 17:11 上傳
51hei截圖20200404171019.png (114.85 KB, 下載次數(shù): 89)
下載附件
2020-4-4 17:12 上傳
51hei截圖20200404171039.png (59.68 KB, 下載次數(shù): 88)
下載附件
2020-4-4 17:13 上傳
按上圖配置定時(shí)器2,RCLK+TCLK為1,TR2為1; 波特率計(jì)算公式:
51hei截圖20200404171109.png (86.89 KB, 下載次數(shù): 101)
下載附件
2020-4-4 17:13 上傳
自動(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ì)算誤差大的問題。 - #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()//設(shè)置波特率為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;
- }
復(fù)制代碼 stc89c52用戶手冊(cè):http://www.torrancerestoration.com/bbs/dpj-82368-1.html
|