打印

学了一段51定时器程序:TH0=-5000/256;TL0=-5000%256

[复制链接]
9082|3
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
youxu1221|  楼主 | 2010-1-18 12:08 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
偶是个单片机初学者,昨晚上鼓捣单片机,惊现一段诡异的程序:
TH0=-5000/256;
TL0=-5000%256;
上网一搜索,发现n多和我一样的初学者有这个疑问,后来一想,这应该是个常用的写法,查了几本基础知识的书,终于搞懂了,并且发现其中涉及很多有用的小知识。
所以发帖记录一下,也为我在21IC发帖开个头,希望大家以后多多指教,论坛越办越好
这里就以定时/计数器0为例吧,
使用Tmer首先要依据定时时间给它赋初值X,n=8、13、16为定时寄存器位数
定时时间Tout=(2^n-X)*机器周期T
            =(2^n-X)/机器频率f
            =(2^n-X)*(12/晶振频率fsos)
这时,出现一个特例,就是选16位定时计数器,同时晶振12MHz,有这个公式:Tout=(2^16-X)*(1us)
                =(2^16-X)*(1us)
                =(25536-X)*(1us)
在MCU中一个16位内存单元最大有效值为65535
所以,Tout=(65536-X)*(1us)
          =(0-X)*(1us)=-X*(1us)=-X us
又通过物理上关于单位的量纲可知:X即可以表示成单位为1的定时寄存器初值,也可以理解为单位为微妙的定时时间
另外当将一个常数X赋值给一个16位单元时,若要求分高8位和低8位分别赋值时,可以用二进制的概念:
TH0=X/256;TL0=X%256;
这样就可以理解TH0=-5000/256; TL0=-5000%256;的含义了:就是定时5000微秒

相关帖子

沙发
不亦心| | 2010-1-18 12:34 | 只看该作者
路过帮顶一下

使用特权

评论回复
板凳
冷漠| | 2010-1-18 13:47 | 只看该作者

T0 /T1 初值应为负值!

本帖最后由 冷漠 于 2010-1-18 13:49 编辑

领悟了半天,还是错了。

51定时器是增长计数器,所以,欲设置定时5000微秒,应设T0/T1初值为- 5000(0xEC78)!

5000d=1388H;
-5000d=0ec78H;
相差甚远。

使用特权

评论回复
地板
冷漠| | 2010-1-18 14:06 | 只看该作者
本帖最后由 冷漠 于 2010-1-18 14:09 编辑

这么看清楚点:
#include <reg52.h>                                   
sfr16  DPTR = 0x82;

void main()
{  
   TMOD=0x01;
   DPTR= - 5000;
TH0=DPH;
TL0=DPL;
}

// TH0=(65536-5000)/256;  //5ms
// TL0=(65536-5000)%256;

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1

主题

1

帖子

1

粉丝