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

📄 a.c

📁 飞思卡尔智能车中线提取程序 飞思卡尔单片机用于辨别黑白
💻 C
📖 第 1 页 / 共 3 页
字号:

    g_VideoFlag = VIDEO_ON; 
    g_VideoStartLine = VIDEO_START_LINE;
    g_SCI0SendVideoImageEnable = OFF;    
    INTCR_IRQEN = ON;
}


/*********************************************************************
Function Name:SystemStart                          
Description:  Start Sysmtem 
Inputs:       None               
Outputs:      None                                                   
NOTES:                                                            
*********************************************************************/
void SystemStart(void)
{		 
	g_BasicSpeed = 35;
    g_HighestSpeed = 60;
    EnableInterrupts;  
    for(;;) 
    {
    }  
}

/*********************************************************************
Function Name:IRQ_ISR                          
Description:  IRQ interrupt service function,read CMOS camera 
Inputs:       None               
Outputs:      None                                                   
NOTES:                                                            
*********************************************************************/
#pragma CODE_SEG __NEAR_SEG NON_BANKED /* Interrupt section for this module. Placement will be in NON_BANKED area. */
__interrupt void IRQ_ISR(void) 
{	  
	  INT8U j = 0;
	  INT8U i = 0;
	  INT16S l_pulse = 0;
	  INT16U l_tempPWMDTY45 = 0;
	  
	  g_BottomValidLine = MAX_VIDEO_LINE - 1;
	   	
	  if(VIDEO_STOP != g_VideoFlag) 	
	  {
		    if(ODD_EVEN_STATUS != g_OddEvenFlag) 
		    {
		        MovementAdjust = ON;
  			    g_OddEvenFlag = ODD_EVEN_STATUS;
  		    	g_VideoFlag = VIDEO_WAIT;
  		    	g_VideoLine = 0;
  		    	g_VideoImageLine = 0;	
		    }
		    if(VIDEO_WAIT == g_VideoFlag) 
		    {
			      g_VideoLine ++;
		      	if(g_VideoLine >= VIDEO_START_LINE) 	
		      	{
  				      g_VideoLine = 0;
  				      g_VideoImageLine = 0;
  				      g_VideoFlag = VIDEO_SAMPLE;
		      	}  	
		    } 
		    else if(VIDEO_SAMPLE == g_VideoFlag) 
		    {
			      g_VideoLine ++;
			      if(7 == (g_VideoLine & 0x07)) 
			      {
			  	      if(g_VideoImageLine >= MAX_VIDEO_LINE) 
			  	      {
				          	g_VideoFlag = VIDEO_FINISH;
			    	    } 
			        	else 
			        	{
							//SAMPLE HERE
							for(i = 0;i < MAX_VIDEO_POINT + VIDEO_START_POINT; i ++)
							{
								g_VideoLineDate[i] = (VIDEO_PORT)
							}
				        }
 
			      }
    		    else if(4 == (g_VideoLine & 0x07))
    		    {
    				    if((g_VideoImageLine < MAX_VIDEO_LINE) && (g_VideoLine > 7)) 
    				    {
    					      for(i = 0; i < MAX_VIDEO_POINT; i ++)
    					      {
        					      g_VideoImageDate[g_VideoImageLine][i] = g_VideoLineDate[i + VIDEO_START_POINT];
    					      }
    					      g_VideoImageLine ++;
					          if(g_VideoImageLine >= MAX_VIDEO_LINE) 
    					      {
    						        g_VideoFlag = VIDEO_FINISH;
    					      }
    				    }
    		    } 
    		   
		    }
else if( VIDEO_FINISH == g_VideoFlag) 
	      {
	          
		    	      //=====================提取黑线中心位置=========================
	  	      
              	//初始化数组
              	for(n = 0; n < MAX_VIDEO_LINE; n ++)
              	{
              	    g_BlackPositionCenter[n] = 180;
              	    g_width[n] = 0; 	   
              	}
              	
              	//先找最下面有效行,做为以后行的基础
              	//确定搜索范围 
              	g_SearchStart = g_BottomMiddle - 30;
              	g_SearchEnd = g_BottomMiddle + 30;
				if(g_SearchStart < 0)
              	{
              	    g_SearchStart = 0; 
              	}
              	if(g_SearchEnd >= MAX_VIDEO_POINT)
              	{
                    g_SearchEnd = MAX_VIDEO_POINT - 1;
              	}
              	
              	//找最底的有效行  
               	for(n = MAX_VIDEO_LINE - 1; n > 15; n --) 
               	{																		 
                  	for(k = 0; k < MAX_BLACK_NUM; k ++) 
                    {
                	     g_BlackPoint[0][k] = 180;	 
                	     g_BlackPoint[1][k] = 0;		 
                    }     
                 	  cnt = 0;
                 	  m = g_SearchStart;	    	  
                    while((m < g_SearchEnd) && (cnt < MAX_BLACK_NUM))
                    {
                        if(g_VideoImageDate[n][m] < MIDDLE)
                        {
                            l_BlackStartDot = m;
                            while((g_VideoImageDate[n][m + 1] < MIDDLE) && (m < g_SearchEnd))
                            {
                                m ++;
                            }
                            if(((m - l_BlackStartDot) < 20) && ((m - l_BlackStartDot) > 4)) 
                            {
                                g_BlackPoint[0][cnt] = (l_BlackStartDot + m) / 2; 
                                g_BlackPoint[1][cnt] = m - l_BlackStartDot + 1; 
                                cnt ++;            
                            } 
                            else
                            {
                
                            }
                            m += 2;  //继续扫描     
                        }
                        else
                        {																			
                          m ++;
                        }
                    } 	  
                  if(g_BlackMiddle[0] == 118) 
                  {
                     m = 40;
                     BackLineValidFlag = 1;
                     while(m < g_SearchStart) 
                     {
                        if((g_VideoImageDate[n][m] < MIDDLE) && (g_VideoImageDate[n][m + 1] < MIDDLE)) 
                        {
                           BackLineValidFlag = 0;
                           m = g_SearchStart; 
                        } 
                        else 
                        {
                           m ++;
                        }
                     }      
                     if(1 == BackLineValidFlag) 
                     {        
                        for(k = 0; k < MAX_BLACK_NUM; k ++) 
              	        { 	     
                            if((g_BlackPoint[0][k] >= 90) && (g_BlackPoint[0][k] != 180)) 
                            {
                                g_BottomValidLine = n; 
                                g_BlackPositionCenter[g_BottomValidLine] = g_BlackPoint[0][k];
                                g_width[g_BottomValidLine] = g_BlackPoint[1][k];
                                n = 0;       
                            } 
                            else 
                            {
                            }          	     
                        }
                     } 
                     else
                     {
                        ;
                     }
                  }     
                  else if(1 == g_BlackMiddle[0]) 
                  {
                     m = 70;
                     BackLineValidFlag = 1;
                     while(m > g_SearchEnd) 
                     {
                        if((g_VideoImageDate[n][m] < MIDDLE) && (g_VideoImageDate[n][m - 1] < MIDDLE)) 
                        {
                           BackLineValidFlag = 0;
                           m = g_SearchEnd; 
                        } 
                        else 
                        {
                           m --;
                        }
                     }
                    
                     if(1 == BackLineValidFlag) 
                     {        
                  	    for(k = 0; k < MAX_BLACK_NUM; k ++) 
              	        { 	     
                           if(g_BlackPoint[0][k] < 30) 
                           {
                              g_BottomValidLine = n;
                              g_BlackPositionCenter[g_BottomValidLine] = g_BlackPoint[0][k];
                              g_width[g_BottomValidLine] = g_BlackPoint[1][k];
                              n = 0;  // 跳出循环        
                           } 
                           else 
                           {
      	     
                           }      
                        }
                     } 
                     else
                     {
                        ;
                     }
                  } 
                  else
                  {    
                    for(k = 0; k < MAX_BLACK_NUM; k ++) 
              	    { 	     
                       if((g_BlackPoint[0][k] < (g_BottomMiddle + LIMIT)) && (g_BlackPoint[0][k] > (g_BottomMiddle - LIMIT)))
                       {
                          g_BottomValidLine = n; 
                          g_BlackPositionCenter[g_BottomValidLine] = g_BlackPoint[0][k];
                          g_width[g_BottomValidLine] = g_BlackPoint[1][k];
                          n = 0;  // 跳出循环        
                       } 
                       else 
                       {

                       }
              	    }
                  }    
                }//已经搜索过了最底部有效行
//======如果底部有效行上面的以行无效则使其中心与底部有效行相同 ,保证有有效行      
              	             
              	    if(g_BlackPositionCenter[g_BottomValidLine - 1] == 180)
                    {	              
                       g_BlackPositionCenter[g_BottomValidLine - 1] = g_BlackPositionCenter[g_BottomValidLine];
                       g_width[g_BottomValidLine - 1] = g_width[g_BottomValidLine];
                    }
                    else 
                    {
                       ;
                    }                   
              	} 
              	
              	         
                if(1 == NextFlag)
                {
              	    for(n = g_BottomValidLine - 2; n >= 0; n --) //(n必须为有符号的)
              	    {
              	      
              	      for(k = 0;k < MAX_BLACK_NUM;k ++) 
              	      {
              	         g_BlackPoint[0][k] = 180;
              	         g_BlackPoint[1][k] = 0;
                      } 
                 
                      k = n + 1; 
                      while(g_BlackPositionCenter[k] == 180) 
                      {
                         k ++ ;
                      }
                      
                      k2 = k + 1;
                      while(g_BlackPositionCenter[k2] == 180)
                      {
                         k2 ++;
                      }
                      //动态改变黑线宽度的下限和上限
                      if(g_width[k2] >= g_width[k]) 
                      {
                         g_WidthError = g_width[k2] - g_width[k] + 6;
                         g_MinWidth = g_width[k] - g_WidthError; //(有可能为负)
                         if(g_MinWidth < 2)
                         {
                            g_MinWidth = 2;
                         }
                         g_MaxWidth = g_width[k] + g_WidthError;
                         if(g_MaxWidth > 25)
                         {
                            g_MaxWidth = 25;
                         }
                      } 
                      else

⌨️ 快捷键说明

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