以定时器计数作为时间轴的模板
简介
这是我写STC15代码时候首先都会配置的一个时间轴。
1.配置起来比较简单:
2.可读性强,操作简单
配置过程
定时器的配置
配置定时器,我个人是以定时器2作为时间轴,就算代码忘了也没有关系,在我们使用的烧录软件STC-ISP中就可以ctrl+c ctrl+v。
选择定时器二,定时长度为1ms(可以自己选择)。
注意
软件中没有给出 打开总中断以及打开定时器中断,一定要自己打开。
设置 EA 总开关 跟 ET2 定时器开关 。
对于打开ET2 我们只能用通过设置IE2 这个寄存器。
所以需要自己添加下面两行代码。
EA=1;
IE2 |= 0X04;
定时器2配置代码
AUXR |= 0x04; //定时器时钟1T模式
T2L = 0xCD; //设置定时初值
T2H = 0xD4; //设置定时初值
AUXR |= 0x10; //定时器2开始计时
EA=1;
IE2 |= 0X04;
定时器中断的配置
定时器每次中断的时间的1ms,我们需要创建一个变量来存储定时器计数的时间
这里我用 TIM2_time 这个变量,以及一个结构体来存储时间轴到达某个时间点的标志。
long TIM2_time;
typedef struct
{
u8 flag_1ms;
u8 flag_20ms;
u8 flag_100ms;
u8 flag_500ms;
u8 flag_1s;
}TIM2;
定义好了变量之后,我们再来看看定时器中断的内容,其实也挺简单。
void TIM2_interrupt(void) interrupt 12
{
TIM2_time++;
TIM2_flag.flag_1ms = True;
if(TIM2_time % 20 == 0)
{
TIM2_flag.flag_20ms = True;
}
if(TIM2_time % 100 == 0)
{
TIM2_flag.flag_100ms = True;
}
}
主函数的配置
在定义好了定时器之后,基本就完成了一半了。
在主循环里面判断定时器到达节点的标志是否为真,如果是就执行命令语句。
具体代码如下:
while(1)
{
if(TIM2_flag.flag_1ms == True)
{
TIM2_flag.flag_1ms = False;
/*************程序每隔1ms要做的事情********/
/*********************************************************/
}
if(TIM2_flag.flag_20ms == True)
{
TIM2_flag.flag_20ms = False;
/*************程序每隔20ms要做的事情********/
/*********************************************************/
}
if(TIM2_flag.flag_100ms == True)
{
TIM2_flag.flag_100ms = False;
/*************程序每隔100ms要做的事情********/
/*********************************************************/
}
}
代码下载地址
代码在蓝桥杯的板子上测试过,基础定时器2的流水灯,以及矩阵按键读取,数码管显示,
下一章
下一章讲LED 继电器等基础外设初始化以及简单操作