本帖最后由 Squall001 于 2015-7-24 12:01 编辑
在初始化波特率的时候 我们一般用下面的代码
- void UartInit(void) //9600bps@11.0592MHz
- {
- PCON |= 0x80; //使能波特率倍速位SMOD
- SCON = 0xD0; //9位数据,可变波特率
- AUXR |= 0x40; //定时器1时钟为Fosc,即1T
- TMOD &= 0x0F; //清除定时器1模式位
- TMOD |= 0x20; //设定定时器1为8位自动重装方式
- TL1 = 0xB8; //设定定时初值
- TH1 = 0xB8; //设定定时器重装值
- ET1 = 0; //禁止定时器1中断
- TR1 = 1; //启动定时器1
- SM2=1; //开启多机通信
- }
复制代码
问题,相信在以上代码初始化过后,定时器就不断的跑起来了,那么如果在接收端口RX检测到从1->0跳变的时候,此时定时器却没有跑满,比如定时器才跑到一半,这个时候为了同步波特率,是不是系统会自动使定时器设定到初始值再开始计数?
也就是说,按照上面的代码,当RX检测到从0->1跳变的时候,定时器TL1里面的值为0xF0,而不是0xB8,那么系统是不是会自动重装定时器的值为TL1=0xB8,让定时器头开始跑起来,这样一来才能够同步波特率吧,这样理解对么?
不会吧,看下图 ,你这样先溢出再采样,永远无法同步得到波特率吧,下图所示 溢出一定时间了 ,下降沿再来,如果不重新调整溢出的时间,那么今后所有的采样都会被顺延。
QQ图片20150724154013.jpg (436.59 KB, 下载次数: 0)
下载附件
2015-7-24 15:40 上传
你知道什么叫异步吗?既然是异步,为什么还要同步?自己矛盾?
异步通信不是通过时钟边沿中断来采样的,而是通过定时中断进行16或8次采样中选择3中取2码来判定的,像你上楼所发的图,会当做干扰直接过滤掉,因为无法满足3中取2的条件。
一周热门 更多>