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

📄 rec.c

📁 freesacle的实时操作系统UCOS的开发程序
💻 C
字号:
 #include <mc9s12dg128.h> 
 #include "ATD.h"
 #include "Uart.h"
 #include "display.h"
 #include "ctrl.h"
  #include "lcd.h"
 // extern void turn_R_L(float d);
 
 
 //#define gate_v 180

 //#define P_A  PTH
 #define P_A  PORTA
 
 extern unsigned char gate_v[14];
  extern unsigned char key;
 char cur_hsy[30];
 unsigned char chy_p,gate_ch;
 extern unsigned  char spd_lock;
  void time_delay(unsigned int i);
  
  
  
  //unsigned char data[300][13] ;
  //unsigned int data_p=0;

///////////   new						 +
 
/*
 ***************************************************************************************
 * 函数名:	 void rgz(void)
 *
 * 功  能:   检测黑线;
 *
 * 说  明:   黑线=1;白线=0;放在lm_now[14]这个数组里,lm_now[1]~lm_now[13]对应红外检测管
 *           从左到右共13个管
 *
 ****************************************************************************************
 */    
void rgz(void)
{

unsigned char temp1,temp2,temp4;
char temp3;
unsigned char lm_now[14];
unsigned char dp[14];
    /////////////////////    (1)				+
    
P_A=3; //点亮第1、2组红外



		//dp[0]=ATD1_ChannelX(1);
		
     
    time_delay(500);					 //延迟一段时间 

    ATD0CTL5=1;			            //ATD0通道0转换开关 ,打开通道开始新的转换
    ATD1CTL5=1;			            //ATD1通道0转换开关 ,打开通道开始新的转换

		temp1=0;
    temp2=0;
    while (!(ATD0STAT1 & 0x01));       //等待ATD0第一次转换完成				1
    if(ATD0DR0H<=gate_v[1])							 
 	        temp1++;
          dp[1]= ATD0DR0H;
    while (!(ATD1STAT1 &0x01));        //等待ATD1第一次转换完成				7
    if(ATD1DR0H<=gate_v[7])
 	        temp2++;
					dp[7]= ATD1DR0H;
    
    while (!(ATD0STAT1 & 0x02));       //等待ATD0第二次转换完成				1
    if(ATD0DR1H<=gate_v[1])
 	        temp1++;
    while (!(ATD1STAT1 & 0x02));       //等待ATD1第二次转换完成				7
    if(ATD1DR1H<=gate_v[7])
 	        temp2++;
    
    while (!(ATD0STAT1 & 0x04));       //等待ATD0第三次转换完成				1
    if(ATD0DR2H<=gate_v[1])
 	        temp1++;
    while (!(ATD1STAT1 & 0x04));       //等待ATD1第三次转换完成				7
    if(ATD1DR2H<=gate_v[7])
 	        temp2++;
    
    
P_A=6; //预点亮第2、3组红外


 		if(temp1>1)	 ///////////    1
       	lm_now[1]=0;	 //处在亮线
    else															 /////第一组
        lm_now[1]=1;   //处在暗线
    
    
    if(temp2>1) ////////////    7
       	lm_now[7]=0;   //处在亮线
    else
        lm_now[7]=1;   //处在暗线


     /////////////////////    (1)				-
   
   
    /////////////////////    (2)				+
   time_delay(250);					 //延迟一段时间 

   ATD0CTL5=2;			            //ATD0通道1转换开关 ,打开通道开始新的转换
   ATD1CTL5=2;			            //ATD1通道1转换开关 ,打开通道开始新的转换
   
    temp1=0;
    temp2=0;
    while (!(ATD0STAT1 & 0x01));       //等待ATD0第一次转换完成					 4
    if(ATD0DR0H<=gate_v[4])							 
 	        temp1++;
    			dp[4]= ATD0DR0H;
    
    while (!(ATD1STAT1 &0x01));        //等待ATD1第一次转换完成					 10
    if(ATD1DR0H<=gate_v[10])
 	        temp2++;
    			dp[10]= ATD1DR0H;
    
    
    while (!(ATD0STAT1 & 0x02));       //等待ATD0第二次转换完成					 4
    if(ATD0DR1H<=gate_v[4])
 	        temp1++;
    while (!(ATD1STAT1 & 0x02));       //等待ATD1第二次转换完成					 10
    if(ATD1DR1H<=gate_v[10])
 	        temp2++;
    
    while (!(ATD0STAT1 & 0x04));       //等待ATD0第三次转换完成					 4
    if(ATD0DR2H<=gate_v[4])
 	        temp1++;
    while (!(ATD1STAT1 & 0x04));       //等待ATD1第三次转换完成					 10
    if(ATD1DR2H<=gate_v[10])
 	        temp2++;
    
    
 P_A=12; //预点亮第3、4组红外
 
 
 		if(temp1>1)	 ///////////    4
       	lm_now[4]=0;		 //处在亮线
    else                                  /////第二组
        lm_now[4]=1;		 //处在暗线						 
    
    
    if(temp2>1) ////////////    10
       	lm_now[10]=0;    //处在亮线
    else
        lm_now[10]=1;    //处在暗线	
   
     /////////////////////    (2)				-
     
     
     /////////////////////    (3)				+
   time_delay(250);					 //延迟一段时间 

   ATD0CTL5=3;			            //ATD0通道2转换开关 ,打开通道开始新的转换
   ATD1CTL5=3;			            //ATD1通道2转换开关 ,打开通道开始新的转换
   
    temp1=0;
    temp2=0;
    while (!(ATD0STAT1 & 0x01));       //等待ATD0第一次转换完成					2
    if(ATD0DR0H<=gate_v[2])							 
 	        temp1++;
    			dp[2]= ATD0DR0H;
    
    while (!(ATD1STAT1 &0x01));        //等待ATD1第一次转换完成					8
    if(ATD1DR0H<=gate_v[8])
 	        temp2++;
    			dp[8]= ATD1DR0H;
    
    
    while (!(ATD0STAT1 & 0x02));       //等待ATD0第二次转换完成					2
    if(ATD0DR1H<=gate_v[2])
 	        temp1++;
    while (!(ATD1STAT1 & 0x02));       //等待ATD1第二次转换完成					8
    if(ATD1DR1H<=gate_v[8])
 	        temp2++;
    
    while (!(ATD0STAT1 & 0x04));       //等待ATD0第三次转换完成					2
    if(ATD0DR2H<=gate_v[2])
 	        temp1++;
    while (!(ATD1STAT1 & 0x04));       //等待ATD1第三次转换完成					8
    if(ATD1DR2H<=gate_v[8])
 	        temp2++;
    
    
P_A=24; //预点亮第4、5组红外


 		if(temp1>1)	 ///////////    2
       	lm_now[2]=0;				//处在亮线
    else                                        /////第三组
        lm_now[2]=1;				//处在暗线					 
    
    
    if(temp2>1) ////////////    8
       	lm_now[8]=0;        //处在亮线
    else
        lm_now[8]=1;        //处在暗线	
   
   
     /////////////////////    (3)				-
        
     
     /////////////////////    (4)				+
   time_delay(250);					 //延迟一段时间 

   ATD0CTL5=4;			            //ATD0通道4转换开关 ,打开通道开始新的转换
   ATD1CTL5=4;			            //ATD1通道4转换开关 ,打开通道开始新的转换
   
    temp1=0;
    temp2=0;
    while (!(ATD0STAT1 & 0x01));       //等待ATD0第一次转换完成						5
    if(ATD0DR0H<=gate_v[5])							 
 	        temp1++;
    			dp[5]= ATD0DR0H;
    
    while (!(ATD1STAT1 &0x01));        //等待ATD1第一次转换完成						11
    if(ATD1DR0H<=gate_v[11])
 	        temp2++;
    			dp[11]= ATD1DR0H;
    			
    while (!(ATD0STAT1 & 0x02));       //等待ATD0第二次转换完成						5
    if(ATD0DR1H<=gate_v[5])
 	        temp1++;
    while (!(ATD1STAT1 & 0x02));       //等待ATD1第二次转换完成						11
    if(ATD1DR1H<=gate_v[11])
 	        temp2++;
    
    while (!(ATD0STAT1 & 0x04));       //等待ATD0第三次转换完成						5
    if(ATD0DR2H<=gate_v[5])
 	        temp1++;
    while (!(ATD1STAT1 & 0x04));       //等待ATD1第三次转换完成						11
    if(ATD1DR2H<=gate_v[11])
 	        temp2++;
    
    
P_A=48; //预点亮第5、6组红外
 		
 		
 		if(temp1>1)	 ///////////    5
       	lm_now[5]=0;					 //处在亮线
    else                                                /////第四组
        lm_now[5]=1;					 //处在暗线			 
    
    
    if(temp2>1) ////////////    11
       	lm_now[11]=0;          //处在亮线
    else
        lm_now[11]=1;          //处在暗线
   

     /////////////////////    (4)				-
        
     
     /////////////////////    (5)				+
   time_delay(250);					 //延迟一段时间 

   ATD0CTL5=5;			            //ATD0通道5转换开关 ,打开通道开始新的转换
   ATD1CTL5=5;			            //ATD1通道5转换开关 ,打开通道开始新的转换
   
    temp1=0;
    temp2=0;
    while (!(ATD0STAT1 & 0x01));       //等待ATD0第一次转换完成					 3
    if(ATD0DR0H<=gate_v[3])							 
 	        temp1++;
    			dp[3]= ATD0DR0H;
    while (!(ATD1STAT1 &0x01));        //等待ATD1第一次转换完成					 9
    if(ATD1DR0H<=gate_v[9])
 	        temp2++;
    			dp[9]= ATD1DR0H;
    			
    while (!(ATD0STAT1 & 0x02));       //等待ATD0第二次转换完成					 3
    if(ATD0DR1H<=gate_v[3])
 	        temp1++;
    while (!(ATD1STAT1 & 0x02));       //等待ATD1第二次转换完成					 9
    if(ATD1DR1H<=gate_v[9])
 	        temp2++;
    
    while (!(ATD0STAT1 & 0x04));       //等待ATD0第三次转换完成					 3
    if(ATD0DR2H<=gate_v[3])
 	        temp1++;
    while (!(ATD1STAT1 & 0x04));       //等待ATD1第三次转换完成					 9
    if(ATD1DR2H<=gate_v[9])
 	        temp2++;
    
    
P_A=32; //预点亮第6、7组红外


 		if(temp1>1)	 ///////////    3
       	lm_now[3]=0;			 //处在亮线
    else                                        /////第五组
        lm_now[3]=1;			 //处在暗线					
    
    
    if(temp2>1) ////////////    9
       	lm_now[9]=0;      //处在亮线
    else
        lm_now[9]=1;      //处在暗线	
   
   
     /////////////////////    (5)				-
        
     
     /////////////////////    (6)				+
   time_delay(250);					 //延迟一段时间 

   ATD0CTL5=6;			            //ATD0通道6转换开关 ,打开通道开始新的转换

   
    temp1=0;
    while (!(ATD0STAT1 & 0x01));       //等待ATD0第一次转换完成		 6
    if(ATD0DR0H<=gate_v[6])							 
 	        temp1++;
    			dp[6]= ATD0DR0H;
    			
    while (!(ATD0STAT1 & 0x02));       //等待ATD0第二次转换完成		 6
    if(ATD0DR1H<=gate_v[6])
 	        temp1++;
    
    while (!(ATD0STAT1 & 0x04));       //等待ATD0第三次转换完成		 6
    if(ATD0DR2H<=gate_v[6])
 	        temp1++;
    

P_A=0;          //灭掉所有红外  


 		if(temp1>1)	 ///////////    7
       	lm_now[6]=0;						  //处在亮线
    else                                         /////第六组
        lm_now[6]=1;							//处在暗线		 
    


     /////////////////////    (6)				-
        
    
    



   

 if(gate_ch==1)
 
   {
    gate_ch=0;
    for (temp1=1;temp1<12;temp1++)
    
    {
     gate_v[temp1]=dp[temp1]+17;   
    }
    
   }
   
   


 /*
  
        //打印当前路面情况   +
        
 uart_putchar('\n');
 uart_putchar('\r');       
 for(temp1=1;temp1<14;temp1++)
   {
      uart_putchar(lm_now[temp1]+0x30);
      uart_putchar(' ');
   }
 uart_putchar('\n');
 uart_putchar('\r');
 
 
 for(temp1=0;temp1<14;temp1++)
   {
      uart_putchar(' ');   
      display2((unsigned long)temp1);
      uart_putchar(':');
      display2((unsigned long)dp[temp1]);
      uart_putchar(' ');
   }
 uart_putchar('\n');
 uart_putchar('\r');

 				//打印当前路面情况   -
	
*/	 
		
    	
   ///////处理路面数据               +
   
   temp2=0;
   temp3=0;
   temp4=0;

   for(temp1=1;temp1<12;temp1++)
   {
      temp2+=lm_now[temp1];

      
   }
   
   
   
   for(temp1=1;temp1<12;temp1++)
   {
      if(temp3==0)
         {
          if(lm_now[temp1] == 1)
            {
                temp3=temp1+temp1;
                temp4++;
            }
         } 
      else
        {
           if(lm_now[temp1] == 1)
            {
                temp4++;
            } 
            
           else 
             {
                break;
             }
        }
        
        
   }
   temp1=chy_p;
   chy_p++;//指向下一个cur_hsy
   if(chy_p>29)
      chy_p=0;  
   
    
   if(temp2==0)
   
   {						 //检测到没线
     cur_hsy[chy_p]= 11;
    
   } 
  else  if((temp2==temp4)&&(temp4<=3))
   {
      									  //检测到黑线!但不是交叉线
    temp3+=temp4;       
    temp3=13-temp3;			  //得到转弯的基角度
    cur_hsy[chy_p]=temp3;
    
   } 
  else
   {						 //检测是交叉线
     cur_hsy[chy_p]=cur_hsy[temp1]; //转向不变
   }

 //uart_putchar(' ');
  //display2((unsigned long)temp3);  
   
   ///////处理路面数据               -
   
  /* 
  uart_putchar('\n');
  uart_putchar('\r');
  uart_putchar('d');
  uart_putchar(':');
  uart_putchar(' ');
  if(cur_hsy[chy_p]<0)
  
  {
   uart_putchar('-');
   display2((unsigned long)(cur_hsy[chy_p]*(-1))); 
    
  } else
  display2((unsigned long)cur_hsy[chy_p]);
  
  uart_putchar(' ');
  display2((unsigned long)temp4);
  uart_putchar(' ');
  display2((unsigned long)temp2);
  uart_putchar(' ');
  display2((unsigned long)temp3);
  
  uart_putchar('\n');
  uart_putchar('\r');
   
   
  */ 
   
   
   ////////转弯          +

   
   SP_RL(cur_hsy[chy_p]);
   
   ////////转弯          -
   if(key!=2) 
 
    {
      
  speed_show(0,(unsigned int)dp[11]);
  speed_show(4,(unsigned int)dp[10]);
  speed_show(8,(unsigned int)dp[9]);
  speed_show(12,(unsigned int)dp[8]);
  speed_show(16,(unsigned int)dp[7]);
  speed_show(20,(unsigned int)dp[6]);
  speed_show(24,(unsigned int)dp[5]);
  speed_show(28,(unsigned int)dp[4]);
  speed_show(32,(unsigned int)dp[3]);
  speed_show(36,(unsigned int)dp[2]);
  speed_show(42,(unsigned int)dp[1]);		 
  

  lcd_dsp_buff[53]=lm_now[11]+0x30;
  lcd_dsp_buff[54]=lm_now[10]+0x30;
  lcd_dsp_buff[55]=lm_now[9]+0x30;
  lcd_dsp_buff[56]=lm_now[8]+0x30;
  lcd_dsp_buff[57]=lm_now[7]+0x30;
  lcd_dsp_buff[58]=lm_now[6]+0x30;
  lcd_dsp_buff[59]=lm_now[5]+0x30;
  lcd_dsp_buff[60]=lm_now[4]+0x30;
  lcd_dsp_buff[61]=lm_now[3]+0x30;
  lcd_dsp_buff[62]=lm_now[2]+0x30;
  lcd_dsp_buff[63]=lm_now[1]+0x30;
  
    }
}
///////////   new						 -

/*
 ***************************************************************************************
 * 函数名:	 void time_delay(unsigned int i)
 *
 * 功  能:   延时
 *
 * 说  明:
 *
 *
 ****************************************************************************************
 */
 void time_delay(unsigned int i)
 
 { 
   for(;i>0;i--) 
     {
        asm
          {
          nop
          }
     }
 }
 
 

⌨️ 快捷键说明

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