一、基本概念
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;
}
}