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

📄 interrupts.c

📁 第一届华中科技大学智能车led源码
💻 C
字号:
//*************************************************************************
//*																								                        *
//*        **********************中断函数*************************        *
//*																								                        *
//*************************************************************************
#include "Includes.h"

#define SAMPLING_STATE ATD1STAT1_CCF0
#define SAMPLING_DATA  ATD1DR0L

//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>    
unsigned int ui_SpeedCount=0;     //用于测速脉冲计数。

//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>    
//当前采样图像的行和列。
unsigned int ui_SampleRow=0,ui_SampleColumn=0;

//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>    
//图像数据缓存
unsigned char uca_Buffer1[IMAGE_ROW][IMAGE_COLUMN];
unsigned char uca_Buffer2[IMAGE_ROW][IMAGE_COLUMN];

//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>    
//指向当前采集数据采样缓存首地址的指针
unsigned char *puca_BufferSample=&uca_Buffer1[0][0];

//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>    
//指向当前处理数据采样缓存首地址的指针
unsigned char *puca_BufferProcess=&uca_Buffer2[0][0];

//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>    
//用于图像采集和处理交换缓存。
//(注意:在每次交换指针后保证puca_BufferTemp与puca_BufferSample相同)
unsigned char *puca_BufferTemp=&uca_Buffer1[0][0];

#pragma CODE_SEG NON_BANKED
//*************************************************************************
//*			 *******************输入捕捉2通道中断函数********************		  *
//*************************************************************************
//行同步 ,用于数据采集。
void interrupt 10 vIC2ISR(void)   
{
  unsigned char ucTemp;
  unsigned char *pucTemp;
  TFLG1_C2F=1;
  PORTB_BIT2=~PORTB_BIT2;
  
  if(ui_SampleRow>=SAMP_ROW_START&&ui_SampleRow<SAMP_ROW_MAX)
  {
    if(ui_SampleRow%SAMP_ROW_SEP==0)
    {
      for(ui_SampleColumn=0;ui_SampleColumn<SAMP_COL_MAX;ui_SampleColumn++)
      {
        while(!SAMPLING_STATE);
        if(ui_SampleColumn>=SAMP_COL_START)
        {
          if(ui_SampleColumn%SAMP_COL_SEP==0)
          {
            pucTemp=puca_BufferSample
              +((ui_SampleRow-SAMP_ROW_START)/SAMP_ROW_SEP)*IMAGE_COLUMN
              +(ui_SampleColumn-SAMP_COL_START)/SAMP_COL_SEP;
            *pucTemp=SAMPLING_DATA;
          }
        }
      }
    }
  }
  ucTemp=SAMPLING_DATA;
  ui_SampleRow++;               //采样行坐标加一。
}
//*************************************************************************
//*			 *******************输入捕捉1通道中断函数********************		  *
//*************************************************************************
//场同步,交换缓存以及图像处理和模型车控制。
void interrupt 9 vIC1ISR(void)    
{     
  TFLG1_C1F=1;
  ui_SampleRow=0;               //把采样行坐标清零。
  ui_SampleColumn=0;
  PORTB_BIT1=~PORTB_BIT1;
     
//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>    
//交换图像采集和处理缓存
  puca_BufferSample=puca_BufferProcess;
  puca_BufferProcess=puca_BufferTemp;
  puca_BufferTemp=puca_BufferSample;
  
//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
//系统时间加一。
  ul_SystemTime++; 
  
//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>    
//开中断,允许行信号中断进行采样。
  EnableInterrupts;
    
  if(uc_CarState==STATE_START)
  {
   //分析图像,获取路径参数,根据路径参数控制模型车。。
    vImageProcess();
    
    //根据路径参数控制模型车。
    vAutoControl();
  }
}
 
//*************************************************************************
//*			 *******************输入捕捉0通道中断函数********************		  *
//*************************************************************************
//用于测速,每当测速脉冲到来时,脉冲计数加一。
void interrupt 8 vIC0ISR(void)
{
  TFLG1_C0F=1;
  ui_SpeedCount++;
}


//*************************************************************************
//*			 *********************定时器溢出中断函数********************		  *
//*************************************************************************
void interrupt 16 vTimerOverflowISR(void)   //用于测量赛车速度。
{
  TFLG2_TOF=1;
  ui_DetectSpeed=ui_SpeedCount;
  ui_SpeedCount=0;
  
//<<<<<<<<<<<<<<<<<<<<<<<<<执行按键处理程序>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
  EnableInterrupts;
  vKeyProcess(); 
}

//*************************************************************************
//*        *********************串口接收中断**********************        *
//*************************************************************************
void interrupt 20 SerialISR(void)
{
  SCI0SR1_RDRF=1;
  
//<<<<<<<<<<<<<<<<<<<<<<<<<获取命令字符串>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
  vGetString(SCI0DRL);
}

  



⌨️ 快捷键说明

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