在一般单片机中,有2个16位可编程的硬件计数模块T0和T1,我们称其为计数器或定时器,顾名思义,该模块可以实现定时和计数两种功能,其功能由软件控制和切换。实质这个定时器/计数器就是一个累加计数器,定时器的累加信号是由单片机内部振荡器的12分频信号产生,每过一个机器周期,定时器就加1,直至计满溢出结束;计数器就是对来自单片机外部的事件进行计数,外部计数事件由脉冲引入,单片机的P3.4(T0)和P3.5(T1)为外部计数脉冲输入端了,外部计数脉冲的频率不能高于晶振频率的1/24。
在上文中出现了几个时间概念,如时钟周期、晶振频率等,下面是这些概念的解释:
在使用定时器计数器时,通常需要先初始化定时器的各个参数,如预分频系数、计数模式等。然后,通过启动定时器,它会开始计时并不断递增计数器的值。当计数器的值达到设定的目标值时,可以触发相应的中断或执行一些其他操作。作为一类中断源,我们需要理解它的中断请求结构和设置方式。
由电路图可得,P3.4引脚与定时/计数器0相连,P3.5引脚与定时/计数器1相连,但是定时器依靠单片机内部晶振信号工作,所以这两个引脚实际上只用于计数工作。
位地址和名称与外部中断的控制寄存器相同,只是从低四位换成了高四位,这里对低四位的外部中断控制就不进行赘述了,感兴趣的朋友可以参照笔者先前的文章单片机原理及应用:中断系统结构与控制寄存器
地址 | 88H | 8FH | 8EH | 8DH | 8CH | 8BH | 8AH | 89H | 88H |
名称 | TCON | TF1 | TR1 | TF0 | TR0 | IE1 | IT1 | IE0 | IT0 |
TF1和TF0位分别表示定时器1和定时器0的溢出标志位。当定时器溢出时,对应的溢出标志位会被置1,之后会向CPU发送执行命令请求,在接收请求后,由硬件或软件清零。
TR1和TR0位用于控制定时器1和定时器0的开始/停止操作。当TR1或TR0位被置1时,对应的定时器开始计数;当TR1或TR0位被清零时,对应的定时器停止计数。
全称为工作方式控制寄存器,为定时器/计数器独有的控制方式。
地址 | D0H | D7H | D6H | D5H | D4H | D3H | D2H | D1H | D0H |
名称 | TMOD | GATE | C/T | M1 | M0 | GATE | C/T | M1 | M0 |
高四位控制T1,低四位控制T0。
M1 | M0 | 工作模式 | 描述 |
0 | 0 | 0 | 兼容8048单片机的13位定时器,THn的8位和TLn的5位组成一个13位定时器。 |
0 | 1 | 1 | THn和TLn组成一个16位的定时器。 |
1 | 0 | 2 | 8位自动重装模式,定时器溢出后THn重装到TLn中。 |
1 | 1 | 3 | 禁用定时器1,定时器0变成2个8位定时器。 |
下面对四种工作模式进行说明:?
工作方式0称为13位定时/计数器方式。它由16位定时器储存寄存器中的TL(0/1)的低5位和TH(0/1)的8位构成了13位的计数器,此时TL(0/1)的高3位未用。 当门控位GATE=0时,或门输出始终为1,与门被打开,由TR0控制定时/计数器的启动和停止。
工作方式1是一个由TH0中的8位和TL0中的8位组成的16位加1计数器。 方式1与方式0基本相似,最大的区别是方式1的加1计数器位数是16位。?
工作方式2是一个能自动装入初值的8位加1计数器,TH0中的8位用于存放定时初值或计数初值,TL0中的8位用于加1计数器。 加1计数器溢出后,硬件使TF0自动置1,同时自动将TH0中存放的定时初值或计数初值再装入TL0,继续计数。?
工作方式3分为两个独立的8位加1计数器TH0和TL0。TL0既可用于定时,也能用于计数;TH0只能用于定时。
需要注意定时器0有四种工作方式,而定时器1只有三种工作方式。这是因为在工作方式3下,T1的控制位TR1、TF1和中断源被T0占用,而T1无法反过来占用T0的资源。
在了解了工作方式后,我们需要对不同的工作方式赋予对应的初值。由于人的反应速度要远小于单片机的运行速度,即使是最大的定时器容量也只有不到0.1s,所以在程序中我们常用for循环多次重置初值来进行定时或计数,下面是一个举例,具体应用会发布在后续文章当中。
比如我们选用了一款晶振频率为12MHz的单片机,它的机器周期为1μs,要求每隔一秒执行一次程序,那我们可以先把1s分为10份或20份,每份就是100ms或50ms。之后我们选择合适的工作方式,在这里选用工作方式1,从零开始计数的话,工作方式1最大定时为65536μs,也就是六十多ms。根据就近原则,我们采取20次for循环,然后让定时器每50ms将溢出标志位置1。定时初值计算公式就是65536-50000=15536,再将15536/256=60……176,60转为二进制计入TH0为0011 1100,十六进制即0x3c;TL0为1011 0000,十六进制即0xb0。
IE的设置与外部中断相同,将相应的使能位赋1即可开启定时器,要注意无论是外部中断还是定时器,都需要先将总开关EA赋1再进行设置。
地址 | A8H | AFH | /? | /? | ACH | ABH | AAH | A8H | A9H |
名称 | IE | EA | /? | / | ES | ET1 | EX1 | ET0 | EX0 |
IP的用法与IE类似,正确地赋值即可。
地址 | B8H | /? | /? | /? | BCH | BBH | BAH | B9H | B8H |
名称 | IP | / | / | / | PS | PT1 | PX1 | PT0 | PX0 |
以上就是51单片机中定时器/计数器的设置方法,如有遗漏之处,欢迎大家讨论纠正。?