首页 小车跑迷宫,加记忆

小车跑迷宫,加记忆

举报
开通vip

小车跑迷宫,加记忆小车跑迷宫,加记忆 #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,我们尽快处理。
本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。
网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
下载需要: 免费 已有0 人下载
最新资料
资料动态
专题动态
is_977556
暂无简介~
格式:doc
大小:42KB
软件:Word
页数:21
分类:生活休闲
上传时间:2018-02-08
浏览量:21