大家好,我是『芯知识学堂』的SingleYork,前一篇文章给大家介绍了“[SYK-0806-A2S1 工业自动化控制之【04-输入输出点动控制】]”,
这一篇中,笔者要给大家介绍如何使用定时器来实现流水灯的效果。
说到定时器,那么我们先来看下我们现在使用的这款IAP15W413AS单片机的定时器资源:
从官方的芯片手册上我们可以看到,STC15W401AS这个系列的单片机只有定时器0和定时器2这两个定时器,
也即IAP15W413AS这个型号只有定时器0和定时器2这两个定时器。
所以,本例中,我们也只能用到这两个定时器了。本例笔者要实现的功能如下:
- Y00-Y02由定时器0控制实现流水灯效果,间隔时间为500ms;
- Y03-Y05由定时器2控制实现流水灯效果,间隔时间为500ms;
明确好功能后,我们就可以来写代码了,首先,我们在SYSTEM组中添加timer.c文件,再在BSP组中添加bsp_timer.c文件,如下图所示:
timer.c文件是库文件,基本不需要做太多修改,这里笔者只是将原本库函数的中“void timer0_int (void) interrupt TIMER0_VECTOR”、
“void timer2_int (void) interrupt TIMER2_VECTOR”等中断函数删除了,后面放到了“app.c”文件中。
而bsp_timer.c文件中,主要就是对timer0和timer2的配置,具体代码如下:
- #include "bsp_timer.h"
-
-
-
- /************************ 定时器配置 ****************************/
-
- void Timer_config(void)
-
- {
-
- TIM_InitTypeDef TIM_InitStructure; //结构定义
-
- TIM_InitStructure.TIM_Mode = TIM_16BitAutoReload; //指定工作模式, TIM_16BitAutoReload,TIM_16Bit,TIM_8BitAutoReload,TIM_16BitAutoReloadNoMask
-
- TIM_InitStructure.TIM_Polity = PolityLow; //指定中断优先级(低到高) Polity_0,Polity_1,Polity_2,Polity_3
-
- TIM_InitStructure.TIM_Interrupt = ENABLE; //中断是否允许, ENABLE或DISABLE
-
- TIM_InitStructure.TIM_ClkSource = TIM_CLOCK_1T; //指定时钟源, TIM_CLOCK_1T,TIM_CLOCK_12T,TIM_CLOCK_Ext
-
- TIM_InitStructure.TIM_ClkOut = DISABLE; //是否输出高速脉冲, ENABLE或DISABLE
-
- TIM_InitStructure.TIM_Value = 65536UL - (MAIN_Fosc / 1000UL); //初值,
-
- TIM_InitStructure.TIM_Run = ENABLE; //是否初始化后启动定时器, ENABLE或DISABLE
-
- Timer_Inilize(Timer0,&TIM_InitStructure); //初始化Timer0 Timer0,Timer1,Timer2,Timer3,Timer4
-
- TIM_InitStructure.TIM_Mode = TIM_16BitAutoReload; //指定工作模式, TIM_16BitAutoReload,TIM_16Bit,TIM_8BitAutoReload
-
- TIM_InitStructure.TIM_Polity = PolityLow; //指定中断优先级, PolityHigh,PolityLow
-
- TIM_InitStructure.TIM_Interrupt = ENABLE; //中断是否允许, ENABLE或DISABLE
-
- TIM_InitStructure.TIM_ClkSource = TIM_CLOCK_1T; //指定时钟源, TIM_CLOCK_1T,TIM_CLOCK_12T,TIM_CLOCK_Ext
-
- TIM_InitStructure.TIM_ClkOut = DISABLE; //是否输出高速脉冲, ENABLE或DISABLE
-
- TIM_InitStructure.TIM_Value = 65536UL - (MAIN_Fosc / 1000UL); //初值,
-
- TIM_InitStructure.TIM_Run = ENABLE; //是否初始化后启动定时器, ENABLE或DISABLE
-
- Timer_Inilize(Timer2,&TIM_InitStructure); //初始化Timer1 Timer0,Timer1,Timer2,Timer3,Timer4
- }
复制代码
这里没有太多好说的,主要是“TIM_InitStructure.TIM_Value = 65536UL - (MAIN_Fosc / 1000UL);”这一句,涉及到定时时间,
需要大家搞清楚具体的计算方法。根据官方提供的计算公式:
- 定时器T0工作在1T模式时的溢出率 =(SYSclk)/(65536-[RL_TH0,RL_TL0])
复制代码
我们可以得到:
- [RL_TH0,RL_TL0] = 65536-SYSclk/定时器T0工作在1T模式时的溢出率
复制代码
也即:
- TIM_InitStructure.TIM_Value = 65536- SYSclk/定时器T0工作在1T模式时的溢出率
复制代码
如果我们要得到1ms的基准定时的话,那么定时的溢出率就是1000了,本例中定时器0和定时器2都设采用的1ms基准定时。
接下来就是app.c里面的,我们需要定义两个变量timer0_cnt和timer2_cnt用来计数,再定义timer0_step和timer2_step两个变量用来作为swtich语句的case值:
- u16 timer0_cnt = 0;
- u16 timer2_cnt = 0;
- u8 timer0_step= 0;
- u8 timer2_step= 0;
复制代码
然后将timer0和timer2的中断函数也都添加到app.c中:
- /********************* Timer0中断函数************************/
- void timer0_int (void) interrupt TIMER0_VECTOR //1ms
- {
- timer0_cnt ++;
- }
-
- /********************* Timer0中断函数************************/
- void timer2_int (void) interrupt TIMER2_VECTOR //1ms
- {
- timer2_cnt ++;
- }
复制代码
最后,就只需要在app_run函数里面添加我们需要实现的代码就行了:
- void app_run(void)
- {
- /*****************************************
- Y00-Y02由定时器0控制实现流水灯效果
- *****************************************/
-
- timer0_step = timer0_cnt/500;
-
- switch(timer0_step)
- {
- case 0:Y00 = OutputT_ON ;Y01 = OutputT_OFF;Y02 = OutputT_OFF;break;
- case 1:Y00 = OutputT_OFF;Y01 = OutputT_ON ;Y02 = OutputT_OFF;break;
- case 2:Y00 = OutputT_OFF;Y01 = OutputT_OFF;Y02 = OutputT_ON ;break;
- default:break;
- }
- if(timer0_step>=3)
- {
- timer0_cnt = 0;
- }
-
- /*****************************************
- Y03-Y05由定时器2控制实现流水灯效果
- *****************************************/
-
- timer2_step = timer2_cnt/500;
-
- switch(timer2_step)
- {
- case 0:Y03 = OutputT_ON ;Y04 = OutputT_OFF;Y05 = OutputT_OFF;break;
- case 1:Y03 = OutputT_OFF;Y04 = OutputT_ON ;Y05 = OutputT_OFF;break;
- case 2:Y03 = OutputT_OFF;Y04 = OutputT_OFF;Y05 = OutputT_ON ;break;
- default:break;
- }
- if(timer2_step>=3)
- {
- timer2_cnt = 0;
- }
- }
复制代码
好了,关于使用本节内容笔者就介绍到这里了,有疑问的小伙伴们可以给笔者留言或者直接参与评论,
下一节笔者将给大家介绍定时器在其他方面的应用,详见“SYK-0806-A2S1 工业自动化控制之【06-输入信号延时控制输出】”感谢大家的支持!
本章附件:
【STC15系列】SYK-0806-A2S1- 05-定时器控制的流水灯.rar
(65.31 KB, 下载次数: 3)
|