找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 4021|回复: 0
收起左侧

解决12M晶振52单片机串口通信波特率设置误差问题

[复制链接]
ID:719007 发表于 2020-4-4 17:24 | 显示全部楼层 |阅读模式


问题:用定时器1进行串口通信时结果不正确,如下图,原程序是把接收的数据返回主机,但是接收的数据不准确。
MA`ZOIS]2]Q$JJT{MEFW@)D.png
原因为用定时器1计算波特率时误差较大,当波特率大时,串口通信结果不正确。
STC89C52单片机中含有定时器2,可当做串行口波特率发生器使用。
如图中7.2.3
51hei截图20200404170928.png
51hei截图20200404171019.png
51hei截图20200404171039.png
按上图配置定时器2RCLK+TCLK1TR21
波特率计算公式:
51hei截图20200404171109.png
自动重装值可由下式得到:
RCAP2H,RCAP2L= 65536 /[SYSclk/(n X波特率) ]

例如:9600bpsSMOD=1:
代入公式:
           9600bps=12000000/[32X(65536-RCAP2HRCAP2L)]
算得(65536-RCAP2H RCAP2L=39
用该方式也有误差,但误差相对定时器1小的多,所以使用该方式能解决用定时器1波特率计算误差大的问题。
  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()//设置波特率为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. }
复制代码
stc89c52用户手册:http://www.51hei.com/bbs/dpj-82368-1.html

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表