奶爸业余单片机学习之:定时器以工作方式1运行时的初值的计算方法(51单片机)...

//==========51单片机========

/*定时器以工作方式1运行

TMOD = 0x01;//定时器0

TMOD = 0x10;//定时器1

TMOD =0x11;//定时器0/1同时工作

*/

定时器工作时,如何确定定时时间?

假设有一个5L的水桶,现在要往水桶里面装水3L,怎么才知道装够3L了呢?答案就是先往水桶里面装水2L,然后继续装,水满溢出时,就表示3L水装够了。

(以定时器0为例)溢出:单片机也一样,当单片机内定时器以工作方式1运行时,定时器存储寄存器每经过一个机器周期就加1,计数长度为65535(十六进制为:FFFFFF),所以65536+1时就会溢出,溢出后寄存器值从0开始计数,则:定时周期 = 65536 - 初值,初值为0时,定时周期 = 65535个机器周期

所以,当需要定时时,先往寄存器里装入初值,让寄存器从初值开始计数,到65536时,寄存器溢出为0,溢出后TF0 == 1,表示定时值已到,若需要用到循环定时,则溢出后,首先必让溢出标志(TF0)归零(归零方法:一、程序清零,则TF0 = 0;二、进入定时器中断以实现硬件自动清零。)。

其次,须往寄存器重新装入初值再开始计算。

 

时钟周期 = 1/时钟频率;

机器周期(定时器存储寄存器加1时间)= 12×时钟周期,

以11.0592MHz频率晶振为例,机器周期(秒) = 12×(1/11059200)

初值为0时,最大定时时间为 65535×12×(1/11059200)=71ms(约),所以程序需要定时时,通常要根据定时时间来确定一个合适的初值。

假设需定时一个30毫秒时间,则0.03 = A×机器周期,可以算出A = 0.03/机器周期 = (0.03×11059200)/12,则经历A个机器周期时,就为30毫秒定时时间

可以算出 A = 27648

所以,初值 = 65536 - 27648 = 37888,37888转换成十六进制为9400,所以高八位TH0 = 0x94,低八位TL0 = 0x00;

公式总结

初值 = 65536 - 定时时间(秒)/机器周期

时钟周期 = 1/时钟频率;

机器周期(定时器存储寄存器加1时间)= 12×时钟周期

转载于:https://www.cnblogs.com/czf-gd/p/3941577.html

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值