51单片机系列–定时器中断

  • Post author:
  • Post category:其他


定时器介绍:51单片机的定时器属于单片机的内部资源,其电路的连接和运转均在单片机内部完成,可以取代掉占用cpu资源的delay函数。

我的51单片机外接了一个11.0592MHZ的外部晶振,我们算一下:

按照时钟周期的计算公式

1个时钟周期  =1/晶振周期 = 1/Fosc

本机时钟周期=1/(11.05926M) (s)= 1/11.05926/1000000 (s) = 1/1105926 s

所以我的单片机每隔12*(1/1105926)s就加1一次。所以从0到65535所需时间一共

12*(1/1105926)*65535=0.07110964s=71.10964ms

如果需要定义1个10ms,则设初值为x

(65535-x)*机器周期=0.01s

则x=56319。

分类

51单片机定时器0内部的具有两个一字节的寄存器TH0(高位寄存器)和TL0(低位寄存器),最大能存65535。

当单片机每一个机器周期产生一个脉冲时,计数器就加一。当计数达到溢出值65535后,就会产生一个中断信号,系统捕捉到信号,这个时间段就是周期。

定时器由两个寄存器控制,分别是工作模式寄存器TMOD和控制寄存器TCON。

工作模式寄存器TMOD

工作模式寄存器TMOD是用于控制定时器0/1的工作模式(模式1:TH0和TL0两个寄存器都使用)。而设置初始值只需要对TMOD的M0、M1进行设置就行了,其他均设0即可。定时器1的不用配置,定时器0配置如下

GATE=0

C/T=0:0代表用作定时器,1代表用作计数器

TMOD=0x01


M1M0    工作模式    说明

00    模式1    当TMOD的D5位置0,D4位置1时,即为定时器T1的模式一,该模式对应的是一个16位的定时器,寄存器TH1和TL1即为T1初值的高8位和低8位,定时时间为:(65536-T1的初值)振荡周期12

01    模式2    当TMOD的D5位置1,D4位置0时,即为定时器T1的模式二,该模式对应的是一个可以自动装载的8位定时器,当定时器计数满了(计数溢出时),会自动把TH1中的内容重新装载到TL1中,那么模式二计数的最长时间即为(257-T1的初值)振荡周期12

TH0和TL0

由于TH0是高八位,TL0是低八位(2^8=256),所以计算得出

TH0=56319/256;

TL0=56319%256;

利用isp计算定时器

需要注意的是:本版本单片机并没有AUXR这个寄存器,所以需要删去这行,而且要加上ET0与EA的赋值。整体代码如下:

void Timer0Init(void)		//1毫秒@12.000MHz
{
	TMOD &= 0xF0;		//设置定时器模式
	TMOD |= 0x01;		//设置定时器模式
	TL0 = 0x18;		//设置定时初值
	TH0 = 0xFC;		//设置定时初值
	TF0 = 0;		//清除TF0标志
	TR0 = 1;		//定时器0开始计时
	ET0=1;//打开定时器0中断允许
	EA=1;//打开总中断
}


控制寄存器TCON

TF0 = 0; //清除TF0溢出中断标志,加到65536后TF0会被置为1

TR0 = 1; //允许定时器0计时

示例代码(定时器点灯)

#include "reg52.h"			 //此文件中定义了单片机的一些特殊功能寄存器

typedef unsigned int u16;	  //对数据类型进行声明定义
typedef unsigned char u8;

sbit led=P2^0;	 //定义P20口是led


/*******************************************************************************
* 函 数 名         : Timer0Init
* 函数功能		   : 定时器0初始化
* 输    入         : 无
* 输    出         : 无
*******************************************************************************/
 
void Timer0Init(void)		//1毫秒@12.000MHz
{
	TMOD &= 0xF0;		//设置定时器模式
	TMOD |= 0x01;		//设置定时器模式
	TL0 = 0x18;		//设置定时初值
	TH0 = 0xFC;		//设置定时初值
	TF0 = 0;		//清除TF0标志
	TR0 = 1;		//定时器0开始计时
	ET0=1;//打开定时器0中断允许
	EA=1;//打开总中断
}

  
/*******************************************************************************
* 函 数 名       : main
* 函数功能		 : 主函数
* 输    入       : 无
* 输    出    	 : 无
*******************************************************************************/
void main()
{	
	Timer0Init();  //定时器0初始化
	while(1);		
}

/*******************************************************************************
* 函 数 名         : void Timer0() interrupt 1
* 函数功能		   : 定时器0中断函数
* 输    入         : 无
* 输    出         : 无
*******************************************************************************/
void Timer0() interrupt 1
{
	static u16 i;
	TH0=0XFC;	//给定时器赋初值,定时1ms
	TL0=0X18;
	i++;
	if(i==1000)
	{
		i=0;
		led=~led;	
	}	
}