股票

PIC16F873A定时器(Timer0/Timer1)中断操作

简单实现了Timer0和Timer1的定时器中断,让LED一秒钟闪一下。

  1. #include & lt; xc.h & gt;  
  2. #include “timer.h”  
  3.   
  4.   
  5. /* 
  6.  * void timer0_init() 
  7.  * { 
  8.  * T0CS = 0; // inside clock 
  9.  * T0SE = 1; // down edge count 
  10.  * PSA = 0; // Prescaler is assigned to the Timer0 module 
  11.  * PS2 = 0; // 1:16 
  12.  * PS1 = 1; 
  13.  * PS0 = 1; 
  14.  * //TMR0IF = 0; 
  15.  * INTCONbits.TMR0IF = 0; 
  16.  * GIE = 1; // enable global interrupt 
  17.  * INTCONbits.TMR0IE = 0; // timer0 interrupt enable 
  18.  * TMR0 = 8; // initialized value 
  19.  * } 
  20.  * 
  21.  * void interrupt Timer0()// 1ms 
  22.  * { 
  23.  * TMR0 = 9; // initialize value = 256-16×10^6/(4X16X1000)+2 
  24.  * if(INTCONbits.TMR0IF) 
  25.  * { 
  26.  * INTCONbits.TMR0IF = 0; // clear flag 
  27.  * //PORTBbits.RB5 = ~PORTBbits.RB5; 
  28.  * ms_count++; 
  29.  * } 
  30.  * } 
  31.  */  
  32.   
  33. void timer1_init()  
  34. {  
  35.     T1CONbits.TMR1CS    = 0;    /* Internal clock (FOSC/4) */  
  36.     T1CONbits.T1CKPS1   = 1;    /* 1:4 prescale value */  
  37.     T1CONbits.T1CKPS0   = 0;  
  38.     TMR1L           = 0xd8; /* initialized value */  
  39.     TMR1H           = 0xf0;  
  40.   
  41.     PIR1bits.TMR1IF     = 0;    /* clear TMR1 register voerflowed */  
  42.     GIE         = 1;  
  43.     PEIE            = 1;    /* enable outside interrupt */  
  44.     T1CONbits.TMR1ON    = 1;    /* enable timer1 */  
  45.     TMR1IE          = 1;    /* enable timer1 interrupt */  
  46. }  
  47.   
  48.   
  49. void interrupt Timer1()                 /* 10ms Timer1, the name whatever you like */  
  50. {  
  51.     TMR1L   = 0xf0;  
  52.     TMR1H   = 0xd8;  
  53.     if ( PIR1bits.TMR1IF )  
  54.     {  
  55.         PIR1bits.TMR1IF = 0;    /* clear flag */  
  56. /* PORTBbits.RB5 = ~PORTBbits.RB5; */  
  57.         ms_count++;  
  58.     }  
  59. }  

timer0和timer1的初始化还是有点儿区别的。

有两个问题,Timer1需要开外部中断,PEIE = 1; 不然不会进入中断函数,而timer0就不需要;

中断名称好像可以随便取的样子,我用Timer1和ISR都能成功运行中断。

说点儿题外话,PIC的头文件很好用,但是有个很大的问题是不知道怎么用,没有一个说明文件,每次调用的时候我都是先查寄存器,然后到头文件里找寄存器对应的定义,相比STC就差远了,有专门的库函数说明文档,想怎么用该怎么用一目了然。没有说明,使用库文件还不如直接用寄存器定义,但是为了与之前的习惯统一,暂时先这么着了,希望是有说明文件只是我还没发现而已。

打赏
原文链接:,转发请注明来源!

发表评论