6.1什么是定时器?

定时器是单片机的重要功能模块之一,在检测、控制领域有广泛应用。定时器常用作定时时钟,以实现定时检测,定时响应、定时控制,并且可以产生ms宽的脉冲信号,驱动步进电机。定时和计数的最终功能都是通过计数实现,若计数的事件源是周期固定的脉冲则可实现定时功能,否则只能实现计数功能。因此可以将定时和计数功能全由一个部件实现。

6.2什么是周期?

1、时钟周期:单片机的基本时间单位。若时钟的晶体的振荡频率为fosc,则时钟周期Tosc=1/fosc。

2、机器周期:CPU完成一个基本操作所需的时间称为机器周期。

AT89S51单片机每12个时钟周期为1个机器周期。

通常,一条指令的执行要分为好几个基本操作,每个基本操作耗时一个机器周期。

3、指令周期:指令周期是执行一条指令所需的时间。

单片机的指令按字节可分为单字节(1个机器周期)、双字节(2个机器周期)、三字节指令(3个机器周期),乘法、除法指令需要(4个机器周期),因此执行一条指令的时间也不相同。

几个周期的关系如下:

时钟周期==1/fosc

机器周期=12*时钟周期

指令周期=1~4机器周期。

当使用12M晶振,执行单字节指令的时间 t=12*(1/fosc)=12*(1/12M)=1us。

不管使用多大的晶振,使用51单片机,一般都是12分频出来,也就可以得出一个机器周期:机器周期=12/n(n指晶振频率),

假设要定时的时间为M,那么定时的初值为:

M/机器周期=初值;

TH0= (65536-初值/256;

TL0= (65536-初值)/256;

将(65536-初值)所得的值化成16进制,其高位就是TH0的值,低位为TL0的值。

例如用12M晶振做1ms定时计算如下:

机器周期=12/12*10^6=1us(微秒);

定时初值=(1*10个-3)/(1*10^-6)=1000。

6.3关于51的定时器

89C52RC与stc12的定时计算方式一致

51单片机中有两个定时器T0和T1:

TF0:定时器T0溢出中断请求。当定时器TO产生溢出时,TO中断请求标志TF0置1,请求中断处理。

TF1:定时器T1溢出中断请求。当定时器Tl产生溢出时,T1中断请求标志TF1置1,请求中断处理。

        定时/计数器T0和T1分别是由两个8位的专用寄存器组成,即定时/计数器T0由TH0和TL0组成,T1由TH1和TL1组成。此外,其内部还有2个8位的特殊功能寄存器TMOD和TCON,TMOD负责控制和确定T0和T1的功能和工作模式,TCON用来控制T0和T1启动或停止计数,同时包含定时/计数器的状态。

TF1:定时器1溢出标志。定时/计数器溢出时由硬件置位。中断处理时由硬件清除。或用软件清除。

TF0:定时器0溢出标志。定时/计数器溢出时由硬件置位。中断处理时由硬件清除,或用软件清除。

6.4关于最初装载值的计算

10MS定时器初值的计算

1.晶振12M

12MHz除以12为1MHz,也就是说一秒=1000000次机器周期。10ms=10000次机器周期。

65536-10000=55536(d8f0)

TH0=0xd8,TL0=0xf0

2.晶振11.0592M

11.0592MHz除以12为921600Hz,就是一秒921600次机器周期,10ms=9216次机器周期。

65536-9216=56320(dc00)

TH0=0xdc,TL0=0x00

50MS定时器初值的计算

1.晶振12M

12MHz除12为1MHz,也就是说一秒=1000000次机器周期。50ms=50000次机器周期。

65536-50000=15536(3cb0)

TH0=0x3c,TL0=0xb0

2.晶振11.0592M

11.0592MHz除12为921600Hz,就是一秒921600次机器周期,50ms=46080次机器周期。

65536-46080=19456(4c00)

TH0=0x4c,TL0=0x00

使用说明 

以12M晶振为例:每秒钟可以执行1000000次机器周期个机器周期。而T每次溢出最多65536个机器周期。我们尽量应该让溢出中断的次数最少(如50ms),这样对主程序的干扰也就最小。开发的时候可能会根据需要更换不同频率的晶振(比如c51单片机,用11.0592M的晶振,很适合产生串口时钟,而12M晶振很方便计算定时器的时间),使用插接式比较方便。

6.5 寄存器的使用

6.5.1 什么是寄存器?

寄存器的功能是存储二进制代码,它是由具有存储功能的触发器组合起来构成的。一个触发器可以存储1位二进制代码,故存放n位二进制代码的寄存器,需用n个触发器来构成。 

按照功能的不同,可将寄存器分为基本寄存器和移位寄存器两大类。基本寄存器只能并行送入数据,也只能并行输出。移位寄存器中的数据可以在移位脉冲作用下依次逐位右移或左移,数据既可以并行输入、并行输出,也可以串行输入、串行输出,还可以并行输入、串行输出,或串行输入、并行输出,十分灵活,用途也很广。

备注:这是百度比较官方的科普,个人理解:我所遇到的寄存器主要有两种,一个是计数用的,一个是用来配置的。计数的,就例如定时器,就是不断的往寄存器里面+1,直到加到寄存器的值溢出了,要么停止计数退出计数,要么重置继续计数。第二种寄存器在51不常见,但是以后学到32就很常见了(32啥东西都要去配置寄存器,51基本上都配置好了,所以51功能要比32少很多)。这种寄存器是用来干嘛的呢,就是你要打开单片机里的某个功能,就要去设置相对应的寄存器,去给寄存器赋某个已经由厂家设定好的值,单片机才能运行这个功能。

6.5.2 关于51定时器所用到的寄存器

定时器/计数器控制寄存器TCON :

TCON为定时器/计数器T0、T1的控制寄存器,同时也锁存T0、T1溢出中断源和外部请求

中断源等,TCON格式如下:

TCON : 定时器/计数器中断控制寄存器 (可位寻址)

TF1: 定时器/计数器T1溢出标志。T1被允许计数以后,从初值开始加1计数。当最高位产生溢 出时由硬件置“1”TF1,向CPU请求中断,一直保持到CPU响应中断时,才由硬件清

“0”TF1(TF1也可由程序查询清“0”)。

TR1: 定时器T1的运行控制位。该位由软件置位和清零。当GATE(TMOD.7)=0,TR1=1时就 允许T1开始计数,TR1=0时禁止T1计数。当GATE(TMOD.7)=1,TR1=1且INT1输入

高电平时,才允许T1计数。

TF0:定时器/计数器T0溢出中断标志。T0被允许计数以后,从初值开始加1计数,当最高位产生溢出时,由硬件置“1”TF0,向CPU请求中断,一直保持CPU响应该中断时,才由硬件清“0”TF0( TF0也可由程序查询清“0”)。

TR0: 定时器T0的运行控制位。该位由软件置位和清零。当GATE(TMOD.3)=0,TR0=1时就 允许T0开始计数,TR0=0时禁止T0计数。当GATE(TMOD.3)=1,TR1=0且INT0输入 高电平时,才允许T0计数。

IE1:外部中断1请求源(INT1/P3.3)标志。IE1=1,外部中断向CPU请求中断,当CPU响应该 中断时由硬件清“0”IE1。

IT1:外部中断1触发方式控制位。IT1=0时,外部中断1为低电平触发方式,当INT1(P3.3)

输入低电平时,置位IE1 。采用低电平触发方式时,外部中断源(输入到INT1)必须保

持低电平有效,直到该中断被CPU 响应,同时在该中断服务程序执行完之前,外部中断

源必须被清除(P3.3要变高),否则将产生另一次中断。当IT1=1时,则外部中断1(INT1)

端口由“1”→“0”下降沿跳变,激活中断请求标志位IE1 ,向主机请求中断处理。

IE0:外部中断0请求源(INT0/P3.2)标志。IE0=1外部中断0向CPU请求中断,当CPU响应外部中断时,由硬件清“0”IE0(边沿触发方式)。

IT0:外部中断0触发方式控制位。IT0=0时,外部中断0为低电平触发方式,当INT0(P3.2)

输入低电平时,置位IE0。采用低电平触发方式时,外部中断源(输入到INT0)必须保持低电平有效,直到该中断被CPU响应,同时在该中断服务程序执行完之前,外部中断源必须被清除(P3.2要变高),否则将产生另一次中断。当IT0=1时,则外部中断0(INT0)端口由“1”→“0”下降沿跳变,激活中断请求标志位IE1 ,向主机请求中断处理。

定时器/计数器工作模式寄存器TMOD:

定时和计数功能由特殊功能寄存器TMOD的控制位C/T进行选择,TMOD寄存器的各位信 息如下表所列。可以看出,2个定时/计数器有4种操作模式,通过TMOD的M1和M0选择。2个定时/计数器的模式0、1和2都相同,模式3不同,各模式下的功能如下所述。

 

四种工作方式(要会设置)和初值计算

编程步骤:

确定定时时间计算初值

写对应的定时器/计数器的初始化函数(确定工作方式和打开定时器中断和总中断)

根据选择的工作方式判断是否需要软件清除标志位

  • 写定时器中断服务函数(注意对应的中断号)
  • 历程:

    /************************************************************************
    
    选择不同的定时器工作模式,对应的中断服务函数会有所不同
    
    (一般为两种 自动重装载 和 不自动重装载)
    
    *************************************************************************/
    
    #include <STC89C5xRC.H>
    
    /************************************************************************
    
    函数名:void time0();
    
    功能:初始化定时器(按自己的需求调试)
    
    输入:无
    
    输出:无
    
    *************************************************************************/
    
    void time0() //pattern 1 16 wei
    
    {
    
      AUXR &= 0x7F; //定时器时钟12T模式
    
    TMOD |= 0x01;//选择工作模式    16位
    
    TH0 = 0xdc;         
    
    TL0 = 0x00;//初值设定10ms 通过计算得出
    
    TF0 = 0; //清除TF0标志
    
    ET0 = 1;
    
    TR0 = 1;//定时器为1开始计时 为0停止计时
    
    EA = 1;//总中断 开
    
    }
    
    /************************************************************************
    
    函数名:void second0();  
    
    功能:定时器中断服务函数(时间达到后运行函数里的程序)
    
    输入:无
    
    输出:无
    
    *************************************************************************/
    
    void second0() interrupt 1//定时器0 对应的中断号
    
    {
    
    TH0 = 0xdc;         
    
    TL0 = 0x00;
    
    P10 = ~P10;//到达指定时间 IO口取反一次
    
    }
    
    /************************************************************************
    
    函数名:void main();  
    
    功能:主体运行函数
    
    输入:无
    
    输出:无
    
    *************************************************************************/
    
    void main()
    
    {
    
    time0();
    
    P10 = 0;//P10口给低电平
    
    while(1);
    
    }

    物联沃分享整理
    物联沃-IOTWORD物联网 » 51单片机的定时器

    发表评论