[技术问答] 关于51单片机的定时器最大定时计算问题

[复制链接]
1179|10
 楼主| zhuotuzi 发表于 2020-2-22 16:47 | 显示全部楼层 |阅读模式
比如N76E885, 为高速 1T 8051 单片机。查看手册知道,该单片机具备定时器0和1,都是16位的定时器。
因此最大计数长度为65536
按照内置晶振22.1184 MHz 计算
那么计数一次的周期T=1/22.1184M      us
这比传统的单片机牛多了,可以想象是传统51的很多倍速度了。
那么最大能计时多少呢?
tmax
=65536*T
=2.962962962963   ms

=2962.962962963 us
也就是说最大才约等于2.963微妙
所以你定时只能在1us到2.963ms之间。超过这个范围就要才用多次中断累计实现了。

 楼主| zhuotuzi 发表于 2020-2-22 16:57 | 显示全部楼层
 楼主| zhuotuzi 发表于 2020-2-22 16:58 | 显示全部楼层
经过计算定时周期设置到一次定2.5ms的时候刚好可以实现整数计数,因此这里如果定时10ms,可以先才用定时2.5ms
 楼主| zhuotuzi 发表于 2020-2-22 17:01 | 显示全部楼层
这样16位定时器的 初值就是=0xFFFF-55296
其中十进制的55296==0xD800

 楼主| zhuotuzi 发表于 2020-2-22 17:02 | 显示全部楼层
初值就是10239,对应16进制是,27ff。
因此TH0=0x27
TL0=FF
 楼主| zhuotuzi 发表于 2020-2-22 17:05 | 显示全部楼层
  1. void Timer0_ISR (void) interrupt 1  //interrupt address is 0x000B
  2. {
  3.     TH0 = 0x27;
  4.     TL0 = 0xFF;   

  5. }
 楼主| zhuotuzi 发表于 2020-2-22 17:07 | 显示全部楼层
如果定义的有个计时的全局变量char time_flag=0;
  1. void Timer0_ISR (void) interrupt 1  
  2. {
  3.     TH0 = 0x27;
  4.     TL0 = 0xFF;
  5. time_flag++;
  6. if(time_flag==4)
  7. {
  8. time_flag=0;
  9. //然后添加你的定时10ms执行的函数。
  10. }  

  11. }
643757107 发表于 2020-2-23 19:45 | 显示全部楼层
这个贴总结的非常好。
zhuomuniao110 发表于 2020-2-23 19:52 | 显示全部楼层
12T的那种需要先除以12
zhuomuniao110 发表于 2020-2-23 19:53 | 显示全部楼层
楼主讲的非常透彻
zhuomuniao110 发表于 2020-2-23 19:53 | 显示全部楼层
如果支持分频,那还要计算分频的情况。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

217

主题

3393

帖子

7

粉丝
快速回复 在线客服 返回列表 返回顶部