51单片机教程(十一)- 单片机定时器

11、单片机定时器

项目目标

通过定时器/计数器实现流水灯控制。

知识要点

定时器的结构。
TMOD和TCON;
定时/计数器工作方式;
定时/计数器编程步骤;

1、项目分析

前面的流水灯的时间控制通过空循环语句来实现,定时不是很精确。本章通过用定时器来控制流水灯任务可以实现精确的时间控制。这就需要了解定时器的使用。定时器和计数器实质功能相同,本章利用LED灯二进制计数任务来掌握计数器的使用。

2、技术准备

1 背景

从软件延时的缺点说起

前面讲过的“用若干次空循环实现延时”的例子

软件延时的缺点:

延时过程中,CPU时间被占用,无法进行其他任务,导致系统效率降低。延时时间越长,该缺点便越明显,因此软件延时只适用于短暂延时,或简单项目。

定时/计数器

单片机中有多个小闹钟,可以实现延时,这些小闹钟就是“定时器”。

2 工作原理

背景

LED闪烁使用【演示法】实现,一般情况下不会采用延时的方式实现,CPU在程序执行到delay函数过程中需要不断执行循环空语句,会占用的CPU资源;若单边机外设较多,导致无法监控到其他的外设的中断事件。

常用方法是采用:中断法。

概念

定时/计数器具有定时与计时的功能

计数:指对外部脉冲信号进行技术,每来一个脉冲计数值加1;当产生的信号脉冲很有规律,则多少个脉冲就能知晓是过了多少秒,从而计数功能就可以演化为定时功能。

定时:根据某个基准时钟,通过对基准时钟的计数来完成定时功能。

作用

产生所需频率的脉冲。如产生频率1000Hz,占空比为1:1的脉冲波。

累加计数的功能,计数可在一段时间内记录信号A经整形后的脉冲个数。

频率测量的功能,测量脉冲宽度或在一定时间内测量脉冲的个数,从而推算出脉冲的频率。

定时/计数器的功能,对时钟信号进行计数,也可用来倒计时,秒表,循环计数等。

工作原理

在定时方式1下,定时/计数器0的核心是一个16位宽的

由计数脉冲触发的按递增规律(即累加方式)工作的循环累加计数器(TH0+TL0)。从预先设定的初始值开始,每来一个计数脉冲就加1,当加到计数器为全1时,再输入一个脉冲,就会发生溢出现象,计数器回零,同时产生溢出中断请求信号(TF0置1)。如果定时/计数器工作于定时模式,则表示定时时间已到。

工作模式

定时器可以工作在不同的模式下,常见的模式包括定时模式、计数模式和PWM模式。

定时模式:定时器按照预设值进行计数,当计数器达到预设值时触发中断或产生脉冲信号。
计数模式:定时器根据外部输入的脉冲信号进行计数,可以用于计数外部事件的频率或脉冲数量。
PWM模式:定时器可以生成脉冲宽度调制(PWM)信号,用于控制电机速度、LED亮度等。

定时器与计数器


单片机晶振:12M

时钟周期:1 / 12000000,机器周期:12 / 12000000
定时20ms:次数 * 12 / 12000000 = 0.02,次数:20000.

因为采用的定时模式1,将45536(65536 – 20000)化为十六进制装载到寄存器TH0和TL0中,45536 / 256=177,45536 % 256=244,将177转化为十六进制0XB1装载到TH0,将244转化为十六进制0XF4装载到TL0。

3 定时/计数器

实现定时功能,比较方便的办法是利用单片机内部的定时/计数器。也可以采用下面三种方法:

软件定时:软件定时不占用硬件资源,但占用了CPU时间,降低了CPU的利用率。
采用时基电路定时:例如采用555电路,外接必要的元器件(电阻和电容),即可构成硬件定时电路。但在硬件连接好以后,定时值与定时范围不能由软件进行控制和修改,即不可编程。
采用可编程芯片定时:这种定时芯片的定时值及定时范围很容易用软件来确定和修改,此种芯片定时功能强,使用灵活。在单片机的定时/计数器不够用时,可以考虑进行扩展。

4 定时器溢出

什么是溢出?
任何一个计数范围有限的系统,均存在溢出现象。系统的可表达数的个数,称为模。定时器溢出时会导致定时器溢出中断请求,和该中断是否使能无关。

5 结构原理

定时/计数器的实质是加1计数器(16位),由高8位和低8位两个寄存器组成。

TH0、TL0用于T0的计数,TH1、TL1用于T1的计数。
TMOD是定时/计数器的工作方式寄存器,确定工作方式和功能;
TCON是控制寄存器,控制T0、T1的启动和停止及设置溢出标志。

定时/计数器的工作原理

加1计数器输入的计数脉冲有两个来源,一个是由系统的时钟振荡器输出脉冲经12分频后送来;一个是T0或T1引脚输入的外部脉冲源。每来一个脉冲计数器加1,当加到计数器为全1时,再输入一个脉冲就使计数器回零,且计数器的溢出使TCON中TF0或TF1置1,向CPU发出中断请求(定时/计数器中断允许时)。如果定时/计数器工作于定时模式,则表示定时时间已到;如果工作于计数模式,则表示计数值已满。可见,由溢出时计数器的值减去计数初值才是加1计数器的计数值。

设置为定时器模式时,加1计数器是对内部机器周期计数(1个机器周期等于12个振荡周期,即计数频率为晶振频率的1/12)。计数值N乘以机器周期Tcy就是定时时间 t 。

设置为计数器模式时,外部事件计数脉冲由T0或T1引脚输入到计数器。在每个机器周期的S5P2期间采样T0、T1引脚电平。当某周期采样到一高电平输入,而下一周期又采样到一低电平时,则计数器加1,更新的计数值在下一个机器周期的S3P1期间装入计数器。由于检测一个从1到0的下降沿需要2个机器周期,因此要求被采样的电平至少要维持一个机器周期。当晶振频率为12MHz时,最高计数频率不超过1/2MHz,即计数脉冲的周期要大于2 μs。

定时/计数器的控制
80C51单片机定时/计数器的工作由两个特殊功能寄存器控制。TMOD用于设置其工作方式;TCON用于控制其启动和中断申请。

6 TMOD

工作方式寄存器TMOD用于设置定时/计数器的工作方式,低四位用于T0,高四位用于T1。其格式如下:

GATE:门控位。GATE=0时,只要用软件使TCON中的TR0或TR1为1,就可以启动定时/计数器工作;GATA=1时,要用软件使TR0或TR1为1,同时外部中断引脚或也为高电平时,才能启动定时/计数器工作。即此时定时器的启动多了一条件。

C/T :定时/计数模式选择位。 C/T =0为定时模式; C/T =1为计数模式。

M1M0:工作方式设置位。定时/计数器有四种工作方式,由M1M0进行设置。

M1 M0 模式 功能描述
0 0 0 13位定时器/计数器,TL0只用于低5位参与分频,TH0整个8位全用
0 1 1 16位定时器/计时器,TL0、TH0全用
1 0 2 8位自动重装载定时器,当溢出时将TH0存放的值自动重装入TL0
1 1 3 定时器/计数器此时无效(停止计数)

7 TCON

TCON的低4位用于控制外部中断,已在前面介绍。TCON的高4位用于控制定时/计数器的启动和中断申请。其格式如下:

TF1(TCON.7):T1溢出中断请求标志位。T1计数溢出时由硬件自动置TF1为1。CPU响应中断后TF1由硬件自动清0。T1工作时,CPU可随时查询TF1的状态。所以,TF1可用作查询测试的标志。TF1也可以用软件置1或清0,同硬件置1或清0的效果一样。
TR1(TCON.6):T1运行控制位。TR1置1时,T1开始工作;TR1置0时,T1停止工作。TR1由软件置1或清0。所以,用软件可控制定时/计数器的启动与停止。
TF0(TCON.5):T0溢出中断请求标志位,其功能与TF1同。
TR0(TCON.4):T0运行控制位,其功能与TR1类同。

7 工作方式

1、方式0

方式0为13位计数,由TL0的低5位(高3位未用)和TH0的8位组成。TL0的低5位溢出时向TH0进位,TH0溢出时,置位TCON中的TF0标志,向CPU发出中断请求。

计数个数与计数初值的关系为:X=213−NX=2^{13}-NX=213−N,最大计数为 8192。

2、方式1

方式1的计数位数是16位,由TL0作为低8位、TH0作为高8位,组成了16位加1计数器。

计数个数与计数初值的关系为:X=216−NX=2^{16}-NX=216−N,最大计数为 65536。

3、方式2

方式2为自动重装初值的8位计数方式。

计数个数与计数初值的关系为:X=28−NX=2^8-NX=28−N

4、方式3

方式3只适用于定时/计数器T0,定时器T1处于方式3时相当于TR1=0,停止计数。

8 TCON

其中高4位控制:定时/计数器T0和T1的运行,低4位控制外部中断 INT0 和 INT1 的运行

TF1:T1 计数溢出标志位,计数寄存器产生溢出时由硬件自动置位,置位后向CPU申请中断,中断响应后硬件自动复位,若采取程序查询方式,必须由软件清除。
TR1:T1运行控制位,由软件置位和复位。当GATE(TMOD.7)为0时,由软件设置为“1”时立即启动T1计数寄存器开始计数,清除为 “0” 时立即停止T1计数寄存器计数。当GATE为1时,置位TR1为 “1” 时还必须INT1输入为高电平时,才启动T1计数,清除为 “0” 时或INTI输入为低电平时均可停止TI计数。
TF0:T0 计数溢出标志位,计数寄存器产生溢出时由硬件自动置位,置位后向CPU申请中断,中断响应后硬件自动复位,若采取程序查询方式,必须由软件清除。
TR0:T0运行控制位,由软件置位和复位。当GATE(TMOD.7)为0时,由软件设置为“1”时立即启动T0计数寄存器开始计数,清除为 “0” 时立即停止T0计数寄存器计数。当GATE为1时,置位TR0为 “1” 时还必须INT0输入为高电平时,才启动T0计数,清除为 “0” 时或INT0输入为低电平时均可停止T0计数。

9 操作步骤

选择工作方式(设置M1,M0)

选择定时器还是计数器模式(设置C/T)

给定时/计数器赋初值(设置THx和TLx)

开启定时器中断(设置ET0或ET1)

开启总中断(设置EA)

打开计数器(设置TR1或TR0)

前2步设置TMOD寄存器即可。

定时器0初值计算

人工计算(为方便计算,本讲晶振改用12MHz)

计数值=定时时间 / (振荡周期 / 12)
初值=65536-计数值
定时时间=(振荡周期12) * (65536-初值)
最大定时时间+(振荡周期*12)*65536=65.536ms
用51单片机定时器初值计算器快速计算16位定时器的初值。

10 实现过程

TMOD-定时器的工作方式(或模式),根据教材的图表,对照分析每一位含义。

TH0/TL0-定时器的初始值(需要注意高字节对256取模,低字节对256取余)。

EA-总中断允许与否,EA=1开启单片机总中断(只有总中断开启后才可响应各个中断)。

ET0-定时器中断允许与否,ET0=1开启。

TR0-定时器运行与否,TR0=1运行起来。

定时器中断函数(也称为定时器超时回调函数):

void low() interrupt 1
{
              
    TH0=0;TL0=0;//装载定时器初始值
    P1=~P1;//按位取反
}

初始值计算时,要注意理解振荡周期、机器周期的基本概念。在实际项目中,一般采用工具计算生成初始值:

## 3、项目实施

项目、定时器0控制LED灯闪烁

// 实验代码单片机定时器程序1
/*************************************************
*实验名:定时器实验
*实验效果:第一个led灯以定时器0设定的时间周期闪烁
*************************************************/

#include <reg52.h>

sbit led = P1^0;
unsigned int i = 0;

void main()
{
            
  TH0 = 0x3C;
  TL0 = 0xB0;
  TMOD = 0x01;
  ET0 = 1;
  TR0 = 1;
  EA = 1;
  while(1);
}

void T0_RouTime() interrupt 1
{
            
  TH0 = 0x3C;
  TL0 = 0xB0;
   i++;
  if (i==20)
  {
            
  	led = ~led;
  	i = 0;
  }
}

© 版权声明
THE END
如果内容对您有所帮助,就支持一下吧!
点赞0 分享
回头是岸的头像 - 宋马
评论 抢沙发

请登录后发表评论

    暂无评论内容