最近实训在做基于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个机器周期。这样就不会存在误差(忽略指令的执行时间)!
打赏帖 | |
---|---|
汽车电子中巡航控制系统的使用被打赏10分 | |
分享汽车电子中巡航控制系统知识被打赏10分 | |
分享安全气囊系统的检修注意事项被打赏10分 | |
分享电子控制安全气囊计算机知识点被打赏10分 | |
【分享开发笔记,赚取电动螺丝刀】【OZONE】使用方法总结被打赏20分 | |
【分享开发笔记,赚取电动螺丝刀】【S32K314】芯片启动流程分析被打赏40分 | |
【分享开发笔记,赚取电动螺丝刀】【S32K146】S32DS RTD 驱动环境搭建被打赏12分 | |
【分享开发笔记,赚取电动螺丝刀】【IAR】libc标注库time相关库函数使用被打赏23分 | |
LP‑MSPM0L1306开发版试用结果被打赏10分 | |
【分享开发笔记,赚取电动螺丝刀】【LP-MSPM0L1306】适配 RT-Thread Nano被打赏23分 |