您当前的位置:五五电子网电子知识电子学习基础知识电脑-单片机-自动控制51定时器(计算器)的研究与程序设计 正文
51定时器(计算器)的研究与程序设计

51定时器(计算器)的研究与程序设计

点击数:7236 次   录入时间:03-04 11:48:48   整理:http://www.55dianzi.com   电脑-单片机-自动控制

一、定时器相关寄存器
与定时器有关的寄存器都在下面了。
TCON 的高4位 
TF1    TR1    TF0    TR0                   
TF1(TCON.7):定时器1的溢出中断标志位
TR1(TCON.6):定时器1的运行控制位
TF0(TCON.5):定时器0的溢出中断标志位
TR0(TCON.4):定时器0的运行控制位

TMOD
GATE1    C/T1    M1    M0    GATE0    C/T0    M1    M0   
            定时器1            |            定时器0 

TH0、TL0、TH1、TL1
这个不用说了吧

中断允许控制寄存器IE中的三位。
ET0(IE.1)、ET1(IE.4)、EA(IE.7)

定时器的结构(以T0为例)
把定时器分为六个部分来研究。
脉冲源  控制端  计数器  中断请求位  中断允许控制  中断服务程序
晶振或T0              TH0、TL0      TF0            ET0  EA    void Tm0() interrup1 using 1 
脉冲源:用作定时器时,取晶振作为脉冲源。每12个振荡周期(即一个机器周期)计数器(即TH0、TL0)加一。用作计数器时T0脚出现下降沿(管脚从1到0)跳变时,计数器加一。定时器和计数器的区别就是脉冲源不同,除此之外其他的工作过程完全相同。
配置TMOD的C/T0可以选择脉冲源。置0是定时器,置1是计数器。
控制端:相当于一个开关,开关打开时,脉冲源的信号才能传到计数器(TH0,TL0)中,计数器会不断增一。关闭这个开关,脉冲源的信号不能使计数器(TH0,TL0)增一。控制端的开启和关闭状态由TR0、GATE0和INT0脚电平决定。控制端的开启条件是TR0&(~GATE0 | INT0)如下图。

 
控制端的开启条件是TR0&(~GATE0 | INT0)如图。
一般情况下 令TR0=1  GATE0=0 开启控制端。TR0=0关闭控制端。
当需要INT0引脚控制计数器时  令TR0=1  GATE0=1  这样INT0脚为高电平时计数,低电平时停止计数,这样可以很方便的测量脉冲宽度。在任何一本51书中的定时器部分都有详述。也可以使用本文配套的小软件,来体会控制端的逻辑。GATE=1的这种用法,我以前也没有注意过,在整理本文时才发现的。这也是我最新的学习收获。

计数器,中断请求位:这里说的计数器是指TH0、TL0这两个寄存器。

每收到一个脉冲源输出的脉冲,这个计数器就会增一。计数器计满溢出时,会置位TF0,产生中断请求。注意,这里只是产生中断请求,是否能够进入中断程序,还要由中断允许位决定。
直接对TF0置位,也可以产生中断请求。
计数器TH0、TL0一共有四种计数方式
方式0(M1=0 M0=0)13位计数器。它由TH0的8位和TL0的低5位构成。TL0大于0x1F时就向TH0进位。TH0计满溢出就向TF0置位请求中断。
方式1(M1=0 M0=1)16位计数器。与方式1差不多。由TH0的8位和TL0的8位构成。TH0计满溢出就向TF0置位请求中断
方式2(M1=1 M0=0)8位定时器。TL0计满溢出时,置位TF0请求中断,并且将TH0中的数值重新装入TL0中。
方式3(M1=1 M0=1)这个方式只有定时器0有,把定时器0当成两个8位定时器来用。这部分很有趣,你可以使用演示软件研究。
定时器1没有方式3,如果设成方式3就相当于停掉了定时器1。
中断允许控制:上一步产生中断请求(TF0被置1),并不代表会响应中断。还要看中断允许控制位,这是一个开关,只有开关在开启状态,中断才会响应。每个中断源都有自己的分开关,比如T0的中断允许位是ET0,T1的中断允许位是ET1.还有一个总开总EA,它关闭时所有的中断都被禁止。必须是分开关和总开关都打开时,才能进入中断服务程序。

 
            开定时器           

 
            关定时器
开启和关闭定时器控制端,你可以点击小软件来体会逻辑关系。
中断服务程序:如果中断条件都允许,程序跳转到中断服务程序。
ORG 0000
AJMP Main
ORG 000BH
LJMP Tim0
ORG 100H
Main:
MOV SP,#30H
MOV TMOD,#01H
MOV TH0,#0EEH
MOV TL0,#00H
SETB ET0
SETB EA
SETB TR0
WHILE:
。。。主程序
LJMP WHILE

TIM0:;TIMER0中断服务程序
PUSH  ACC
PUSH  PSW
MOV TH0,#0EEH
。。。其他程序
POP  PSW
POP  ACC
RETI


#include <reg51.h> //11.0592M
void timer0() interrupt 1 using 1    //5ms中断一次定时器中断处理函数
{
TH0=0xEE;    //重置定时初始值
。。。其他程序
}
void main (void)
{
TMOD|=0x01;  //选择定时器0,工作模式1,16位定时器
TH0=0xEE;    //置定时初始值
TL0=0x00;
ET0=1;  //开启定时器0中断允许,允许定时器0中断。
EA=1;    //开启全局中断允许。允许所有中断
TR0=1;  //开启控制端 
while(1)
{
。。。主程序
}
}

顺便把其他中断源的向量表也写出来。
中断源                                  汇编语言                                C语言   
                                    中断向量            例子        中断序号                  例子   
外部中断0(INT0)    0003H      ORG 0003H        0                void _INT0() interrupt 0 using 1   
定时器T0中断              000BH      ORG 000BH        1                void _T0() interrupt 1 using 1   
外部中断1(INT1)    0013H      ORG 0013H        2                void _INT1() interrupt 2 using 1   
定时器T1中断              001BH      ORG 001BH        3              void _T1() interrupt 3 using 1   
串行口中断                  0023H      ORG 0023H        4              void _UART() interrupt 4 using 1   
定时器T2中断              002BH    ORG 002BH          5              void _T2() interrupt 5 using 1   

定时器例程之一:精确定时1秒钟
我使用的硬件是救火车单片机工作室的JHC-51-A型学习板。晶振频率11.0592M。用定时器0的工作方式1实验。因为工作方式1,最大的计数是65536个机器周期。晶振是11.0592M时,最长溢出时间是71111.1111111111微秒,远远不够1秒,所以我把定时器溢出时间定成5毫秒。在定时器工具中输入5000,点 [计算TH0 TL0] 计算出 TH0 = 0xEF ,TL0 = 0x00.溢出时间是5毫秒,相当1秒的200分之一。

在定时器工具中输入5000,点 [计算TH0 TL0] 计算出 TH0 = 0xEF ,TL0 = 0x00.溢出时间是5毫秒,相当1秒的200分之一。在程序中声时一个外部变量,计200次中断,就是1秒。

unsigned char  ms_5=0;
void timer0() interrupt 1 using 1    //5ms中断一次定时器中断处理函数
{
TH0=0xEE;    //重置定时初始值
if  (++ms_5>=200)
{
    ms_5=0;
    //程序每1秒钟进入这里一次。
   
}
}
//主程序如下:
void main (void)
{
TMOD|=0x01;  //选择定时器0,工作模式1,16位定时器
TH0=0xEE;    //置定时初始值
TL0=0x00;
ET0=1;  //开启定时器0中断允许,允许定时器0中断。
EA=1;    //开启全局中断允许。允许所有中断
TR0=1;  //开启控制端 

到这里我们把定时器0做成了一秒钟的程序完成了。
有很多朋友会有这样的疑问,这样做的1秒钟到底准不准?有多大误差?
我可以负责任的告诉你,有误差,但可以控制到极其微小的程度。
下面我们发析一下误差的产生,以及控制方法。

[1] [2]  下一页


本文关键字:程序设计  定时器  计算器  电脑-单片机-自动控制电子学习 - 基础知识 - 电脑-单片机-自动控制