#科技/51单片机/定时器
一、基础知识
-
1.1 定时器概念
- 属于单片机内部资源,其电路的连接和运行均在单片机内部完成。
- STC89C52定时器资源
- T0,T1,T2(与传统51不兼容);
-
1.2定时器作用
- 用于计时
- 代替长时间Delay,提高CPU运行效率和处理速度
-
1.3 原理
- 时钟的输出信号控制计数单元增加,当计数单元增加到设定值时,计数单元就会向中断系统发出中断申请,产生“响铃提醒”,使程序跳转到中断服务函数中执行
计时器框图 - 时钟的输出信号控制计数单元增加,当计数单元增加到设定值时,计数单元就会向中断系统发出中断申请,产生“响铃提醒”,使程序跳转到中断服务函数中执行
<figure>
<center><figcaption>16位定时器/计数器</figcaption></center>
- ####
1.计数系统
- 时钟传一个脉冲,计数器++,当计数器溢出时,置一个标志位TF0,向*中断系统*申请中断。
- #### 时钟系统:
- 最初来源
- 1、**SYSclk**:系统时钟,即晶振周期。
- 2、**T0 Pin*
- List item
*:外部引脚控制,实现计数器功能
- 寄存器位选择:
- C/T(counter/timer):1=>counter计数器 ;
0=>timer定时器
- #### 中断系统
- 功能:
- 使CPU具有对外界紧急事件实时处理能力
- 概念:
- 中断源:请示CPU中断的请求源
- 中断嵌套:CPU处理一个中断请求时,传来一个优先级更高的中断请求,CPU会暂停当前服务,转而处理优先级更高的中断请求,处理完后,再返回处理优先级低的服务程序。
-
2.2 定时器相关寄存器
- 1、定时器/计数器控制寄存器TCON(可位寻址,可单独赋值) - 2、定时器/计数器工作模式寄存器TMOD ---[!NOTE]
寄存器是连接软硬件的桥梁:
- 单片机通过配置寄存器,来控制内部线路的链接,通过控制内部线路不同方式的链接,来实现不同的功能。
- 寄存器的作用相当于开关
二、代码实现——独立按键配合计时器控制LED流水灯
- 以计时器T0为例
- 1、模块化配置T0的寄存器函数:
#include <REGX52.H>
/**
* @brief 定时器0初始化,一毫秒@12MHZ
* @param 无
* @retval 无
*/
void Timer0_Init(void) //1毫秒@12.000MHz
{
TMOD &= 0xF0; //设置定时器模式
TMOD |= 0x01; //设置定时器模式
TL0 = 0x18; //设置定时初始值
TH0 = 0xFC; //设置定时初始值
TF0 = 0; //清除TF0标志
TR0 = 1; //定时器0开始计时
ET0=1;
EA=1;
PT0=0;
}
- 2、主函数
- #include <REGX52.H>
#include "Timer0.h"
#include "Key.h"
#include <INTRINS.H>
unsigned char KeyNum,LEDMode;
void main()
{
P2=0xFE;
Timer0_Init();
while(1)
{
KeyNum=Key(); //获取独立按键键码
if(KeyNum) //如果按键按下
{
if(KeyNum==1) //如果K1按键按下
{
LEDMode++; //模式切换
if(LEDMode>=2)LEDMode=0;
}
}
}
}
void Timer0_Routine() interrupt 1
{
static unsigned int T0Count;
TL0 = 0x18; //设置定时初值
TH0 = 0xFC; //设置定时初值
T0Count++; //T0Count计次,对中断频率进行分频
if(T0Count>=500)//分频500次,500ms
{
T0Count=0;
if(LEDMode==0) //模式判断
P2=_crol_(P2,1); //LED输出
if(LEDMode==1)
P2=_cror_(P2,1);
}
}