一、基本概念
1.1简介
单片机的定时器是一种内部功能模块,用于产生计时、计数、延时等功能。定时器通常由一个或多个计数器和相关的控制逻辑组成。单片机的定时器可以运行在不同的工作模式下,以适应不同的计时和计数需求。
C51中的定时器和计数器是同一个硬件电路支持的,通过寄存器配置不同,就可以将他当做定时器
或者计数器使用。
确切的说,定时器和计数器区别是致使他们背后的计数存储器加1的信号不同。当配置为定时器使
用时,每经过1个机器周期,计数存储器的值就加1。而当配置为计数器时,每来一个负跳变信号
(信号从P3.4 或者P3.5引脚输入),就加1,以此达到计数的目的。
标准C51有2个定时器/计数器:T0和T1。他们的使用方法一致。C52相比C51多了一个T2。
1.2 如何定时
定时器的本质原理: 每经过一个机器周期,就加1 :寄存器
晶振:
晶振(晶体震荡器),又称数字电路的“心脏”,是各种电子产品里面必不可少的频率元器件。数字电
路的所有工作都离不开时钟,晶振的好坏、晶振电路设计的好坏,会影响到整个系统的稳定性。
时钟周期:
时钟周期也称为振荡周期,定义为时钟频率的倒数。时钟周期是计算机中最基本的、最小的时间单
位。在一个时钟周期内,CPU仅完成一个最基本的动作。时钟周期是一个时间的量。更小的时钟周
期就意味着更高的工作频率。
机器周期:
机器周期也称为CPU周期。在计算机中,为了便于管理,常把一条指令的执行过程划分为若干个阶
段(如取指、译码、执行等),每一阶段完成一个基本操作。完成一个基本操作所需要的时间称为
机器周期。一般情况下,一个机器周期由若干个时钟周期组成。
1.3 时间计算方式
二、 程序
2.1 非中断模式
定时10ms led状态翻转一次:
#include <stdio.h>
#include "reg52.h"
sbit led = P3^6;
sbit key1 = P2^1;//void Timer0Init(void) //10毫秒@11.0592MHz
//{
// AUXR &= 0x7F; //定时器时钟12T模式
// TMOD &= 0xF0; //设置定时器模式
// TL0 = 0x00; //设置定时初值
// TH0 = 0xDC; //设置定时初值
// TF0 = 0; //清除TF0标志
// TR0 = 1; //定时器0开始计时
//}int main()
{int cnt =0;TMOD &= 0xF0; //设置定时器模式TL0 = 0x00; //设置定时初值TH0 = 0xDC; //设置定时初值TF0 = 0; //清除TF0标志TR0 = 1; //定时器0开始计时while(1) {if(TF0 == 1) {TF0= 0;TL0 = 0x00; //设置定时初值TH0 = 0xDC; //设置定时初值cnt++;if(cnt>100) {led = !led;cnt = 0;}}}return 0;
}
2.2 中断模式
#include "reg52.h"
#include <stdio.h>
#include <stdlib.h>
#include <string.h>sbit LED1 = P3^7;
sbit LED2 = P3^6;
int cnt = 0;void Delay300ms() //@11.0592MHz
{unsigned char i, j, k;// _nop_();i = 3;j = 26;k = 223;do{do{while (--k);} while (--j);} while (--i);
}void TimeInit()
{TMOD =0X01;TL0 = 0X00;TH0 = 0XDC;TR0 = 1;TF0 = 0;ET0 = 1;EA = 1;
}int main()
{LED1 = 1;TimeInit();while(1){LED1 = 0;Delay300ms();LED1 = 1;Delay300ms();}return 0;
}void TimeOHandler() interrupt 1
{cnt++;TL0 = 0X00;TH0 = 0XDC;if(cnt == 100) {cnt =0;LED2 =!LED2;}}