(4)定时器

51单片机的定时器属于单片机的内部资源,其电路的连接和运转均在单片机内部完成

作用:

  1. 用于计时系统
  2. 替代长时间Delay,提高运行效率和速度
  3. 任务切换

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具有对外界紧急事件的实时处理能力,高级别的中断优先执行,多级中断称为中断嵌套,中断请求的来源称为中断源

扫描二维码关注公众号,回复: 15133607 查看本文章

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 指令

猜你喜欢

转载自blog.csdn.net/Falling_Asteroid/article/details/130736668