定时器/计数器
概念
定时器不是像LED、按键一样摆在外面实实在在可以看见,它是在芯片内部,依赖晶振产生固定的时间间隔。 它用于计时系统,实现软件计时,或每隔一段固定的时间间隔后引发中断完成一项操作。可以替代长时间的Delay,提高CPU运行效率和处理速度。因为Delay会让CPU一直在那个地方停滞,直到Delay结束CPU才继续其它操作,定时器就可以让CPU同时执行别的操作。 定时器每隔一个时间段,计数单元的值就增加,增加到预设值时,计数单元就会向中断系统发出中断申请,让程序跳转到中断服务函数中执行。这个中断就类似于你在睡觉,闹钟响了提醒你去上课,这时就要停止睡觉,执行完上课这一事件后再回来接着睡觉。 STC89C52系列单片机内部设置的两个16位定时器/计数器T0、T1都具有计数方式和定时方式两种工作方式。在特殊功能寄存器TMOD中都有一控制位C/T来选择T0或T1为定时器还是计数器。 定时器/计数器本质是对脉冲进行计数。如果计数脉冲来自系统时针,则为定时方式,每12个时钟或者每6个时钟得到一个计数脉冲,计数值加一;如果来自外部引脚(如图),则为计数方式,每来一个脉冲加一。
寄存器
工作模式寄存器TMOD
高4位配置T1、低4位T0。TMOD不能位寻址。 GATE是门控位,等于0时TR0/TR1通过软件置1即可启动定时器,等于1时TR0/TR1要置1还要让INT0/INT1为高电平时才启动定时器0/1。M1/M0就是控制定时器/计数器的工作模式,共四种。
控制寄存器TCON
用来控制两个定时器的启动、停止,锁存定时器溢出中断源和外部请求中断源等。可以位寻址,系统复位时所有位清零。 它的低四位与中断有关。IE0/IE1是外部中断0/1请求源(INT0/INT1)标志,等于1时外部中断向CPU请求中断,CPU响应该中断时由硬件自动置零。IT0/IT1选择外部中断触发方式,为1是脉冲触发,为0是低电平触发。 TF0/TF1就是定时器溢出标志,计满自动置1,向CPU请求中断,一直保持到CPU响应中断,才由硬件置零,也可由程序查询置零。
工作模式
一般大部分情况都是使用模式1即16位定时器/计数器。 此模式下,时钟给计数器提供脉冲,每来一个脉冲加一,TL0溢出向TH0进位,加到65535时产生溢出,TH0溢出置位TCON中的溢出标志位TF0,有这个标志位就会向中断系统申请中断。 SYSclk是系统时钟,即晶振周期,本板晶振为11.0592MHz。T0 Pin接外界引脚的。C/T为0接的是系统时钟,C/T为1接的是外部引脚,由此来选择是定时器功能还是计数器功能。
中断系统
概念
实现中断的部件叫中断系统,请示CPU中断的请求源叫中断源。 当同时有多个中断源时,规定每个中断源的优先级别,CPU会响应优先级别最高的中断请求。 当CPU正在处理一个中断源时,发生了另一个优先级更高的中断源请求,CPU暂停当前中断源的服务程序,处理完新的中断请求,再继续原来中断服务程序,这就是中断嵌套。这样的中断系统称为多级中断系统,没有中断嵌套功能的系统就是单极中断系统。 当两个相同优先级的中断同时产生,将由查询次序来决定系统先响应哪个。 STC89C52中断源有8个,外部中断INT0/1/2/3、定时器0/1/2中断、串口UART中断。 中断系统结构图:
寄存器
应用
晶振11.0592MHz每秒可以产生11.0592/12 = 0.9216M个机器周期 一个机器周期就是1s/0.9216M = 1.085us 1ms就需要922个机器周期 设初值64614——FC66
#include <REGX52.H>
void Timer0_Init()
{
TMOD = 0x01;
TF0 = 0;
TR0 = 1;
TH0 = 0xFC;
TL0 = 0x66;
ET0 = 1;
EA = 1;
PT0 = 0;
}
void main()
{
Timer0_Init();
while(1)
{
}
}
unsigned int T0Count;
void Timer0_Routine() interrupt 1
{
TH0 = 0xFC;
TL0 = 0x66;
TOCount++;
if(TOCount>=1000)
{
T0Count = 0;
P2_0 = ~P2_0;
}
}
这段程序呈现现象就是LED灯闪一秒灭一秒。 生成定时器可以直接在STC-ISP上生成。
|