求助波特率发生的概念问题

2020-01-20 18:54发布

本帖最后由 Squall001 于 2015-7-24 12:01 编辑

在初始化波特率的时候 我们一般用下面的代码

  1. void UartInit(void)                //9600bps@11.0592MHz
  2. {
  3.         PCON |= 0x80;                //使能波特率倍速位SMOD
  4.         SCON = 0xD0;                //9位数据,可变波特率
  5.         AUXR |= 0x40;                //定时器1时钟为Fosc,即1T
  6.         TMOD &= 0x0F;                //清除定时器1模式位
  7.         TMOD |= 0x20;                //设定定时器1为8位自动重装方式
  8.         TL1 = 0xB8;                //设定定时初值
  9.         TH1 = 0xB8;                //设定定时器重装值
  10.         ET1 = 0;                //禁止定时器1中断
  11.         TR1 = 1;                //启动定时器1

  12.         SM2=1;   //开启多机通信
  13. }
复制代码


问题,相信在以上代码初始化过后,定时器就不断的跑起来了,那么如果在接收端口RX检测到从1->0跳变的时候,此时定时器却没有跑满,比如定时器才跑到一半,这个时候为了同步波特率,是不是系统会自动使定时器设定到初始值再开始计数?

也就是说,按照上面的代码,当RX检测到从0->1跳变的时候,定时器TL1里面的值为0xF0,而不是0xB8,那么系统是不是会自动重装定时器的值为TL1=0xB8,让定时器头开始跑起来,这样一来才能够同步波特率吧,这样理解对么?

友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
5条回答
takashiki
1楼-- · 2020-01-20 23:56
LZ你想多了,先后顺序搞错了。先有定时器溢出重装,然后才会有USART采样,你说的这种情况是不存在的。
fuquan_dai
2楼-- · 2020-01-21 05:44
51好麻烦。。。
Squall001
3楼-- · 2020-01-21 08:26
takashiki 发表于 2015-7-24 12:20
LZ你想多了,先后顺序搞错了。先有定时器溢出重装,然后才会有USART采样,你说的这种情况是不存在的。 ...

不会吧,看下图 ,你这样先溢出再采样,永远无法同步得到波特率吧,下图所示 溢出一定时间了 ,下降沿再来,如果不重新调整溢出的时间,那么今后所有的采样都会被顺延。


QQ图片20150724154013.jpg (436.59 KB, 下载次数: 0)

下载附件

2015-7-24 15:40 上传

takashiki
4楼-- · 2020-01-21 13:27
Squall001 发表于 2015-7-24 15:42
不会吧,看下图 ,你这样先溢出再采样,永远无法同步得到波特率吧,下图所示 溢出一定时间了 ,下降沿再 ...

你知道什么叫异步吗?既然是异步,为什么还要同步?自己矛盾?
异步通信不是通过时钟边沿中断来采样的,而是通过定时中断进行16或8次采样中选择3中取2码来判定的,像你上楼所发的图,会当做干扰直接过滤掉,因为无法满足3中取2的条件。
Squall001
5楼-- · 2020-01-21 15:32
 精彩回答 2  元偷偷看……

一周热门 更多>