问题:用定时器1进行串口通信时结果不正确,如下图,原程序是把接收的数据返回主机,但是接收的数据不准确。 原因为用定时器1计算波特率时误差较大,当波特率大时,串口通信结果不正确。 STC89C52单片机中含有定时器2,可当做串行口波特率发生器使用。 如图中7.2.3 按上图配置定时器2,RCLK+TCLK为1,TR2为1; 波特率计算公式: 自动重装值可由下式得到: 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.51hei.com/bbs/dpj-82368-1.html
|