打印

跪求高手关于单片机定时器自动装载问题

[复制链接]
3033|6
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
电子三极管|  楼主 | 2010-1-26 23:17 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 电子三极管 于 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。所以这种工作方式很适合于那些重复计数的应
用场合。
例如我们可以通过这样的计数方式产生中断,从而产生一
个固定频率的脉冲。也可以当作串行数据通信的波特率发
送器使用。

相关帖子

沙发
电子三极管|  楼主 | 2010-1-27 13:08 | 只看该作者
还有using 是指单片机内部的CPU中的寄存器嘛,是不是也有using0,using1,using2....using7.跟R0-R7一样

使用特权

评论回复
板凳
HWM| | 2010-1-27 13:23 | 只看该作者
既然是自动重装,就不用在中断程序中多此一举了。

using是指四组R0~R7中的某一组,没那么多。

使用特权

评论回复
地板
电子三极管|  楼主 | 2010-1-27 13:33 | 只看该作者
3# HWM
谢了

使用特权

评论回复
5
电子三极管|  楼主 | 2010-1-27 15:03 | 只看该作者
using0,using1,using2,using3这四个嘛? 3# HWM

使用特权

评论回复
6
HWM| | 2010-1-27 15:10 | 只看该作者
是的,对应于bank0(0~7),bank1(8~15),bank2(16~23)和bank3(24~31)

使用特权

评论回复
7
tasunbin| | 2010-1-27 17:40 | 只看该作者
看看keil 51 的帮助就行.你看看对应的汇编

使用特权

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

本版积分规则

个人签名:承接采集设备运行参数,如温度、速度、压力、浓度、流量、节拍、湿度、重量等。采用PIC 51 AVR等类单片机 59467837(杭州单片机开发技术交流QQ群)

116

主题

530

帖子

2

粉丝