zoukankan      html  css  js  c++  java
  • PIC18F中断定时器

    //基于MCC18编译器,使用HI-PICC不可用  
    //--------------------------------------------   #include <p18F452.h>  
    //---------------------------------------------------------------------------- 
    void main (void);  
    void InterruptHandlerHigh (void);   
    unsigned int Timeout;   
    //---------------------------------------------------------------------------- 
    // Main routine  
    void main ()
    {    
            Timeout = 0;    
            INTCON = 0x20;                 //disable global and enable TMR0 interrupt        
            INTCON2 = 0x84;               //TMR0 high priority   
            RCONbits.IPEN = 1;            //enable priority levels   
            TMR0H = 0;                      //clear timer   
            TMR0L = 0;                      //clear timer    
            T0CON = 0x82;                //set up timer0 - prescaler 1:8   
            INTCONbits.GIEH = 1;       //enable interrupts   
            TRISD = 0; /* configure PORTD for output */   
            PORTD=0X00;    
            while (1)     
            {        
                 if (Timeout == 1)          
                {                                  //timeout?           
                       Timeout = 0;          //clear timeout indicor                        
                       PORTD++;              //PORTD端口二进制计数         
              }     
            }
     } 
    
    PIC18F452定时器中断@ZSTU 
    //----------------------------------------------------------------------------
     // High priority interrupt vector   
    #pragma code InterruptVectorHigh = 0x08 
    void  InterruptVectorHigh (void) 
    {    _asm     
          goto InterruptHandlerHigh //jump to interrupt routine  
        _endasm 
    }   
    //----------------------------------------------------------------------------
    // High priority interrupt routine   
    #pragma code  
    #pragma interrupt InterruptHandlerHigh  
    void  InterruptHandlerHigh () 
    {    
          if (INTCONbits.TMR0IF)      
         {   //check for TMR0 overflow       
             INTCONbits.TMR0IF = 0;            //clear interrupt flag       
             Timeout = 1;                          //indicate timeout    
          } 
    }  
     //----------------------------------------------------------------------------
    

        PIC18F4520单片机提供多个中断源及一个中断优先级功能,可以给大多数中断源分配高优先级或者低优先级.高优先级中断向量地址为0008H低优先级中断向量地址为0018H。高优先级中断事伯将中断所有可参正在进行的低优先级中断。
         有10个寄存器用于控制中断的操作。它们是:
    RCON
    INTCON
    INTCON2
    INTCON3
    PIR1和PIR2
    PIE1和PIE2
    IPR1和IPR2
    通常,用三个位控制中断源的操作。 

    标志位 表明发生了中断事件
    使能位 允许程序跳转转到中断向量地址处执行(当标志位置1时)
    优先级 用于选择是高优先级还是低先级,通过将IPEN位(RCON<7>)置1,可使能中断优先级功能。当使能中断优先级时,有2位可使能全局中断。将GIEH位(INTCON<7>)置1,可使能所有优先级位置1(高优先级)的中断。将GIEL位(INTCON<6>)置1,可使能所有优先级位清零(低优先级)的中断。
    当中断标志位、使能位以及相应的全局中断使能位均被置1时,程序将立即跳转到中断地址0008H0018H,具体地址取决于优先级位的设置。通过设置相应的使能位可以禁止单个中断。
     注意:系统复位时IPEN位为零(默认状态)时,便会禁止中断优先级功能,此时中断与PIC16系统中档单片机相兼容。在兼容模式下,所有中断均跳转到地址0008H执行。

       下面是在SP9608-PIC增强型单片机开发板利用PIC18F4520单片机来实现的数字频率计数器功能,程序中使用了T0用为外部信号源输入通TMR0来实现对信号源的频率计数TMR3作为定时器,来产生1mS数码管扫描时基和1S秒时基信号。为了提高频率计数的准确度,采用中断嵌套技术来完成,将TMR3产生1mS的定时信号作为高优先级中断,TMR0作为频率计数溢出中断作为低先级中断。源程序采用MCC18编译器和MPLAB7.50版本的集成开发环境,调试工具采用ICD2;具体源程序如下:
       系统时钟:采用外部的12MHz晶振经过内部PLL的4倍频到48MHz。(HS-PLL配置位)

      1 #include <p18cxxx.h>
      2 #define TRUE 1
      3 #define FALSE 0
      4 #define HIGH 1
      5 #define LOW 0
      6 rom unsigned char LEDDATA[]=
      7 {
      8     0x3F,0x06,0x5B,0x4F,0x66,
      9     0x6D,0x7D,0x07,0x7F,0x6F,
     10     0x40,0x00,
     11 };
     12 struct TIMER_STRUCT
     13 {
     14 unsigned int Interval;
     15 unsigned char Enable;
     16 };
     17 struct TIMER_STRUCT Timer1S;
     18 struct T0_T1_STRUCT
     19 {
     20 unsigned int High_Byte;
     21 unsigned int Low_Byte;
     22 unsigned long Result;
     23 };
     24 struct T0_T1_STRUCT My_T0,My_T1;
     25 struct LED_STRUCT
     26 {
     27 unsigned char DotPointer;
     28 unsigned char ScanPointer;
     29 unsigned char Buffer[8];
     30 };
     31 struct LED_STRUCT NumberLED;
     32 void PIC18F_High_isr (void);
     33 void PIC18F_Low_isr (void);
     34 #pragma code high_vector_section=0x8
     35 void high_vector (void)
     36 {
     37 _asm goto PIC18F_High_isr _endasm
     38 }
     39 #pragma code low_vector_section=0x18
     40 void low_vector (void)
     41 {
     42 _asm goto PIC18F_Low_isr _endasm
     43 }
     44 #pragma code
     45 //---中断高优先级---//
     46 #pragma interrupt PIC18F_High_isr
     47 void PIC18F_High_isr (void)
     48 {
     49 if(TRUE==PIR2bits.TMR3IF)
     50     {
     51    PIR2bits.TMR3IF=FALSE;
     52       TMR3H=(65536-11965)/256;
     53       TMR3L=(65536-11965)%256;
     54         
     55      if(FALSE==Timer1S.Enable)
     56        {
     57       Timer1S.Interval++;
     58       if(1000==Timer1S.Interval)
     59         {
     60        T0CONbits.TMR0ON=FALSE;
     61        Timer1S.Interval=0;
     62        Timer1S.Enable=TRUE;
     63      }
     64     }
     65     
     66    if(LOW==LATAbits.LATA0)LATAbits.LATA0=HIGH;
     67      else LATAbits.LATA0=LOW;
     68      
     69       LATD=LEDDATA[NumberLED.Buffer[NumberLED.ScanPointer]];
     70       LATE=NumberLED.ScanPointer;
     71       NumberLED.ScanPointer++;      if(NumberLED.ScanPointer==sizeof(NumberLED.Buffer))NumberLED.ScanPointer=0;
     72 }
     73 }
     74 //---中断低优先级---//
     75 #pragma interruptlow PIC18F_Low_isr
     76 void PIC18F_Low_isr (void)
     77 {
     78 if(TRUE==INTCONbits.TMR0IF)
     79     {
     80    INTCONbits.TMR0IF=FALSE;
     81    My_T0.High_Byte++;    
     82 }
     83 
     84 }
     85 void main(void)
     86 {
     87 unsigned int i;
     88 unsigned long temp;
     89 
     90 Timer1S.Enable=FALSE;
     91 Timer1S.Interval=0;
     92 My_T0.High_Byte=0;
     93 My_T0.Low_Byte=0;
     94 My_T1.High_Byte=0;
     95 My_T1.Low_Byte=0;
     96 for(i=0;i<sizeof(NumberLED.Buffer);i++)NumberLED.Buffer[i]=0;
     97 NumberLED.ScanPointer=0;
     98 NumberLED.DotPointer=0;
     99 TRISAbits.TRISA0=0;
    100 LATAbits.LATA0=0;
    101 TRISD=0;
    102 LATD=0;
    103 TRISE=0;
    104 LATE=0;
    105 T0CONbits.TMR0ON=FALSE;
    106 TMR0L=0;
    107 TMR0H=0;
    108 T0CONbits.T0CS=1;
    109 T0CONbits.T0SE=0;
    110 T0CONbits.PSA=1;
    111 T0CONbits.T08BIT=1;
    112 INTCONbits.T0IF=FALSE;
    113 INTCONbits.T0IE=TRUE;
    114 T0CONbits.TMR0ON=TRUE;
    115 T3CON=0x00;
    116 TMR3H=(65536-12000)/256;
    117 TMR3L=(65536-12000)%256;
    118 PIR2bits.TMR3IF=FALSE;
    119 PIE2bits.TMR3IE=TRUE;
    120 T3CONbits.TMR3ON=TRUE;
    121 INTCONbits.GIEH=TRUE;
    122 INTCONbits.GIEL=TRUE;
    123 RCONbits.IPEN=TRUE;
    124 //---设置中断优先级---//
    125 INTCON2bits.TMR0IP=FALSE;
    126 IPR2bits.TMR3IP=TRUE;
    127 
    128 while(1)
    129     {
    130    if(TRUE==Timer1S.Enable)
    131      {
    132     My_T0.Result=0;
    133     My_T0.Result=My_T0.High_Byte;
    134     My_T0.Result<<=8;
    135     My_T0.Result|=TMR0L;
    136     temp=My_T0.Result;
    137     for(i=0;i<sizeof(NumberLED.Buffer);i++)NumberLED.Buffer[i]=0;
    138     i=0;
    139     while(temp)
    140       {
    141      NumberLED.Buffer[i]=temp%10;
    142      temp/=10;
    143      i++;    
    144     }
    145     TMR0L=0;
    146     TMR0H=0;
    147     My_T0.Low_Byte=0;
    148     My_T0.High_Byte=0;
    149     Timer1S.Enable=FALSE;
    150     T0CONbits.TMR0ON=TRUE;
    151    }
    152 }
    153 }
  • 相关阅读:
    马哥Linux——第三周作业
    [laravel]phpunit
    [laravel]要点
    [laravel]请求处理
    [angularJS]ng-hide|ng-show切换
    [yii2]urlmanger
    虚拟机bridged, NAT and host-only网络区别
    [yii]Fetch data from database and create listbox in yii
    [shell test] multiple conditions
    特殊的shell变量:
  • 原文地址:https://www.cnblogs.com/wangh0802PositiveANDupward/p/3149869.html
Copyright © 2011-2022 走看看