📄 单片机智能小车寻迹.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 + -