最近实训在做基于51单片机的开发,在做基于单片机的电子钟时着实被11.0592M的
晶振难了一把。后经网上查资料和反复认证终于搞明白了。
为了在进行串口通信时方便计算波特率,所以一般涉及串口通信的单片机系统大多使用11.0592M的晶振。我们实训时使用的
晶振频率也是11.0592M的,这在做电子钟时给计算定时器初值带来了一定困难。
晶振周期=1s/11.0592MHz=1Mus/11.0592MHz=1/11.0592us
单片机机器周期=12*(1/11.0592)us≈1.08506944us
需要实现计时1秒,需要1000000/1.08506944=921600.003775≈921600个机器周期
如果使用定时器的8位自动重装模式,那么如果设置定时器初值为0xA4H(即164D),则每256-164=92个机器周期触发一次定时中断,如此中断10000次,共为920000个机器周期,才约是1秒!
实际上电子钟每跳动1秒都少1600个机器周期,因为921600/1600=576,故应当电子钟每跳动576秒(即9.6分钟)就减去1秒,以减少误差!如果不加此修正,一天24小时,电子钟将快2.5分钟!
之所以需要对电子钟的时间进行修正,主要是因为晶振频率无法被整除造成的。所以如果单片机系统不需要串口通讯,使用12MHz的晶振,那么计算定时器中断的初值将方便许多,也不需要进行时间修正了!
晶振周期=1s/12MHz=1Mus/12MHz=1/12us
单片机机器周期=12*1/12us=1us
需要实现计时1秒,需要1000000/1=1000000个机器周期
那么如果设置定时器初值为0x9CH(即156D),则每256-156=100个机器周期触发一次定时中断,如此中断10000次,正好为1000000个机器周期。这样就不会存在误差(忽略指令的执行时间)!