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;
}
}
暂无评论内容