本帖最后由 电子三极管 于 2010-1-27 13:07 编辑
#include <reg51.h>
void InitTimer1(void)
{
TMOD = 0x20;//8位定时器1自动装载
TH1 = 0x00;
TL1 = 0x51;
EA = 1;
ET1 = 1;
TR1 = 1;
}
void main(void)
{
InitTimer1();
}
void Timer1Interrupt(void) interrupt 3
{
TH1 = 0x00;
TL1 = 0x51;
}这样对嘛?
问题1:有人说初值要TH1=TL1=0X51这样写,对嘛?
问题2:有人这告诉我这样写:
void Timer1Interrupt(void) interrupt 3
{
TH1 += 0x00;
TL1 += 0x51;//甚至TL1 += 0X51+2;
}说这样做了加法,就把误差考虑进去了。我没有理解,求助高手指点。
问题3:TL1 += 0X51+2,这里的加2,说是把加法指令的时长都考虑进去了。我没能领悟。
在次:如果我改用16位手动装载,那又该如何消除误差呢 ?请求高手指教
网上找到一点资料:
工作方式0和工作方式1的最大特点就是计数溢出后,计
数器为全0,因而循环定时或循环计数应用时就存在反复设
置初值的问
题,这给程序设计带来许多不便,同时也会影响计时精度
,工作方式2就针对这个问题而设置,它具有自动重装载功
能,即自
动加载计数初值,所以也有的文献称之为自动重加载工作
方式。在这种工作方式中,16位计数器分为两部分,即以
TL0为计数
器,以TH0作为预置寄存器,初始化时把计数初值分别加载
至TL0和TH0中,当计数溢出时,不再象方式0和方式1那样
需要“人
工干预”,由软件重新赋值,而是由预置寄存器TH以硬件
方法自动给计数器TL0重新加载。
程序初始化时,给TL0和TH0同时赋以初值,当TL0计数
溢出时,置位TF0的同时把预置寄存器TH0中的初值加载给
TL0,TL0
重新计数。如此反复,这样省去了程序不断需给计数器赋
值的麻烦,而且计数准确度也提高了。但这种方式也有其
不利的一
面,就是这样一来的计数结构只有8位,计数值有限,最大
只能到255。所以这种工作方式很适合于那些重复计数的应
用场合。
例如我们可以通过这样的计数方式产生中断,从而产生一
个固定频率的脉冲。也可以当作串行数据通信的波特率发
送器使用。 |