小车跑迷宫,加记忆小车跑迷宫,加记忆
#include
#include
#include
/////////////////////////////////////////////////////////////////
char pro_left,pro_right,i,j; //左右占空比标志 extern int a[30]={2}; extern int n=2,logo=0;
////////////////////////////////////////////////////////////////...
小车跑迷宫,加记忆
#include
#include
#include
/////////////////////////////////////////////////////////////////
char pro_left,pro_right,i,j; //左右占空比标志 extern int a[30]={2}; extern int n=2,logo=0;
//////////////////////////////////////////////////////////////////
sbit left1=P0^0; //左电机正反转
sbit left2=P0^1;
sbit right1=P0^2; //右电机正反转
sbit right2=P0^3;
sbit en1=P0^4; //输出PWM1波控制左电机 sbit en2=P0^5; //输出PWM2波控制左电机
/////////////////////////////////////////////////////////////////
sbit left_turn=P1^0; //左侧传感器(识别路口) sbit left=P1^2; //微调左位置
sbit midb=P1^5; //后中间传感器(识别路口) sbit midf=P1^3; //前中间(识别路口) sbit right=P1^1; //微调右位置
sbit right_turn=P1^4; //右侧传感器(识别路口) //////////////////////////////////////////////////////////////////
sbit p26=P2^6; //左拐
sbit p24=P2^4; //直走
sbit p22=P2^2; //右拐
void first_straight(); //启动直走
void straight(); //直走
void draw_back(); //后退
void sd_straight(); //左岔直走
void stop(); //终点稍停
void end(); //回到起点停车
void wleft(); //左微调
void wright(); //右微调
void ft_left(); //左转90 由黑到白 void sd_left(); //左转90 由白到黑
void ft_right(); //右转90 由黑到白 void sd_right(); //右转90 由白到黑 void ft_180rt(); //左转180 由黑到白 void sd_180rt(); //左转180 由白到黑
//////////////////////////////////////////////////////////////////
void infrared(); //初次循迹
void comeback(); //返航
void memory(int x); //记忆
void delay(int z); //延时1ms
void comeback(); //回家
//////////////////////////////////////////////////////////////////
void delay(int z) //延时z*1ms {
char k;
while(z--)
{for(k=0;k<121;k++);} //延时1ms}
//////////////////////////////////////////////////////////////////
void first_straight() //启动走直线 {
p22=1;
p24=0;
p26=1;
pro_left=90;
pro_right=90;
left1=1;
left2=0;
right1=1;
right2=0;
delay(5);
}
//////////////////////////////////////////////////////////////////
void m_straight() //慢走直线 {
p22=1;
p24=0;
p26=1;
pro_left=60; pro_right=60; left1=1;
left2=0;
right1=1;
right2=0;
}
//////////////////////////////////////////////////////////////////
void straight() //走直线函数 {
p22=1;
p24=0;
p26=1;
pro_left=70; pro_right=70; left1=1;
left2=0;
right1=1;
right2=0;
}
//////////////////////////////////////////////////////////////////
void draw_back() //后退函数 {
p22=0;
p24=0;
p26=1;
pro_left=60; pro_right=60; left1=0;
left2=1;
right1=0;
right2=1;
}
//////////////////////////////////////////////////////////////////
void sd_straight() //右岔走直线函数
{
p22=1;
p24=0;
p26=1;
straight();
if((right_turn==1))//&&(left_turn==0)&&(midf==1)
{sd_straight();} else
{
straight();
}
}
//////////////////////////////////////////////////////////////////
void wleft() //微调右转函数,偏左 {
pro_left=75;
pro_right=20;
left1=1;
left2=0;
right1=1;
right2=0;
}
//////////////////////////////////////////////////////////////////
void wright() //微调左转函数,偏右 {
pro_left=20;
pro_right=75;
left1=1;
left2=0;
right1=1;
right2=0;
}
//////////////////////////////////////////////////////////////////
void ft_left() //左转90 由黑到白 {
p22=0;
p24=1;
p26=1;
pro_left=0;
pro_right=90;
left1=0; //左轮不动
left2=0; //右轮动
right1=1;
right2=0;
if(midf==1)
{
ft_left();
}
else
{sd_left();}
}
void sd_left() //左转90 由白到黑 {
p22=0;
p24=1;
p26=1;
pro_left=0;
pro_right=90;
left1=0; //左轮不动
left2=0; //右轮动
right1=1;
right2=0;
if(midf==0)
{
sd_left();
}
else
{
straight();
}
}
//////////////////////////////////////////////////////////////////
void ft_right() //右转90 由黑到白
{
p22=1;
p24=1;
p26=0;
pro_left=90;
pro_right=0;
left1=1; //左轮动
left2=0; //右轮不动
right1=0;
right2=0;
if(midf==1)
{ft_right();} else
{sd_right();} }
void sd_right() //右转90 由白到黑
{
p22=1;
p24=1;
p26=0;
pro_left=90;
pro_right=0;
left1=1; //左轮动
left2=0; //右轮不动
right1=0;
right2=0;
if(midf==0)
{sd_right();} else
{
straight();
}
}
//////////////////////////////////////////////////////////////////
void ft_180rt() //左转 由黑到白
{
p22=0;
p24=0;
p26=0;
pro_left=80;
pro_right=80;
left1=0; //左轮反转
left2=1; //右轮正转
right1=1;
right2=0;
if(midf==0)
{ft_180rt();} else
if(midf==1)
{sd_180rt();}
}
void sd_180rt() //左转 由白到黑 {
p22=0;
p24=0;
p26=0;
pro_left=80;
pro_right=80;
left1=0; //左轮反转
left2=1; //右轮正转
right1=1;
right2=0;
if(midf==1)
{sd_180rt();}
else
{
straight();
}
}
//////////////////////////////////////////////////////////////////
void stop() //停止
{
p22=0;
p24=0;
p26=0;
pro_left=0;
pro_right=0;
left1=0; //或是全等于1
left2=0;
right1=0;
right2=0;
}
//////////////////////////////////////////////////////////////////
void end() //单程刹车
{
pro_left=0;
pro_right=0;
left1=0; //或是全等于1
left2=0;
right1=0;
right2=0;
delay(1000);
}
//////////////////////////////////////////////////////////////////
void infrared() //循迹
{
char flag=7;
p22=1;
p24=1;
p26=1;
if((left_turn==0)&&(right_turn==0)&&(midf==1)&&(midb==1)&&(left==0)&&(right==0))
{flag=7;} //memory(2);直线
else
if((left_turn==0)&&(right_turn==0)&&(midf==0)&&(midb==0)&&(left==0)&&(right==0))
{flag=8;} // memory(0); 死胡同
else
if((left_turn==1)&&(right_turn==0)&&(midf==0)&&(midb==1))
{flag=3;} //memory(1);左拐
else
if((left_turn==1)&&(right_turn==0)&&(midf==0)&&(midb==0))
{flag=13;} //误认为左拐 左拐
else
if((left_turn==0)&&(right_turn==1)&&(midf==0)&&(midb==1))
{flag=1;} //memory(3); 右拐
else
if((left_turn==0)&&(right_turn==1)&&(midf==0)&&(midb==0))
{flag=11;} //误认为右拐 右拐
else
if((left_turn==0)&&(right_turn==1)&&(midf==1)&&(midb==1))
{flag=2;} //memory(2); 右岔,直走
else
if((left_turn==0)&&(right_turn==1)&&(midf==1)&&(midb==0))
{flag=12;} //误认为右岔 直走
else
if((left_turn==1)&&(right_turn==1)&&(midf==0)&&(midb==1))
{flag=3;} //memory(1); 丁字 左拐
else
if((left_turn==1)&&(right_turn==1)&&(midf==0)&&(midb==0))
{flag=13;} //误认为丁字 左拐
else
if((left_turn==1)&&(right_turn==0)&&(midf==1)&&(midb==1))
{flag=3;} //memory(1); 左岔
else
if((left_turn==1)&&(right_turn==0)&&(midf==1)&&(midb==0))
{flag=13;} // 误认为左岔 左拐
else
if((left_turn==1)&&(right_turn==1)&&(midf==1)&&(midb==1))
{flag=3; } //memory(1); 十字 左拐
else
if((left_turn==1)&&(right_turn==1)&&(midf==1)&&(midb==0))
{flag=13; } //误判十字 左拐
else
if((left_turn==1)&&(right_turn==1)&&(midf==1)&&(midb==1)&&(left==1)&&(right==1))
{flag=0;} //memory(0); 终点
else
if((left_turn==0)&&(right_turn==0)&&(left==0)&&(right==1))
{flag=5;} //左偏(right)
else
if((left_turn==0)&&(right_turn==0)&&(left==1)&&(right==0))
{flag=6;} //右偏(left)
else
{flag=9;} //直走
switch (flag)
{
case 0:
p22=0;
p24=0;
p26=0;
end();
ft_180rt();
memory(0);
logo=1;
break; //p17=0;p16=0;终点 两个灯全亮
case 1:
ft_right();
memory(3);
break; //右拐
case 2:
sd_straight();
memory(2);
break; //直走
case 3:
ft_left();
memory(1);
break; //左拐
case 4:
ft_180rt();
memory(4);
break; //死胡同
case 5:
wright();
break; //左偏
case 6:
wleft();
break; //右偏
case 7:
first_straight();
straight();
break; //直走
case 8:
ft_180rt();
break; //停止
case 9:
first_straight();
m_straight();
break; //慢走
case 11:
ft_right();
break; //误认为右
case 12:
straight();
break; //误认为直
case 13:
ft_left();
break; //误认为左
default:
straight();
break; //
}
}
//////////////////////////////////////////////////////////////////
void memory(int mflag) //记忆程序 {
if(mflag==1)
{
a[n]+=1;
if(a[n]==4)
{
a[n]=0;
n=n-2;
}
n++;
}
else
if(mflag==2)
{
a[n]+=2;
n++;
}
else
if(mflag==3)
{
a[n]+=3;
if(a[n]==4)
{
a[n]=0;
n=n-2;
}
n++;
}
else
if(mflag==4)
{
a[n]=0;
--; n
}
else
if(mflag==0)
{
n--;
}
}
//////////////////////////////////////////////////////////////////
void comeback()
{
p22=0;
p24=0;
p26=0;
if((left_turn==0)&&(right_turn==0)&&(midf==1)&&(midb==1)&&(left==0)&&(right==0))
{ straight();logo=1;} //直线 else
if((right_turn==1)&&(midb==1)) //右边有路
{
switch(a[n])
{
case 1: ft_right();
logo=1;
n--;
break;
case 2: sd_straight();
logo=1;
n--;
break;
case 3: ft_left();
logo=1;
n--;
break;
}
}
else
if((left_turn==1)&&(midb==1)) //左边有路
{
switch(a[n])
{
case 1: ft_right();
logo=1;n--;
break;
case 2: sd_straight();
logo=1;n--;
break;
case 3: ft_left();
logo=1;n--;
break;
}
}
else
if((left_turn==0)&&(right_turn==0)&&(midf==0)&&(midb==0)&&(left==0)&&(right==0))
//&&(n==1)
{p22=1;p24=1;p26=1;stop();} //回到起点 两个灯全灭 else
if((left_turn==0)&&(right_turn==0)&&(left==0)&&(right==1))
{wright();logo=1;} //左偏(motor_right) else
if((left_turn==0)&&(right_turn==0)&&(left==1)&&(right==0))
{wleft();logo=1;} //右偏(motor_left) else
{straight();logo=1;}
}
//////////////////////////////////////////////////////////////////
void init()
{
TMOD=0x01;
TH0=(65536-100)/256;
TL0=(65536-100)%256;
EA=1; //中断总开关
ET0=1; //开启定时器0
TR0=1; //定时器0启动
en1=1; //使能1端
en2=1; //使能2端
}
//////////////////////////////////////////////////////////////////
void time0(void)interrupt 1 {
i++;
j++;
if(i<=pro_left) {en1=1;}
else en1=0;
if(i==100) {en1=~en1;i=0;} if(j<=pro_right) {en2=1;}
else en2=0;
if(j==100) {en2=~en2;j=0;} TH0=(65536-100)/256; TL0=(65536-100)%256; }
//////////////////////////////////////////////////////////////////
void main(void)
{
init();
delay(1);
logo==0;
while(1)
{
if(logo==0)
{
infrared();
}
if(logo==1)
{
comeback();
}
}
}
本文档为【小车跑迷宫,加记忆】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑,
图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
该文档来自用户分享,如有侵权行为请发邮件ishare@vip.sina.com联系网站客服,我们会及时删除。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。
本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。
网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。