定时器介绍: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;
}
}