单片机定时器 不知道如何计算的?

void Init_Timer0(void)
{
TMOD |= 0x01; //使用模式1,16位定时器,使用"|"符号可以在使用多个定时器时不受影响
//TH0=0x00; //给定初值
//TL0=0x00;
EA=1; //总中断打开
ET0=1; //定时器中断打开
TR0=1; //定时器开关打开
}
/*------------------------------------------------
定时器中断子程序
------------------------------------------------*/
void Timer0_isr(void) interrupt 1
{
TH0=(65536-2000)/256; //重新赋值 2ms
TL0=(65536-2000)%256;

Display(4,4);
}

这里面的2ms就直接减去2000,要是一毫秒是不是就减去1000呢?这个怎么算的啊?12M

TH0,TL0.给定的是定时器的初始值.51单片机每12个机器周期将定时器的数值++;
当定时器内数据溢出时候产生定时器中断

65536-2000;;;65536为溢出值(0xffff),将初始值设定为65536-2000=63536
则定时次数为 65536-63536=2000

TH0=(65536-2000)/256; //重新赋值 2ms

这样写使程序的可读性变强了,很容易看出时间追问

那定时方式 是1 啊,
我记得方式2 是自动载入的;方式0是用作13位的,
方式1 是TH1和TL1连起来用做16位的吧·····
我也不大懂,请多多指教下啊···

追答

方式1 是TH1和TL1连起来用做16位的吧/恩 对
TH1是高八位,TL1是第八位

只有自动载入不一样.自动载入 是八位的
在中断里面不用赋值,硬件会自动赋值, 赋值的内容就是TH1中的内容..
{
因为打开定时器,TL1中的内容,会随着时间改变,所以它记不下你赋给的初始值,.只能靠TH1去记录
产生中断时候,直接将 TH1中的值赋值给 TL1;
}仔细想想其实 这几个工作模式几乎是一样的,(自动载入,是省去了人为赋值,定时相对来说准确点)

温馨提示:答案为网友推荐,仅供参考
第1个回答  2012-08-28
是的,就是这么算的
12MHz除12为1MHz,也就是说一秒=1000000次机器周期。1ms=1000次机器周期。
就是这样,嗯
第2个回答  2012-08-28
晶振12MHz 时, 定时器计数1 就是1us , 1000就是1ms, 2000就是2ms

因为定时器是计数是往上加的, 所以65536-2000 就是2ms
第3个回答  2012-08-28
定时器一个计数值等于一个机器周期,对于12M晶振而言相当于1us,所以1毫秒减1000。