51单片机定时器中断

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了51单片机定时器中断相关的知识,希望对你有一定的参考价值。

51单片机定时器中断51单片机的定时器溢出时会触发中断,我想知道在执行中断服务程序的时候定时器还继续定时吗,就是溢出后变成零是直接开始加,还是等中断服务程序执行完了再开始加?

定时器一旦启动,除非你写命令让它停下,否则是一直在运行的。定时器的计数器一旦溢出,就会发生中断,程序就开始执行中断函数中的程序。而计数器依旧开始累加,直到下一次溢出,不断往复,永无休止。注意的是,当你的中断服务程序耗费时间过长的时候,意思是,CPU执行你的中断服务程序的时间大于中断计时时间的话。那么,CPU将在这段中断服务程序还没有还没有执行完就会收到下一次中断请求,此时CPU将不再执行之后的中断服务程序,转而重新从第一条中断服务程序开始执行。追问

那这样的话如果真的是中断服务程序比较用时,还没处理完又重新开始,岂不是混乱了

参考技术A 定时器的中断不影响定时器的计数,它是环形计数的,会一直向上加1的,所以,一般,进入定时器中断之后,都会先关闭定时器,处理完成了再开启定时器,然后中断再返回

51单片机学习笔记6 -- 定时器中断

定时器中断属于51单片机3种中断类型其中一种,51单片机具有2个定时器T0和T1(定时器0、定时器1),都需要通过寄存器来配置


定时器中断

1.引脚复用

通过原理图可以发现定时器0(T0)和定时器1(T1)是P3.4引脚和P3.5引脚的复用功能,当将这两个引脚配置为定时器功能时,引脚外接的传感器(模块)将不能正常使用,即引脚同一时间只能作为一个功能使用(普通I/O或复用功能)
T0、T1是两个16位定时器/计数器,每经过1个机器周期内部的16位计数寄存器的值加1,当计数器装满时会溢出,在定时模式时单次最大的定时时间是 65535*1.085us 的时间(单位us)

2.定时器配置

定时器0配置需要用到的寄存器(TCON、TMOD、TL0、TH0)

1.定时器/计数器控制寄存器TCON

TCON为定时器/计数器T0、T1的控制寄存器,同时也锁存T0、T1溢出中断源和外部请求中断源等,TCON格式如下

TCON高4位是定时器/计数器T0、T1的溢出标志位和运行控制位,低4位是外部中断0、外部中断1触发方式控制位和外部中断使能位

2.定时器/计数器工作模式寄存器TMOD

3.中断号和中断类型

51单片机有3种中断类型,包括定时器中断、外部中断和串口中断,每个中断都有自己对应的中断号,如下

中断源默认中断级别中断号
INT0(外部中断0)0(最高)interrupt 0
T0(定时器中断0)1interrupt 1
INT1(外部中断1)2interrupt 2
T1(定时器1中断)3interrupt 3
TX/RX(串口中断)4interrupt 4

其中定时器0对应的中断号是 interrupt 1

4.定时器中断编程

定时器0初始话参考代码如下

void Timer0Init()

	TMOD |= 0x01;							//配置定时器0为16位定时器,TH0、TL0全用
	TH0 =65536 - 1000/256//1000us定时,即1毫秒溢出产生中断
	TL0 =65536 - 1000%256//1000us定时,即1毫秒溢出产生中断
	ET0 = 1;										//开启定时器0中断
	EA  = 1;										//开启全局中断
	TR0 = 1;										//定时器0开始计数

大致说说 TMOD |= 0x01 配置的几个位

TMOD |= 0x01
0x01 = 0000 0001
定时器1不做配置 TMOD 高4位配置为0
低4位配置定时器0 = 0001
GATE = 0 打开定时器/计数器0
C/T = 0 (置0作为定时器,置1作为计数器)
M1 = 0、M0 = 1 配置16位定时器/计数器,TL0、TH0全用

定时器0初始化后编写定时器0中断服务函数,如下函数名可自定义,需在函数末尾加上中断号

unsigned int count = 0;

void Timer0() interrupt 1

	//每次产生中断后初始化定时器初值 - 1毫秒产生1次中断
	TH0 = (65536 - 1000)/256;
	TL0 = (65536 - 1000)%256;

	//200毫秒执行一次操作
	count++;
	if(count == 200)
	
		P1 = ~P1;
		count = 0;
	

完整代码

#inckude <reg52.h>

void Timer0Init()

	TMOD |= 0x01;							//配置定时器0为16位定时器,TH0、TL0全用
	TH0 =65536 - 1000/256//1000us定时,即1毫秒溢出产生中断
	TL0 =65536 - 1000%256//1000us定时,即1毫秒溢出产生中断
	ET0 = 1;										//开启定时器0中断
	EA  = 1;										//开启全局中断
	TR0 = 1;										//定时器0开始计数


void main()

	P1 = 0xff;
	Timer0Init();
	
	while(1);


unsigned int count = 0;

void Timer0() interrupt 1

	//每次产生中断后初始化定时器初值 - 1毫秒产生1次中断
	TH0 = (65536 - 1000)/256;
	TL0 = (65536 - 1000)%256;

	//200毫秒执行一次P1电平反转
	count++;
	if(count == 200)
	
		P1 = ~P1;
		count = 0;
	

以上是关于51单片机定时器中断的主要内容,如果未能解决你的问题,请参考以下文章

51单片机:开启中断和定时器

51单片机定时器问题

51单片机学习笔记6 -- 定时器中断

51单片机学习笔记6 -- 定时器中断

51单片机中断机制(定时器/计数器)

51单片机学习笔记之中断(外部中断定时器中断中断嵌套)