在之前的文章中,我们使用了delay函数以达到延时的效果。

使用delay函数延时有两种坏处:

1、delay函数的延时精准度不是很高;

2、delay延时是利用单片机CPU运行无意义代码段以达到延时的效果。用个不严谨的比喻。这相当于CPU在玩鬼抓人,鬼是CPU,人是任务。当CPU想过两分钟去完成任务1,这段两分钟的延时时间是在数数,等数到两分钟后再去完成任务1。这数数的过程就相当于浪费了CPU的功能。

本篇文章将介绍CPU的定时器功能。用定时器完成的延时相较于delay函数来说,延时效果更加精准。而且使用定时器延时,CPU可以去做其他事情,相当于多线工作。

拿上文的比喻来说,CPU这个鬼在数两分钟去抓人的时候,用了手表计时,手表相当于定时器,这个时候鬼可以做其他事情,比如唱歌。

每个单片机的内部资源不同,有些单片机有2个定时器,有些单片机有3个或者更多的定时器,但一般对于51单片机来说,都是定时器0和定时器1两个定时器。由于定时器0和定时器1常用且都有,本篇文章以定时器0和1为例讲解定时器的使用。

定时器0和定时器1都有四种工作模式:
模式0:13位定时器/计数器
模式1:16位定时器/计数器(常用)
模式2:8位自动重装模式
模式3:两个8位计数器

其中模式1是最为常用的工作模式,模式2在pwm中会用到。其他两个模式基本用不到。

在本篇文章中将介绍模式1的使用,模式2将在之后的pwm驱动电机中介绍。

使用定时器,首先要对两个寄存器进行配置。

一、工作模式寄存器TMOD的配置

这个寄存器分为两个部分,前四位是用来配置定时器1的,后四位是用来配置定时器0的

从图片中可以看到,第7位和第3位是GATE,想要使用定时器,这个位必须配置为1

第6位和第2位是C/T,这个位写0时用作定时器,写1时用作计数器

第5位、第4位或者第1位、第0位分别是M1、M0,用来配置定时器的工作模式的。在本篇文章中我们将M1写0,M0写1,配置成工作模式1(常用)。

二、控制寄存器TCON的配置

TF1和TF0是溢出标志位,当定时器向CPU申请中断时,溢出标志位会由硬件自动置1。如果是定时器0申请中断,TF0=1;如果是定时器1申请中断,TF1=1;

TF1、TF0是硬件自动置1,需要软件置0。单片机初始化时也要将其置0。

TR1和TR0是运行控制位,顾名思义,只有当它为1时,定时器才运行。

剩下的IE1、IE0、IT1、IT0是关于外部中断的位,直接置0或者不管即可。

定时器中断,既包括了定时器部分,也包括了中断部分。所以我们还需要对中断的寄存器进行配置。

只要记住使用定时器0就将ET0=1;使用定时器1就将ET1=1。

然后再写EA=1。

至于最后的PT0和PT1是关于中断优先级的,我们这里用到的时候直接写0即可。

三、配置THX、TLX

现在我们离配置定时器只剩下最后一步————配置THX和TLX

使用定时器1就配置TH1和TL1;使用定时器0就配置TH0和TL0

关于这两个的配置可以直接使用STC-ISP,在下一步会说到

四、快速配置定时器

复制代码后要修改

这个定时器的初始化函数,放在main函数中,让单片机上电后首先执行一遍。

还要写一个中断服务程序,当定时器中断时就会执行这个中断服务程序

这是个中断服务程序的定义,放在main.c中方便观看。

如果使用的是定时器0,就再函数名右边写interrupt 1,表示当定时器0申请中断时会进入这个程序
如果使用的是定时器1,就再函数名右边写interrupt 3,表示当定时器1申请中断时会进入这个程序

以上就是定时器中断的使用方法了。

最后修改:2025 年 01 月 09 日