一 什么是定时器
定时器/计数器是一种能够对内部时钟信号或外部输入信号进行计数,当计数值达到设定要求时,向cpu提出中断处理请求,从而实现,定时或者计数功能的外设。
二 51单片机的定时/计数器
单片机外部晶振12MHZ,12分频后计数脉冲为1MHZ,即每个时钟脉冲周期为1us,定时器T0的16位工作模式最大定时时间位65535us,如果要定时10ms的计数器的话就不能从0开始计数了,必须给定一个计数初值。
TH0 = (65535-10000)/256;
TL0 = (65535-10000)%256;
三 定时器/计数器编程思想
通常有2个函数,1个是初始化函数,1个是对外做中断服务函数
配置工作环境->计算计数初值->使能定时/计数器中断(即ET0或者ET1置0)-> 打开总中断(即EA=1)->启动定时器(即TR0或者TR1置0)
在中断服务函数中,如果不是自动重装模式,需要对THX和TLX重新赋值。
四 工程 代码
利用51单片机的定时/计数T0模式实现定时,每隔1s,L1指示灯闪烁一下,也就是点亮0.5s,熄灭0.5s,每隔10s,L8指示灯闪烁一下,即点亮5s,熄灭5s。
#include"reg52.h"
sbit L1 = P0^0;
sbit L8 = P0^7;
void InitHC138(unsigned char n)
{
switch (n)
{
case 4:
HC138_C = 1;
HC138_B = 0;
HC138_A = 0;//输出Y4
break;
case 5:
HC138_C = 1;
HC138_B = 0;
HC138_A = 1;//输出Y5
break;
case 4:
HC138_C = 1;
HC138_B = 1;
HC138_A = 0;//输出Y6
break;
case 5:
HC138_C = 1;
HC138_B = 1;
HC138_A = 1;//输出Y7
break;
}
}//锁存器选择
//======================================
void InitTimer()
{
THOD = 0x01;
TH0 = (65535-50000)/256;
TL0 = (65535-50000)%256;
ET0 = 1;
EA = 1;
TR0 = 1;
}
unsigned char count = 0;
unsigned char count1= 0;
void ServiceTimer() interrupt 1
{
TH0 = (65535-50000)/256;
TL0 = (65535-50000)%256;
count++;
count1++;
if(count ==10)
{
L1=~L1;
count =0;
}
if(count1 = 100)
{
L8=~L8;
count1 = 0;
}
//======================================
void mian()
{
void InitTimer();
while(1)
{
}
}