控制组——定时器学习笔记

定时器

定时器介绍

相对于数码管等单片机L口控制的外设,定时器属于单片机的内部资源,其电路地方连接和运转均在单片机内部完成
作用:
1.用于计时系统,可实现软件计时,或者使程序每隔一固定时间完成一项操作
2.替代长时间delay,提高CPU的 运行效率和处理速度
(其它作用作者暂时还没用到)
原理框图:
在这里插入图片描述

定时器工作模式

在这里插入图片描述
四种模式中,最常用的是模式1(16位定时器),模式2(8位自动重装模式)很少用到,模式0、1几乎不会用

16位定时器最高定时65535微秒 约等于65毫秒,到了毫秒级别
而8位最高只能256微秒(不太实用)
由于每一次触发中断都会执行一些代码,这部分代码的执行一般需要十几微秒,所以如果200多微秒就触发一次,易导致时间误差变大

故此文章只大致说明模式一。
在这里插入图片描述
上图为模式一的内部框图,左框内为时钟,右框为中断的一部分(外面还有其他电路),框外的则为计数单元。

计数单元

TH0和TL0:组成了计数系统,两个字节共16位最大计数到65535,范围即0~65535,类似于unsigned int。
高低位的判断可由H和L得出,H即high,L即low。
控制位:即位于control左下方的部分,用于控制脉冲能否传给计数系统。

时钟系统

SYSclk:系统时钟,即晶振周期,本开发板上的晶振为12MHz
外部引脚提供时钟:直接传入脉冲用于计数
当MCU为12分频模式时,系统时钟输出脉冲的频率即为12/12=1MHz,周期为一微秒,计数单元每微秒计数一次
6分频则频率为2MHz,周期为0.5微秒,计数单元每微秒计数两次

配置寄存器的选择:图中的C/T处即配置寄存器,给0时为T即Timer作定时器,给1时为C即Counter做计数器。

定时器资源

我们的STC89C52单片机有T0、T1、T2三个定时器,其中T0和T1与传统的51单片机兼容,T2是此型号所增加的资源

兼容:一般为向下兼容,即创新的向传统的或者完善的向残缺的。所兼容的不止是一个定时器,还有它的操作方式。
一般来说,T0和T1的操作方式是所有51单片机所共有的

中断系统

中断系统是为使CPU具有对外界紧急事件的实时处理能力而设置的。
当中央处理机CPU正在处理某件事的时候外界发生了紧急事件请求,要求CPU暂停当前的工作,转而去处理这个紧急事件,处理完以后,再回到原来被中断的地方,继续原来的工作,这样的过程称为中断
实现这种功能的部件称为中断系统请示CPU中断的请求源称为中断源。微型机的中断系统一般允许多个中断源,当几个中断源同时向CPU请求中断,要求为它服务的时候,这就存在CPU优先响应哪一个中断源请求的问题。通常根据中断源的轻重缓急排队,优先处理最紧急事件的中断请求源,即规定每一个中断源有一个优先级别。CPU总是先响应优先级别最高的中断请求
当CPU正在处理一个中断源请求的时候(执行相应的中断服务程序) ,发生了另外一个优先级比它还高的中断源请求。如果CPU能够暂停对原来中断源的服务程序,转而去处理优先级更高的中断请求源,处理完以后,再回到原低级中断服务程序,这样的过程称为中断嵌套。这样的中断系统称为多级中断系统,没有中断嵌套功能的中断系统称为单级中断系统。

中断程序流程:
在这里插入图片描述
一定程度上实现了程序的同步进行,提高效率

中断资源

中断的资源和单片机型号是相关联的,不同的型号可能会有不同的中断资源,例如中断源个数不同,中断优先级个数不同等

STC89C52的中断资源:
中断源:外部中断0、定时器0中断、外部中断1、定时器1中断、串口中断、外部中断2、外部中断3共8个
中断优先级:4个

其中中断源的外部中断2和外部中断3是本型号相对于传统单片机增加的,优先级也比传统单片机多了两个

中断号:在这里插入图片描述
可见使用中断时中断号与中断源的对应关系
例如常用的定时器0中断,在写中断后要执行的代码时,就应放在void Init0_Routine(void) interrupt 0;中,这相当于中断的入口

中断结构

在这里插入图片描述
这是传统51单片机的中断结构图,简单介绍下中断的构成
中断请求到TF0之后,有IE中的两个开关相当于大门,而允许通过的钥匙就是两个“1”。之后的IP是优先级的选择,给1为高优先级,给0为低优先级。高优先级可以中断低优先级。最终到达中断入口

相关寄存器

IE为interrupt enable 即中断的使能,其中ET0、ET1等是与某个中断源对应的中断使能,EA是enable all,中断的总使能

在这里插入图片描述

定时器寄存器

各符号后面的数字1 or 0决定了它们所对应的定时器
TF:定时器的溢出中断标志。如 T0在允许计数后,从初值开始+1计数,当最高位溢出时,由硬件置”1“TF0,向CPU请求中断,直到CPU相应中断后,TF0才清零
C/T:决定该元件的作用,置0为定时器,置1为计数器
GATE:门控端,决定了启动暂停是由TR0单独控制还是TR0与外部引脚共同控制。给0时TR0单独控制,给1时TR0与外部引脚共同控制。但无论怎样,只有TR0=1时才允许计数
M1与M0:共同决定定时器的工作模式(左M1右M0)
在这里插入图片描述
当我们要用16位定时器时,就要让M1=0,M0=1

中断寄存器

在这里插入图片描述

应用

以下为定时器在工作模式1时应用的部分代码

void Timer0Init(void)	
{
	TMOD &= 0xF0;		
	TMOD |= 0x01;		
	TL0 = 0x9C;		
	TH0 = 0xFF;		
	TF0 = 0;		
	TR0 = 1;	
	ET0=1;
	EA=1;
	PT0=0;
}

void main(void)
{
	Timer0Init();
	while(1)
	{
	
	}
}

	void Timer0Routine()       interrupt 1 
{
		TL0 = 0x9C;		
		TH0 = 0xFF;			

	}

此处利用stc-isp软件中的定时器计算器功能得到了一个每100微秒进一次中断的Timer0Init,其中ET0、EA、PT0的赋值需要我们自行添加,保证定时器的正常使用
注意:要在单片机给电后先声明/调用一下,让定时器开始工作。
在这里插入图片描述

这是最新版stc-isp所给的代码(在系统频率为12MHz等前提下),对比可知其中的AUXR被删除了,这是因为STC89C52单片机的分频模式在TMOD里就得到抉择了,且单片机的头文件中也没有AUXR的声明

除此之外,我们也可以自己配置寄存器,计数的时间间隔通过赋初值的方式来实现,

void Timer0Init(void)	
{		
	TMOD = 0x01;			
	TF0 = 0;		
	TR0 = 1;
	TH0=64535/256;
	//TH0为计数系统的高位,故取整
	TL0=64535%256;
	//TL0为技术系统的低位,故取余

	//此处对64535取整取余是因为16位定时器的计数系统可达最高值为65535
	//两者之间差值为1000 
	//已知12分频时,时钟每微秒传输一个脉冲,技术系统加一
	//故这样初始化实现的是每1000微秒即一毫秒中断一次
	ET0=1;
	EA=1;
	PT0=0;
}

需要注意的是,所赋初值只有进第一次中断时可用,因为计数系统是每溢出一次就发出一次中断申请,而后清零,从零重新开始增加。所以若不做更改的话,进第二次中断所需时间就不是一毫秒,而是65535微秒大概65毫秒。
修改方式:在中断后进入的代码中再次对计数系统进行赋值,复制粘贴即可,这样就可以保证每次中断的时间间隔是固定的了
但实际上这样还是有一微秒的误差。因为必须要溢出才能发出中断申请,所以虽然64535与65535之间差为1000,但要计数1001次后才算溢出,故我们将64535改为64536才能使每次中断的间隔为精确的1毫秒

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值