⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 interrupt.c

📁 基于单片机PIC16F877的超声波传感器应用程序 可用来检测距离信号
💻 C
字号:
/****************************************************************************************
  项目工程:          超声传感器应用程序
  单片机:              PIC16F876A
  晶振:                  20MHz
*****************************************************************************************/ 

#include     <pic.h>

#define   RCRA1    PORTA^=0x02
#define   RCRA0    PORTA^=0x01

void Delay (unsigned int t)//延时子程序
{
  while(t)t--;  
}

                        
unsigned char LEDDATA[]=
{
    0x3F,0x06,0x5B,0x4F,0x66,                                                     //01234  共阴数码管显示
    0x6D,0x7D,0x07,0x7F,0x6F,                                                    //56789
};
unsigned char LEDBuffer[3]={0,0,0};                                         //动态数码管显示的缓冲区定义
unsigned char ScanLEDCount=0;
unsigned char ScanLEDPoint=0x01;
unsigned char TMPL,TMPH;
unsigned int temp=0;
unsigned int CountValue=0;
bit flag=0;
unsigned char INT_Time=0;

//unsigned char Point=0x01;
void initial (void);


/*****************************初始化程序***************************************************/

void initial (void)
{
    GIE=0;

/************************I/O口初始化********************************************************/

    PORTA=0;
    TRISA=0;   
    PORTB=0;                                                                            //定义A口RA2为输入,其他为输出
    PORTC=0;
    TRISB=0x01;                                                                                   //B口为输出
    TRISC=0x80;                                                                             //C口最高位RXD为输入,其他为输出
   // ADCON1&=0x07; ADCON1|=0x07;
   //置RA0-RA5为数字IO
    PCFG2=1;
    PCFG1=1;
    PCFG0=1;
    TRISA=0x04;       

    INTEDG=0;
    INTE=1;
    INTF=0;
                                                                                              
  /*********************TMR0初始化,定时25us作为40khz频率发生器*****************/  

    TMR0=256-21;                                  //定时1mS初值装入TMR0
    T0CS=1;                                       //选择TMR0工作
    PSA=0;
    T0IF=0;                                      //清TMR0溢出标志位
    PS2=0;                                       //TMR0分频比为1:2
    PS1=0;
    PS0=0;
    T0IE=1;                          
/*********************TMR1初始化,作为接收定时器**************************************/ 
 
    T1OSCEN=0;                                   //禁止自带振荡器功能
    TMR1CS=0;                                  //工作于定时方式
    T1CKPS1=0;                                //预分频比为1:4
    T1CKPS0=0;
    //T1SYNC=1;                                                                                //异步方式
    TMR1H=0;
    TMR1L=0;
    TMR1IF=0;
    TMR1IE=1;                                      //TMR1允许中断
    PEIE=1;                                  //允许第二梯队的中断源 

/*********************TMR2初始化,定时13ms作为扫描数码管定时器******************/ 
 
    T2CKPS1=1;                        //预分频系数为1:16
    T2CKPS0=1;
    TOUTPS3=0;                        //后分频系数为1:16
    TOUTPS2=1;
    TOUTPS1=1;
    TOUTPS0=1;
    TMR2=0;                           //定时13.107ms的初值
  
    TMR2IF=0;                         //清定时器2中断标志
    TMR2IE=1;                         //允许定时器2中断
    PEIE=1;                           //允许第二梯队的中断源
    TMR2ON=1;//关定时器2
    
    GIE=1;                            //开全局中断
   
}

void Display ()
{
  unsigned char i;
  INTE=0;
  TRISB=0x00;
    PORTB=LEDDATA[LEDBuffer[ScanLEDCount]];
    PORTC=PORTC|ScanLEDPoint;
  for(i=0;i<255;i++)
    {
    asm("nop");
    asm("nop");
    asm("nop");
    asm("nop");
    asm("nop");
    asm("nop");
    asm("nop");
    asm("nop");
    asm("nop");
    asm("nop");
    asm("nop"); 
    }   
    PORTB=0;
    PORTC=0;
    ScanLEDPoint=ScanLEDPoint<<1;
    ScanLEDCount++;
    if(8==ScanLEDPoint)ScanLEDPoint=0x01;
    if(3==ScanLEDCount)ScanLEDCount=0;
    TRISB=0x01;
    INTE=1;
}


/********************************主程序*********************************************/

void main (void)
{
 //  unsigned char i,j;
   
 //  unsigned int adder=0;
   initial();

  while(1)
   {
      
      Delay(10000);
   //   Delay(10000);
      Delay(40000);
      Delay(40000);
   //   Delay(40000);
      RA3=1;
      
      
         T0CS=0;
         
         TMR1ON=1;
    //     
    //     flag=1;
    //     while(RA2==0);
    //     TMR1ON=0;
    //     T0CS=1;
    //  if(j==1)
    //  {
    //      TMPL=TMR1L;
    //      TMPH=TMR1H;
    //      CountValue=TMPH*256+TMPL; 
     // }
       Delay(600);
  //     INT_Time=0;  
       TMR1ON=1;
              /////////@@@@@@@@********
         
    //滤波处理程序  
      //   adder+=CountValue;
      /*   if(j==20)
     //    {adder=adder/20;}*/
      
    //   flag=0;
    //     TMR1H=0;
    //     TMR1L=0;
     
     T0CS=1;
     RA1=0; 
     RA3=0;
     
      temp=CountValue;
      LEDBuffer[2]=temp/100;
      temp=temp%100;
      LEDBuffer[1]=temp/10;
      temp=temp%10;
      LEDBuffer[0]=temp;
 
      RCRA0;
    
   
   }   
}



void interrupt PIC16F876A_ISR(void)
{
  if(INTF==1)
  {
    INTF=0;
    TMR1ON=0;
    RA1=0; 
    
    INT_Time++;
 //   if(INT_Time==1)
 //   {
    TMPL=TMR1L;
    TMPH=TMR1H;
    CountValue=TMPH*256+TMPL;
 //   } 
    TMR1H=0;
    TMR1L=0;
  }
  
  


  if(T0IF==1)
    {
    T0IF=0;
    TMR0=256-21;
    RCRA1;
    }

  if(TMR1IF==1)
    {
    TMR1IF=0;
    TMR1H=0;
    TMR1L=0;
    }
  if(TMR2IF==1)
    {
    TMR2IF=0; 
    Display();
    }
  
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -