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

📄 单片机智能小车寻迹.txt

📁 单片机控制小车按照设计好的路线行驶并且可以增加路程记录功能
💻 TXT
字号:
单片机控制智能寻线小车程序


  以下是ATmega16控制的智能小车循迹程序,希望能够对大家有所帮助。 

//ICC-AVR application builder : 2008-3-26 15:36:23
// Target : M16
// Crystal: 8.000Mhz

#i nclude <iom16v.h>
#i nclude <macros.h>
#define uchar unsigned char
#define uint unsigned int
uchar count=0;//小车行走步数寻左
void forward2(void);
void forward1(void);
void init_devices(void)
{
 CLI(); //禁止所有中断
 MCUCR  = 0x00;
 MCUCSR = 0x80;//禁止JTAG
 GICR   = 0x00;
 SEI();//开全局中断
}
//定时T1初始化
void timer1_init(void)
{
 TCCR1B = 0x00;//停止定时器
 TIMSK |= 0x00;//中断允许
 TCNT1H = 0x00;
 TCNT1L = 0x00;//初始值
 OCR1AH = 0x00;
 OCR1AL = 0xF0;//匹配A值
 OCR1BH = 0x00;
 OCR1BL = 0xF0;//匹配B值
 ICR1H  = 0xFF;
 ICR1L  = 0xFF;//输入捕捉匹配值
 TCCR1A = 0xA1;
 TCCR1B = 0x01;//启动定时器
}
//*****************PWM 调速***************************//
void leftspeed(uchar tempocra)
{
 OCR1AH = 0x00;
 OCR1AL = tempocra;
}
void rightspeed(uchar tempocrb)
{
 OCR1BH = 0x00;
 OCR1BL = tempocrb;
}
//*****************延时函数ms级***************************//

void delayms(uint MS)    
{
 uint i,j;
 for( i=0;i<MS;i++)
 for(j=0;j<1141;j++); //1141是在8MHz晶振下
}

/******************延时函数us级**************************/
void delayus(uint US)    
{
 uint i;
 US=US*5/4;      //5/4是在8MHz晶振下
 for( i=0;i<US;i++); 
}
//****************校偏函数HEAD1前进******************************//
void reviseL1(uchar discrepancy)//=0为直线 =1为左偏 =2右偏 =3严重左偏 =4严重右偏
{
 if (discrepancy==0)
 {
  PORTB=0X06;
  return;
 }
  if (discrepancy==1)
 {
  PORTB=0X02;
   delayms(20);
  return;
 }
  if (discrepancy==2)
 {
  PORTB=0X04;
   delayms(20);
  return;
 }
   if (discrepancy==3)
 {
  PORTB=0X02;
   delayms(40);
  
  return;
 }
   if (discrepancy==4)
 {
  PORTB=0X04;
   delayms(40);
  return;
 }
}
//****************校偏函数HEAD2前进******************************//
void reviseL2(uchar discrepancy)//=0为直线 =1为左偏 =2右偏 =3严重左偏 =4严重右偏
{
 if (discrepancy==0)
 {
  PORTB=0X09;
  return;
 }
  if (discrepancy==1)
 {
  PORTB=0X08;
  delayms(20);
  return;
 }
  if (discrepancy==2)
 {
  PORTB=0X01;
  delayms(20);
  return;
 }
   if (discrepancy==3)
 {
  PORTB=0X08;
  delayms(40);
  return;
 }
   if (discrepancy==4)
 {
  PORTB=0X01;
  delayms(40);
  return;
 }
}
//***********************HEAD1向左拐*********************//
void head1turnleft()
{
 uchar time;
 leftspeed(200);
 rightspeed(200);
 PORTB=0x05;
 delayms(500);
 while(1)
 {
  time=0x08&PINA;
  if(time==0x08)
  break; 
  else
       continue;
 
 }
 count=count+1;
 leftspeed(255);
 rightspeed(255);
 PORTB=0X06;
 return;
}
//***********************HEAD1向右拐*********************//
void head1turnright()
{
 uchar time1;
 leftspeed(200);
 rightspeed(200);
 PORTB=0x0a;
 delayms(500);
 while(1)
 {
  time1=0x08&PINA;
  if(time1==0x08)
    break;
  else
       continue;
 }
 count=count+1;
 leftspeed(255);
 rightspeed(255);
 PORTB=0X06;
 return;
}
//***********************HEAD2向左拐*********************//
void head2turnleft()
{
 uchar time;
 leftspeed(200);
 rightspeed(200);
 PORTB=0x05;
 delayms(500);
 while(1)
 {
  time=0x08&PINC;
  if(time==0x08)
  {
  break;
  }
  else
       continue;
 
 } 
 count=count+1;
 leftspeed(255);
 rightspeed(255);
 return;
}
//***********************HEAD2向右拐*********************//
void head2turnright()
{
 
 uchar time;
 leftspeed(200);
 rightspeed(200);
 PORTB=0x0A;
 delayms(500);
 while(1)
 {
  time=0x08&PINC;
  if(time==0x08)
    break;
  else
       continue;
 
 }
 count=count+1;
 leftspeed(255);
 rightspeed(255);
 return;
}
//****************循迹函数HEAD1寻左**************************//
 void inlinel1()
 {
  uchar state1;
  state1=0x7e&PINA;
  switch(state1)
   {
    case 0x08:reviseL1(0);break;//正在走直线
    case 0x04:reviseL1(1);break;//略微左偏
    case 0x10:reviseL1(2);break;//略微右偏
 case 0x02:reviseL1(3);break;//严重左偏
 case 0x20:reviseL1(4);break;//严重右偏
   }
   state1=0x40&PINA;
   if (state1==0x40)
   {
     delayms(20);
  if(state1==0x40);
 head1turnleft();
   }
}
 //****************循迹函数HEAD1寻右**************************//
 void inliner1()
 {
  uchar state1;
  switch(state1)
   {
    case 0x08:reviseL1(0);break;//正在走直线
    case 0x04:reviseL1(1);break;//略微左偏
    case 0x10:reviseL1(2);break;//略微右偏
    case 0x02:reviseL1(3);break;//严重左偏
 case 0x20:reviseL1(4);break;//严重右偏
   }
   state1=0x01&PINA;
   if (state1==0x01)
   {
    delayms(20);
 if(state1==0x01)
 head1turnright();
   }
 }
 //****************循迹函数HEAD2寻左**************************//
 void inlinel2()
 {
  uchar state1;
  state1=0X7e&PINC;
  switch(state1)
   {
    case 0x08:reviseL2(0);break;//正在走直
    case 0x10:reviseL2(1);break;//略微左偏
    case 0x04:reviseL2(2);break;//略微右偏
 case 0x20:reviseL2(3);break;//严重左偏
 case 0x02:reviseL2(4);break;//严重右偏
   }
   state1=0x01&PINC;
   if (state1==0x01)
   {
    delayms(20);
 if(state1==0x01)
 head2turnleft();
   }
 }
//****************循迹函数HEAD2寻右**************************//
 void inliner2()
 {
  uchar state1;
  state1=0X7e&PINC;
  switch(state1)
   {
    case 0x08:reviseL2(0);break;//正在走直线
    case 0x10:reviseL2(1);break;//略微左偏
    case 0x04:reviseL2(2);break;//略微右偏
 case 0x20:reviseL2(3);break;//严重左偏
 case 0x02:reviseL2(4);break;//严重右偏
   }
   state1=0x40&PINC;
   if (state1==0x40)
   {
    delayms(20);
 if(state1==0x40)
 head1turnright();
   }
 }
//*********************HEAD2前进函数**********************//
void forward2()
{
 while(1)
 { 
  PORTB=0x09;
     if((PIND&0X08)==0)
   {
    delayms(50);
 if((PIND&0X08)==0)
    forward1();
   }
  switch (count)
  {
    case 12:inliner2();break;
    case 23:inliner2();break;
    case 24:inliner2();break;
    case 25:inliner2();break;
 case 26:inliner2();break;
 case 33:inliner2();break;
 default:inlinel2();
  }
 }
}
//*********************HEAD1前进函数**********************//
void forward1()
{
  while(1)
 { 
   PORTB=0x06;
   if((PIND&0X04)==0)
   {
    delayms(50);
 if((PIND&0X04)==0)
 forward2();
   }
   switch (count)
  {
   case 5:inliner1();break;
   case 10:inliner1();break;
   case 11:inliner1();break;
   case 12:inliner1();break;
   case 22:inliner1();break;
   case 27:inliner1();break;
   case 31:inliner1();break;
   case 32:inliner1();break;
   default:inlinel1();
  }
 }
}   

//**********************主函数**************************//
void main()
{
delayms(50);
 DDRA  = 0x00;
 DDRB  = 0x0F;
 DDRC  = 0x00;
 DDRD  = 0x30;
 PORTA = 0x00;
 PORTB = 0x06;
 PORTC = 0x00;
 PORTD = 0x3c;
 init_devices();
 timer1_init();
 while(1)
 {
  forward2();
 }
}



⌨️ 快捷键说明

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