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

📄 car.c

📁 这是我上次参加电子设计大赛的小车程序
💻 C
📖 第 1 页 / 共 2 页
字号:
       }
    if(light==1)     //若车则面的感光器检测到灯光,则       
     {
        for(i=0;i<250;i++)   //遇到光后再向前走一会,确保车尾已离开障碍物
              {
                display(); 
              }
           
          stop(0);           //右转,同时检测正对光源
          start(1,spset,1);
         while(light_ok==0)  //右转直到light_ok,正对光源
            {
              display();    
             }   
      
        start(0,spset+sp_c,1);  //正对光源后直行     
        start(1,spset+sp_c,1);
      }
     if(light_ok)
     runmode=light_track;   //将运行模式转成光跟踪光跟踪入库
}
////////光跟踪入库函数///////////////////////////////////////
void FLight_track()
{
  switch(P2&60)
   {
     case 0x40:                       //调整使车偏向右
                start(0,spset+sp_c,1);       
                start(1,spset-sp_c,1);
                while(light_ok==0)
                   {
                   }
     case 0x20:                       //调整使车偏向右
                start(0,spset-sp_c,1);       
                start(1,spset+sp_c,1);
                while(light_ok==0)
                   {
                   }

     default:
               start(0,spset+sp_c,1);       
               start(1,spset+sp_c,1);
   }
      if(have_ai==0||light==1||(pian_L&&pian_R))  //若检测到前有障碍物或则光检测到灯光
             {                                     //或两个黑色线检测器都检测到黑色线(边线)
               stop(0);                       //则停车
               stop(1);
               runmode=finish;           //将运行模式转成完成方式
              }
}

//////////完成模式函数//////////////////////////////////////////////
void Ffinish()
{
  TR0=0;
  TR1=0;
  EX1=0;
  key_en=1;
 disp[0]=0;
 disp[1]=0;
 disp[2]=0;
 disp[3]=0;
 disp[4]=0;
  while(1)
   {
     switch(key())
       {
         case 1:  break;
                    
         case 2:  if(++disp[0]>9)   //菜单加
                    disp[0]=0;
                   finishcacu();
                   break;       
         case 3: if(--disp[0]<0)   //菜单减
                    disp[0]=9;
                   finishcacu();
                   break; 
        }
      display();
   }    

}

////////////运行后的各种参数计算//////////////////////////////////
void finishcacu()
{  uint temp;
  switch(disp[0])  //根据disp[0]中的内容显示
    {
      case 1:disp[1]=26;          //显示铁片数
             disp[2]=26;
             disp[3]=26;
             disp[4]=tie_num;
             
      case 2:HexToDec(T1_count/20);break;    //显示总时间
      case 3: led_no=2;
              HexToDec(s0/200*24);break;       //显示总路程
      case 4: led_no=0;                              //显示第一片铁片的中心距离
              temp=(array[0]+array[1])/2;
              HexToDec((temp*24)/100);
      case 5: led_no=0;                                //显示第二片铁片的中心距离
              temp=(array[2]+array[3])/2;
              HexToDec((temp*24)/100);
       case 6:led_no=0;                               //显示第三片铁片的中心距离
              temp=(array[4]+array[5])/2;
              HexToDec((temp*24)/100); 
        default:break;    
    }         
   

}
////////////////5位数码管显示;//////////////////////////
void display()
{   uchar ii;
    
    
    if(dis_count++==ON_TIME)
	   {
        dis_count=0; 
	    on_off=!on_off;
	
	    }
     for(ii=0;ii<5;ii++)
        {
           if(workmode==1&&on_off==0&&ii==whichset)    //位消隐方式;
               send(ledk[26],ii);
           else if (ii==led_no)
               send(ledk[disp[ii]]|0x80,ii);
              else
                 send(ledk[disp[ii]],ii);
         }
	
}
void send(uchar sdata,uchar wei)
{
  fon_off(1,wei);
  send_one(sdata);
  fon_off(0,wei);
  delay(20);
  fon_off(1,wei);
}
void fon_off(bit b,uchar wei)
{
   switch(wei)
    {
     case 0:cd=b;break;
     case 1:qw=b;break;
     case 2:bw=b;break;
     case 3:sw=b;break; 
     case 4:gw=b;break;    
    }
}
void send_one(uchar cdata)
{
   uchar j;
   for(j=0x08;j>0x00;j--)
      {   
        DsClk=0;
        DsDat=bittest(cdata,j-1);
        DsClk=1;
       }

}

bit bittest(uchar cdata,uchar nbit)
{  if(cdata>>nbit&0x01)  
     return 1;
   else 
     return 0;
}
void delay(uchar time)
{ uchar i;
   for(i=0;i<time;i++)
          {;}
}



///////////////////////////////////////十进制转变为十六进制;
uchar DecToHex()
{
   return(disp[2]*100+disp[3]*10+disp[4]);
}
///////////////////////////////////////十六进制转变为十进制;
void  HexToDec(uint xx)
{
  uint temp;
  temp=xx/10000;
  temp=xx%10000;
  disp[1]=temp/1000;
  temp=temp%1000;
  disp[2]=temp/100;
  temp=temp%100;
  disp[3]=temp/10;
  temp=temp%10;
  disp[4]=temp;
  
}
///////////////////////////////////////外中断0记录车轮脉冲;
void INT1() interrupt 2
{
  s0++;
  HexToDec(s0);

}

///////////////////////////////定时器T1计录总时间;
void T1_time() interrupt 3
{
 TH1=hi1;
 TL1=lo1;
 T1_count++; 
}


///////////////定时器产生两路脉冲;255级速度调节          
void PWM_gen() interrupt 1
{
  if(T0_count==speed1)   //若高电平持续时间已到,则脉冲置成低电平
     m1p=0;
  if(T0_count==speed2)
     m2p=0;
  if(++T0_count==255)   //若T0_count加1后为255,则清零,同时两电机的脉冲置高电平
   {
      T0_count=0;
       m1p=1;
       m2p=1;
   }
}

//////////////////////////////////电机停止
void stop(uchar r)
{
  switch(r)
   {
     case 0:
            m11=0;
			m12=0;break;
	 case 1:
	        m21=0;
			m22=0;break;
   
   }
}

/////////////////////////////////电机正转
void zc(uchar r)
{
  switch(r)
    {
      case 0:
            m11=1;
			m12=0;break;
	  case 1:
	        m21=1;
			m22=0;break;
	 }
}
////////////////////////////////电机反转
void fc(uchar r)
{
   switch(r)
    {
       case 0:
            m11=0;
			m12=1;break;
	   case 1:
	        m21=0;
			m22=1;break;
	 }
}
/////////////////////////////////电机正常运行
void start(uchar r,char spset,bit zf)
{
    switch(r)
	  {
         case 0:
		        speed1=spset;
				break;
		  case 1:
		        speed2=spset;
				break;
        }
	  if(zf) 
	      zc(r);
	  else
	      fc(r);
}
////////////////////////////////调用KEY();
uchar key()
{
 uchar formkey;
formkey=P3&0x1c;
if(formkey!=0x1c)
 {
    delay(20);
    formkey=P3&0x1c;
while((P3&0x1c)!=0x1c)
   {
     display();
   }
  
 switch(formkey)
   {
    case 0x1c:return 0;break;  //无按键;
    case 0x18:return 1;break;  //按SW1键;
    case 0x14:return 2;break;  //按SW2键;
    case 0x0c:return 3;break;  //按SW3键;
    default:  return 0 ; break;  //无按键;
    
    }
  }
  else
     return 0;
}

⌨️ 快捷键说明

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