定时器¶
定时器介绍¶
51单片机的定时器属于单片机的内部资源,其电路的连接与运转均在单片机内部完成。
作用:
- 用于计时系统,可实现软件计时,或者使程序每隔固定实践完成一样操作
- 代替长时间的Delay,提高CPU的运行效率和处理速度
STC59C52 定时器资源¶
定时器个数:3个——T0、T1、T2,其中T0、T1与传统的51单片机兼容,T2是此型号新加
定时器的资源和单片机的型号是关联的,不同型号单片机由不同的定时器个数和操作方式,其中 T0和T1是所有51单片机共有的。
原理¶
定时器在单片机内部,根据时钟的输出信号,每隔固定时间段,计数单元的数值就增加一,当计数单元数值增加到特定数值时,计数单元就会向中断系统发出中断申请,使程序跳转到中断服务函数中执行
【时钟】——> 【计数系统】 ——> 【中断系统】
提供计数单元的时钟脉冲 ——> 时钟计数 ——> 产生中断,执行定时任务
一共有以下四种模式,先讲解最常用的模式一。
- 模式0:13位定时器/计数器
- 模式1:16位定时器/计数器(常用)
- 模式2:8位自动重装模式
- 模式3:两个8位计数器
模式一:计数系统¶
- TL0:(定时器/计数器0的)Time Low
- TH0:(定时器/计数器0的)Time High
由于是16位,所以可以存储的最大数字为65535。
当记录到65535时,再计数,会溢出,+1后取末16位——即0,实现归零。
同时溢出时,将TF0置为0,TF0是定时器/计数器0的溢出中断标志位。
Notes
在单片机中,16位计数系统被分成两个部分:TL(Time Low)和TH(Time High),主要是为了实现更高效的计数和定时功能。以下是这种设计的几个关键原因:
-
寄存器结构:单片机通常使用8位寄存器,因此16位计数器需要分成两个8位寄存器来实现。这种设计允许单片机通过两个8位寄存器(TH和TL)来实现16位的计数能力。
-
灵活性:将计数器分为两个部分可以提供更多的灵活性。例如,在自动重装载模式下,TH可以作为预置寄存器,当TL计数溢出时,TH会自动重装载到TL中,从而实现连续计数。
-
溢出处理:在16位计数器中,当计数达到最大值(65535)时,会发生溢出。通过将计数器分为TH和TL,可以更容易地检测和管理溢出情况,例如通过设置中断来处理溢出事件。
-
定时精度:在定时应用中,16位计数器可以提供更高的定时精度。通过TH和TL的组合,可以设置不同的定时初值,从而实现更精细的定时控制。
-
编程方便:分开的寄存器允许程序员更容易地控制和修改计数器的值,例如,可以单独修改TH或TL来调整计数速度或定时长度。
-
硬件资源限制:由于单片机的硬件资源有限,将16位计数器分成两个8位寄存器是一种节省资源的做法,同时也能够满足大多数应用的需求。
模式一:时钟系统¶
1-来源
- SYSclk
- T0 Pin
SYSclk~系统时钟,即晶振周期,本开发板上的晶振为12MHz
2-分频
无论12MHz / 6MHz,除以 12 / 6,变成1MHz,即每隔一微秒计数
3-选择开关
决定定时器是作为计数器还是定时器工作。
- 当 C/T = 1 时,定时器工作在计数器模式——Counter
-
当 C/T = 0 时,定时器工作在定时器模式——Timer
-
在计数器模式下,定时器会根据外部事件(如INT0引脚的信号)进行计数
- 在定时器模式下,定时器会根据内部时钟信号进行计数。
模式一:中断系统¶
中断系统是为使CPU具有对外界 紧急事件的实时处理能力 而设置的。
当中央处理机CPU正在处理某件事的时候外界发生了紧急事件请求,要求CPU暂停当前的工作,转而去处理这个紧急事件,处理完以后,再回到原来被中断的地方,继续原来的工作,这样的过程称为 中断 。实现这种功能的部件称为中断系统,请示CPU中断的请求源称为 中断源 。
微型机的中断系统一般允许多个中断源,当几个中断源同时向CPU请求中断,要求为它服务的时候,这就存在CPU优先响应哪一个中断源请求的问题。通常根据中断源的轻重缓急排队,优先处理最紧急事件的中断请求源,即规定每一个中断源有一个优先级别。CPU总是先响应 优先级别最高 的中断请求。
当CPU正在处理一个中断源请求的时候(执行相应的 中断服务程序),发生了另外一个优先级比它还高的中断源请求。如果CPU能够暂停对原来中断源的服务程序,转而去处理优先级更高的中断请求源,处理完以后,再回到原低级中断服务程序,这样的过程称为 中断嵌套。这样的中断系统称为 多级中断系统,没有中断嵌套功能的中断系统称为 单级中断系统。
中断系统流程:
STC89C53 中断资源¶
中断资源个数:8个(外部中断0、定时器0中断、外部中断1、定时器1中断、串口中断、外部中断2、定时器2中断、外部中断3)
中断优先数:4个
如果使用C语言编程,中断查询次序号就是中断号,例如:
void Int0_Routine(void) interrupt0;
void Timer0_Rountine(void) interrupt1;
void Int1_Routine(void) interrupt2;
void Timer1_Rountine(void) interrupt3;
void UART_Routine(void) interrupt4;
void Timer2_Routine(void) interrupt5;
void Int2_Routine(void) interrupt6;
void Int3_Routine(void) interrupt7;
传统51单片机的终端系统:
定时器相关寄存器¶
寄存器是连接软硬件的媒介。
在单片机中寄存器就是一段特殊的RAM存储器一方面,寄存器可以存储和读取数据,另一方面,每一个寄存器背后都连接了一根导线,控制着电路的连接方式。
寄存器相当于一个复杂机器的“操作按钮。
(不)可位寻址¶
可位寻址:可以单独对其中一位赋值
反之,只能总体赋值
LED灯闪烁¶
如何实现记时1ms¶
计数范围:0~65535
每隔1us计数加1
总共定时时间65535us
64535离计数器溢出差值1000,所以计时时间为1ms
然后把64545,化成二进制,把高8位和低8位分别赋值TH0和TL0
代码¶
#include <REGX52.H>
void Timer0_Init(){
// 工作模式寄存器:不可位寻址
// 选择定时器模式一
// 门控端给0,使TR0单独控制
TMOD = 0x01; //(0000 0001)2
/**
TMOD = TMOD & 0xF0; //低四位清0,高四位不变
TMOD = TMOD | 0x01; //低四位置0
**/
// 控制寄存器TCON:可位寻址
TF0 = 0;
TR0 = 1;
// 计数脉冲
TH0 = 64535 / 256;
TL0 = 64535 % 256;
//打开通路
ET0 = 1;
EA = 1;
PT0 = 0;
}
void main(){
Timer0_Init();
while(1){
}
}
unsigned int T0Count;
void Timer0_Rountine(void) interrupt 1
{
// 否则溢出后,将从0开始重新计数
TH0 = 64535 / 256;
TL0 = 64535 % 256;
T0Count++;
if(T0Count >= 1000){
T0Count = 0;
P2_0 = ~P2_0;
}
}