您的位置 首页 电子

PIC单片机定时器相关用法

什么是定时器?定时器顾名思义就是用来定时的。在单片机应用中常常用于各种各样的定时。比如让LED灯每隔1S亮一次。这个1S就是由定时

什么是守时器?

守时器望文生义便是用来守时的。在单片机使用中常常用于各式各样的守时。比方让LED灯每隔 1S 亮一次。 这个1S 便是由守时器做到的。

指令周期

指令周期便是单片机履行一个指令所花费的时刻。这也是守时器守时的最小时刻单位。时钟频率/4=指令频率。1/指令频率=指令周期。

假定现在的时钟是4MHZ ,4MHz的时钟通过4分频后变成了 1MHz 其周期为0.0000001s也便是1us,这个1us便是指令周期,这1us也便是守时器守时的最小单位。

守时器与预分频器

假定在没有预分频器情况下。敞开守时器 每隔一个指令周期守时器就加一。假守时钟是4MHz 也便是每隔 1us 守时器加一。

假如有了预分频器假定预分频器设置成2分频,守时器就 每隔2个指令周期守时器加一。假如预分频器设置成4分频,守时器就 每隔4个指令周期守时器加一,以此类推。

守时器中止标志位

如: TMR0 这个是8位的守时器,也便是8位的寄存器。8位的寄存器能代表的数值为0~255.也便是说守时器能够从0开端加一向加到255.到255后再加一就又变成0。此刻TMR0守时器中止标志位 (TMR0IF)变成 1.(假如中止没有敞开,并不履行中止程序。)

究竟从时钟频率一向到守时器中止溢出之间是什么联系呢?

下面我画了一个流程图咱们用频率的方法来了解这一切。假守时钟频率是4MHz ,守时器预分频值为2,守时器初始值为0.

1。首要4MHz 的时钟 4分频后变成 1MHz的指令频率;

2。然后预分频器 2 分频后变成 0.5MHz的频率供应守时器;

3。守时器通过256分频后变成约1952Hz的频率溢出中止;

然后咱们再用周期的方法来了解这一切。

1。首要0.25us时钟周期4分频后变成 1us指令周期;

2。然后预分频器 2 分频后变成 2us周期 供应守时器;

3。守时器每隔2us加一 ,加到256次 256X2us=512us溢出中止 ;

期望上面的流程图能帮你整理一下概念。

实例阐明:

假守时钟周期为4MHZ,每隔50MS点亮LED,每隔50MS灭掉LED。这样的程序要怎么做到呢。

这50ms怎么做到.

1,得到指令周期

4MHz/4=1MHz

1/1MHz=0.0000001s=1us

2,得到预分频

守时器守时的最大时刻要超越这50mS,所以预分频器要挑选256

预分频X256=最大的守时时刻。256X256=65536us=65.536ms 大于50ms

3, 核算守时器初始值

(守时器最大值+1)- (守时时刻/预分频)=守时器的初始值。

255+1=256

50000/256=195.3125

256-195.3125=60.6875 四舍五入 守时器初始值为61.

设置相关的寄存器。

OPTION_REG寄存器中咱们一般需求设置三处。

PS<2:0>设置用来设置预分频预分频规模从2 ~256

PSA设置成0 讲预分频器分配给Timer0模块

TMR0CS设置成0 内部指令周期时钟。

实例程序:

/*开发环境 MPLAB X IDE 类型PIC16LF1823*/

#include

__CONFIG(FOSC_INTOSC&WDTE_OFF&PWRTE_ON&MCLRE_OFF&CP_ON&CPD_OFF&BOREN_ON&CLKOUTEN_OFF&IESO_ON&FCMEN_ON);

__CONFIG(PLLEN_OFF&LVP_OFF) ;

#define LED LATA5/*也可用 #define LED RA5,仅仅P%&&&&&%16LF1823 输出电平的时分,直接操控LATA5履行速度更快,由于传给RA5的数据终究也是传给LATA5才履行的*/

void init_fosc(void)

{

OSCCON= 0x68;//时钟设置为4MHz

}

void init_gpio(void)

{

PORTA = 0;

LATA = 0;

ANSELA = 0;

TRISAbits.TRISA5=0; //RA5口设置成输出 用来操控LED

}

void init_timer0(void)

{

OPTION_REG=0x87; //预分频为256

}

int main(int argc, char** argv)

{

init_fosc();

init_gpio();

init_timer0();

TMR0IF=0;//铲除TMR0中止标志位

TMR0=61;//设置中止初始值61

while(1)

{

if(TMR0IF==1)//守时时刻到了吗??

{

LED = ~LED;//改动LED的状况

TMR0IF=0;//铲除TMR0中止标志位

TMR0=61;//设置中止初始值61为下次50ms守时做准备

}

}

}

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/qiche/dianzi/318550.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部