第一次在学习定时器的时候模模糊糊,在做过一些题目之后对定时器有了更新的理解,现在整理一下,做笔记使用。
目录
一.基础知识
定时器的作用:
定时器的实质:
定时器的工作原理:
定时器的两个工作模式:
(1)定时器模式:(该模式可以用STC软件来直接得出定时器,而不用自己设定)
(2)计数器模式
二.配置定时器0
三.配置定时器0的中断
定时计数器可以用于精确事件定时,PWM脉宽调制,波形发生,信号时序测量的方面。计时也是通过计数来实现的。
加1的16位计数器 分 高八位、低八位组成
51单片机定时器0内部有两个寄存器TH0和TL0,都是1字节的,理解位定时器0高位寄存器(TH0),定时器0低位寄存器(TL0), 我们知道2字节最大能存65535。
比赛板拥有三个定时器0,定时器1,定时器2 主要用定时器0
加1计数器对输入的脉冲进行计数。
定时器模式的原理:①由系统的时钟振荡器输出脉冲经12分频(1/12 us)后送来;加1计数器是对内部机器周期计数。计数值N×机器周期Tcy就是定时时间t 。
51单片机内部有一个12MHZ的晶振:即时钟周期=1/(12M) (s) = 1/12 us
51单片机一个指令周期(机器周期)是12个时钟周期:即指令周期=12*1/12 us = 1us
每经过一个机器周期(1us),内部的16位计数 寄存器的值就会加1,直到这个寄存器装满时溢出。当加到溢出后发出一个溢出中断,即硬件使TCON中TFO或TF1置1,我们程序可以捕获到这个中断,就可以知道此时经历了(65535+1)us。
T0(T1)当做定时器来使用,就不用外部P3.4(P3.5)引脚,是用内部机器周期计数实现定时的,当定时到就会引起中断.我们可以算出工作在定时模式时最高单次定时时间为 65535*1.085us=时间(单位us)(最高单次定时时间大概在6毫秒左右,这也就是为什么STC软件中为什么定时器只能做6毫秒以下时间的)
原理:②T0或T1引脚输入的外部脉冲源。T0(P3.4引脚),T1(P3.5引脚)每来一个脉冲计数器加1(共有16位计数器),当加到计数器为全1时,再输入一个脉冲就使计数器回零,且计数器的溢出使TCON中TFO或TF1置1,向CPU发出中断请求(定时/计数器中断允许时).
T0(T1)当做计数器来使用,才用到外部P3.4(P3.5)引脚,检测到1个脉冲,计数+1,当计数满时就会引起中断。
1配置辅助寄存器 (置于定时器启动之前)
AUXR=0X80;
对51单片机进行兼容处理。
2.TCON寄存器:启动定时/计数器
(可位寻址,控制T0、T1的启动和停止,以及设置溢出标志。
后缀为1的是定时器1的配置,不用管)
TF0 = 0; //清除TF0溢出中断标志,加到65536后TF0会被硬件置为1,我们需要把他清0.
TR0 = 1; //为1时允许定时器0计数,为0时不允许计数
IE0和IT0不用管。
所以,我们对于TCON寄存器的使用就只对TF0和TR0设置即可。
3.TMOD寄存器:
设置定时/计数器工作模式,设置定时/计数器工作模式。(不可位寻址)
定时器1的不用配置,全部置1即可,定时器0配置如下
GATE=0:用到中断的情况下,这一位需要设置为0;如果只用定时器的情况下设置为1即可。
C/T=0:0代表用作定时器(对内部系统时钟进行计数),1代表用作计数器(对T0-P34引脚的外部脉冲进行计数)。
M1=0,M0=0: M1和M0这样设置代表使用模式1,即TH0和TL0两个寄存器都使用。
【自动重装定时器】(后两位00):我们一开始给TH0和TL0一个初值,当它计数满65535之后,如果自动重装,TH0和TL0将会返回这个初值。(一般用这个)
【不可重装模式】(后两位01):我们一开始给TH0和TL0一个初始值,当他计数满65535之后,将不在返回这个初值,而是等待着我们再次给它赋值。
所以,TMOD=0XF0;
3.TH0和TL0(配置计数初值):
如果我们要定时1ms(1000个指令周期),可以这样做,设置寄存器的初值为64536(距离65535差1000,一次1us,1000次就是1ms),这样到溢出值65536就正好1ms。
TL0=64535%256+1;
TH0=64535/256;
定时器模式时有:N=t/Tcy(Tcy是机器周期)
计数初值的公式:X=-N
例如;计5ms的时间:t=5* s
Tcy=
得出 X=10240
转换成16进制:2800(4位二进制是1位16进制)
所以4位16进制的数转换成2进制就是16位
所以 28是高八位;00是低八位
然后将高八位装到TH0里面 将低八位装到TL0里面
即TH0=0X28;TL0=0X00;
定时器0的中断:1;定时器1的中断:3;定时器2的中断:12。
以定时器0为例:
Void time0 (void) interrupt 1
{
中断之后系统要做的程序
}