为什么51系列单片机常用11.0592MHz的晶振设计?

2019-03-24 19:42发布

  1、因为它能够准确地划分成时钟频率,与UART(通用异步接收器/发送器)量常见的波特率相关。特别是较高的波特率(1960019200),不管多么古怪的值,这些晶振都是准确,常被使用的。 2、当定时器1被用作波特率发生器时,波特率工作于方式1和方式3是由定时器1的溢出率和SMOD的值(PCON.7------双倍速波特率)决定: 方式13波特率= (定时器1的溢出率) 特殊时,定时器被设在自动重装模式(模式2TMOD的高四位为0100B),其为: 方式1 3波特率= 11.0592MHZ晶振的一些典型波特率如下: 波特率 SMOD TH1 19200 1 0FDH 9600 0 0FDH 4800 0 0FAH 2400 0 0F4H 1200 0 0E8H 300 0 0A0H 更换一种计算方式,它将以修改公式达到我们需求的波特率来计算出晶振。
  最小晶振频率=波特率x 384 x 2 SMOD
这就是我们所需波特率的最小晶振频率,此频率能成倍增加达到我们需求的时钟频率。
例如:波特率为19.2KH2的最小晶振频率:
  3.6864=19200x384x2(波特率为19.2KSMOD1 )
  11.0592=3.6864x3
其中TH1是由倍乘数(3)确定
  TH1=256-3=253=0FDH
用来确定定时器的重装值,公式也可改为倍乘数的因子:
  晶振频率=波特率x(256-TH1)x384x2 SMOD,这是波特率为19.24K的晶振频率。
以上的例子可知,被乘数(3)是用来确定TH1
  TH1=256-3=253=0FDH
19.2K
波特率的晶振为:
  11.0592=19200x(256-0FDH)x384x2(19.2 kSMOD1)
其它值也会得出好的结果,但是11.0592MHZ是较高的晶振频率,也允许高波特率。
此帖出自小平头技术问答
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
15条回答
ddllxxrr
1楼-- · 2019-03-25 02:42
;P
fengzhang2002
2楼-- · 2019-03-25 08:07
 精彩回答 2  元偷偷看……
zhaojun_xf
3楼-- · 2019-03-25 11:14
不错的分享。
David_Lee
4楼-- · 2019-03-25 14:08
说说我的理解吧:
波特率baud实际上是bit per second,每秒多少位,这样我们可以计算出传送一位需要多长的时间t = 1/baud。
晶振有个频率Fosc,我们可以求出晶体振荡的周期T=1/Fosc。
观察串口通信的原理,我们可以看到,实际上有t = T*n(单周期的MCU),只要保证n在MCU内部能够分频出来,那么串口的波特率就是准确的。

51的串口没有独立的时钟源,而是靠定时器,那么这个n就对应了一个定时值。
另外需要考虑的是,51不是单周期的,晶振12分频之后作为系统机器周期,可以看出t = T*12*n,转成,1/baud = 1/Fosc*12*n。

这样,我们就不难解释,为什么11.0592MHz能在51上准确地通过9600bit/s来串口通信,而12MHz不行。
11.0592MHz:      1/9600 = 1/11059200*12*n
12MHz:                 1/9600 = 1/12000000*12*n
解出来n分别为96和104.1666。串口是通过严格规定时钟来对号通信的,我们可以看到,用了12MHz来定时104次产生的时钟是会有误差的。不小心在两个位信息变换处进行了采样,通信就不稳定了。
产生的时钟过长过短,可能采样的就是同一个位信息,或者漏了某个位信息了。

根据这个原理,我们可以非常方便滴用IO来模拟串口,拉低一个位的时长,表示起始,然后根据要传输的数据,输出到IO口,延时相应波特率对应的位时长t = 1/baud,简单的IO模拟串口发送就出来了,要注意延时的精度。
tao282515641
5楼-- · 2019-03-25 15:31
呵呵!
22.1184MHZ晶振和11.0592MHZ晶振的使用是一样的道理。主要应用于串口通信的……
辛昕
6楼-- · 2019-03-25 19:53
原来如此,学习了!!

一周热门 更多>