本帖最后由 SingleYork 于 2017-5-31 21:18 编辑
bg7.png
I51开发板 第五讲:定时器之简介篇
https://bbs.icxbk.com/community/forum.php?mod=viewthread&tid=65495
(出处: ICKEY BBS)
前一讲跟大家简单了介绍了一下定时器/计数器的基本结构以及跟定时器/计数器相关的一些寄存器,这一讲里面,本菜将会跟大家一起学习定时器/计数器的基本配置等相关知识。
定时器/计数器在进行定时或者计数操作之前要进行初始化配置,通常会包括以下几个步骤:
1、确定工作方式,给方式控制寄存器TMOD写入控制字;
2、确定是采用1T还是采用12T方式,计算定时器/计数器的初值,并将初值写入寄存器TH和TL;
3、根据需要设置中断控制寄存器IE和IE2的初值,决定是否开放定时器中断;
4、根据需要设置寄存器INT_CLKO中的T2_CLKO、T1_CLKO和T0_CLKO位,确定是否采用可编程时钟输出;
5、置1运行控制寄存器TCON和AUXR中的TR0、TR1和TR2位,启动定时器/计数器;
在初始化过程中,设置定时器或计数器的初始值,需要进行一点运算。设计数器最大计数值为M(根据不同工作方式,M可以是2的16次方或2的8次方),则初值X的计算公式如下:
计数方式: X=M-要求的计数值;
12T定时方式:X=M-要求的定时值/(12/系统时钟频率);
1T定时方式: X=M-要求的定时值/(1/系统时钟频率);
定时器方式下,当初值X=0时,可以确定最大定时时间,例如当系统时钟频率为6MHz时,定时器工作于方式0,采用12T定时方式的最大定时时间位131.072ms,采用1T定时方式的最大定时时间为10.922ms。如果需要的定时时间大于上述最大定时值,则需要采用中断方式来扩展定时时间。
假设IAP15F2K61S2单片机系统时钟频率位12MHz,采用定时器T0中断扩展方式实现实时时钟。T0工作于1T定时方式,在16位自动重装初值方式下,计算出1ms的定时器初值为:X = 65536UL - (MAIN_Fosc / 1000UL),即:TH=0xD1,TL=0x20;每当1ms定时时间到产生中断,中断1000次即为1秒。设定hour、min、sec三个变量分别存储小时、分钟、秒,P30、P31、P16分别作为小时、分钟、秒的指示灯,每当定时1秒到,sec加1,同时秒指示灯闪烁;满60秒则min加1,同时分指示灯闪烁;满60分则hour加1,同时时指示灯闪烁;满24小时后将hour清零,同时熄灭所有指示灯。
主要程序代码如下,详细代码请看附件源程序:
首先,配置定时器的工作方式及初值等:
然后,配置我们需要用来指示灯IO口:
最后,在定时器T0中断函数里实现我们所需要的功能:
然后,我们把源代码下载到开发板里,就可以看到实现现象了!
在上面的程序中,我们用到了定时器的库函数,在下一讲里,本菜将对定时器的库函数进行详细的介绍,敬请期待!
源代码:
本帖最后由 SingleYork 于 2017-5-31 21:18 编辑
bg7.png
I51开发板 第五讲:定时器之简介篇
https://bbs.icxbk.com/community/forum.php?mod=viewthread&tid=65495
(出处: ICKEY BBS)
前一讲跟大家简单了介绍了一下定时器/计数器的基本结构以及跟定时器/计数器相关的一些寄存器,这一讲里面,本菜将会跟大家一起学习定时器/计数器的基本配置等相关知识。
定时器/计数器在进行定时或者计数操作之前要进行初始化配置,通常会包括以下几个步骤:
1、确定工作方式,给方式控制寄存器TMOD写入控制字;
2、确定是采用1T还是采用12T方式,计算定时器/计数器的初值,并将初值写入寄存器TH和TL;
3、根据需要设置中断控制寄存器IE和IE2的初值,决定是否开放定时器中断;
4、根据需要设置寄存器INT_CLKO中的T2_CLKO、T1_CLKO和T0_CLKO位,确定是否采用可编程时钟输出;
5、置1运行控制寄存器TCON和AUXR中的TR0、TR1和TR2位,启动定时器/计数器;
在初始化过程中,设置定时器或计数器的初始值,需要进行一点运算。设计数器最大计数值为M(根据不同工作方式,M可以是2的16次方或2的8次方),则初值X的计算公式如下:
计数方式: X=M-要求的计数值;
12T定时方式:X=M-要求的定时值/(12/系统时钟频率);
1T定时方式: X=M-要求的定时值/(1/系统时钟频率);
定时器方式下,当初值X=0时,可以确定最大定时时间,例如当系统时钟频率为6MHz时,定时器工作于方式0,采用12T定时方式的最大定时时间位131.072ms,采用1T定时方式的最大定时时间为10.922ms。如果需要的定时时间大于上述最大定时值,则需要采用中断方式来扩展定时时间。
假设IAP15F2K61S2单片机系统时钟频率位12MHz,采用定时器T0中断扩展方式实现实时时钟。T0工作于1T定时方式,在16位自动重装初值方式下,计算出1ms的定时器初值为:X = 65536UL - (MAIN_Fosc / 1000UL),即:TH=0xD1,TL=0x20;每当1ms定时时间到产生中断,中断1000次即为1秒。设定hour、min、sec三个变量分别存储小时、分钟、秒,P30、P31、P16分别作为小时、分钟、秒的指示灯,每当定时1秒到,sec加1,同时秒指示灯闪烁;满60秒则min加1,同时分指示灯闪烁;满60分则hour加1,同时时指示灯闪烁;满24小时后将hour清零,同时熄灭所有指示灯。
主要程序代码如下,详细代码请看附件源程序:
首先,配置定时器的工作方式及初值等:
然后,配置我们需要用来指示灯IO口:
最后,在定时器T0中断函数里实现我们所需要的功能:
然后,我们把源代码下载到开发板里,就可以看到实现现象了!
在上面的程序中,我们用到了定时器的库函数,在下一讲里,本菜将对定时器的库函数进行详细的介绍,敬请期待!
源代码: