本文基于STC89C52RC单片机,主要阐述按键扫描的定时器方法
定时器的拓展方法
我们先介绍在定时器数量不够的时候要怎样带来拓展它,已知此法可直接跳过
定时器的作用就是计时在一定时间后进入中断执行特定的代码
只要我们定时器初始化时设定一个足够小的时间,再在定时器中断函数中定义局部变量来记录进入定时器的次数,达到多少次就执行一个函数,就可以满足定时器的拓展功能
代码部分(定时器初始化基本时间)
这里给大家一个容易记忆的方法
T---Timer(计时器)
L---Low(低位) , H---High(高位)
E---Enable(使能,允许)
F---Full(溢出)
A---All(全部)
R---Run---启动的意思,也就是定时器跑起来
#include <REGX52.H>//定时器的初始化
void Timer0_Init(void) //1ms
{
TMOD &= 0xF0; //设置定时器模式
TMOD |= 0x01; //设置定时器模式
TL0 = 0x66; //设置定时初值
TH0 = 0xFC; //设置定时初值
TF0 = 0; //Timer full
ET0=1; //Enable Timer 0
EA=1; //Enable All
PT0=0; //中断优先级
TR0 = 1; // Timer0 Run 启动计时器
}
主函数的定时器中断
void Timer0_Routine(void) interrupt 1 //中断程序代码1ms
{
static unsigned int T0Count1=0,T0Count2=0,T0Count3=0,T0Count4=0;//静态占据空间,定义的是计数值
TL0=0x66;//定时器高低位重新赋值
TH0=0xFC;//因为配置的时候不是自动重载模式
T0Count1++;//每进入一次定时器中断1号计数值加一
if(T0Count1>=20)//20ms执行一次
{
T0Count1=0;//时间到了就要清零进行下一次计数
//这里可以写要执行的代码或一个已经写好的函数
}
T0Count2++;
if(T0Count2>=2)//2ms
{
T0Count2=0;
//与上方同理
}
}
此方法的注意事项
1.在定时中进入的函数不要有延时的函数
2.执行的代码不要过长