51单片机的定时器属于单片机的内部资源,其电路的连接和运转均在单片机内部完成
作用:
- 用于计时系统
- 替代长时间Delay,提高运行效率和速度
- 任务切换
STC89C52定时器资源:
定时器个数:3个(T0,T1,T2),T2是新增资源,T0T1为老版本兼容
定时器的资源和单片机的型号是关联在一起的,不同型号可能有不同定时器个数和操作方式
定时器根据时钟的输出信号,每隔固定时间段,计数单元的数值加一,当计数单元数值增加到设定的值时,计数单元会向中断系统发出中断申请,使程序跳转到中断服务函数中执行
STC89C52的T0和T1均有四种工作模式:
- 模式0:13位定时器/计数器
- 模式1:16位定时器/计数器(常用)
- 模式2:8位自动重装模式
- 模式3:两个8位计数器
计数单元:时钟发出脉冲给计数单元,每个脉冲加一,计数单元一共2*8=16位(最大65535),超过最大值溢出,此时标志位TF0发出中断请求
时钟:有两个来源
- SYSclk系统时钟,即晶振周期,12MHz,此时做定时器
- T0 Pin外接时钟——此时做计数器
中断系统:使CPU具有对外界紧急事件的实时处理能力,高级别的中断优先执行,多级中断称为中断嵌套,中断请求的来源称为中断源
STC89C52中断资源:
- 中断源个数:8个(外部中断0,定时器0中断,外部中断1,定时器1中断,串口中断,外部中断2,外部中断3)
- 中断优先级个数:4个
- 中断号:
寄存器是连接软硬件的媒介在单片机中寄存器就是一段特殊的RAM存储器,一方面,寄存器可以存储和读取数据,另一方面,每一个寄存器背后都连接了一根导线,控制着电路的连接方式寄存器相当于一个复杂机器的“操作按钮”
TCON:控制中断
TMOD:定时和计数功能
12MHz每隔一微秒加一,计数单元(0~65535),通过赋初始值的方式做到每秒中断:
0~65535
总共定时65535us
计数单元初始值为64535,计时时间为1000us=1ms
所以TH0(高位)TL0(低位)应组合
TH0 = 64535/256; // 取出64535的高八位赋给TH0
TL0 = 64535%256; // 取出64535的低八位赋给TL0
1.因为64535是十进制数,要先转换为十六进制数所以除16;
2.然后还要取高8位,所以再除16,算到一起就是除256.
3.取模同理
void Timer0_Init(){
TMOD = 0x01; // 0000 0001 定时模式1
// 这里TMOD可以使用与或式赋值法,只操作特定位而不改变其他位
// TMOD &= 0xf0;
// TMOD |= 0x01;
TF0 = 0; // 标志位初始化,防止产生中断
TR0 = 1; // 运行控制位,开始计数工作
TH0 = 64535 / 256; // 给计数单元赋初值
TL0 = 64535 % 256;
ET0 = 1;// 溢出中断允许位
EA = 1; // 总中断允许控制位
PT0 = 0; // 定时器0中断优先级控制位
}
void Timer0_Rountine() interrupt 1{ // 中断号
static unsigned int T0Count = 0;
TH0 = 64535 / 256; // 给计数单元赋初值,保证每次移除后都是从64535开始重新计数
TL0 = 64535 % 256;
T0Count++;
if(T0Count >= 1000){ // 中断次数超过1000,即经过1秒后
T0Count = 0;
P2 = ~P2;
}
}
一个函数头文件:INTRINS.H
内部函数 描述
_crol_ 字符循环左移 溢出则从低位重新开始
_cror_ 字符循环右移
_irol_ 整数循环左移
_iror_ 整数循环右移
_lrol_ 长整数循环左移
_lror_ 长整数循环右移
_nop_ 空操作 8051 NOP 指令
_testbit_ 测试并清零位 8051 JBC 指令
_nop_ 空操作 8051 NOP 指令
_testbit_ 测试并清零位 8051 JBC 指令