在之前的文章中,我们使用了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申请中断时会进入这个程序
以上就是定时器中断的使用方法了。