📄 car01.c
字号:
#include"reg51.h"
sbit p20=P2^0;sbit p21=P2^1;sbit p22=P2^2;sbit p23=P2^3;
//1车P20=1A,P21=1B,P23=2A,P22=2B,2车p20=1A,P21=1B,P22=2A,P23=2B;
sbit left=P3^6;//左寻
sbit right=P3^7;//右寻
sbit zhong=P3^5;//黑线探测p35;
sbit qian=P1^6;//前避障
sbit you=P1^7;//右避障
sbit p15=P1^5;
sbit p27=P2^7;
sbit p32=P3^2;
sbit p26=P2^6;//fmq
sbit jichu=P1^4; //按键切换功能 接地 直走 接空壁障 或停车
unsigned char flag_left_or_right,flag_along_right,flag_chaoche,flag_stop,flag_bizhang,flag_xunji_zhuan;//1--left;2--right;
bit flag_change=0,flag_start=0,flag_ok=0;
unsigned int flag=0,timer=0;
unsigned int n;
//****************************************************************************************************************//
void delay1ms()
{
unsigned char i,j;
for(i=0;i<10;i++)
for(j=0;j<33;j++)
;
}
void delay(unsigned int n)//
{
unsigned int i;
for(i=0;i<n;i++)
delay1ms();
}
void send232byte(unsigned char bytebuf)
{
SBUF=bytebuf;
while(!TI);
TI=0;
}
//****************************************************************************************************************//
//****************************************************************************************************************//
void turn_left(void) { p20=0;p21=0;p22=1;p23=0; }//左转
void turn_right(void) { p20=1;p21=0;p22=0;p23=0; }//右转
void turn_cleft(void) { p20=0;p21=1;p22=1;p23=0; }//左原地转
void turn_cright(void) { p20=1;p21=0;p22=0;p23=1; }//右原地转
void go_along(void) { p20=1;p21=0;p22=1;p23=0; }//直走
void go_back(void) { p20=0;p21=1;p22=0;p23=1; }//后
void stop(void) { p20=0;p21=0;p22=0;p23=0; }//停止
void go_along_right(void) { go_along();delay(14);turn_right();delay(2); }//偏右直走
void go_along_slow_r(void) { go_along();delay(9);stop();delay(20); }//低直走(避障用到)
void go_back_slow(void) { go_back();delay(10);stop();delay(25); }//低速后(避障用到)
void go_along_left(void) { go_along();delay(10);turn_left();delay(1); }
void turn_left_go(void) { turn_cleft();delay(1);turn_left();delay(7); }//
void turn_left_go1(void) { turn_cleft();delay(3);stop();delay(6);turn_left();delay(5); }
void turn_left_go_low(void) {turn_cleft();delay(4);stop();delay(8);turn_left();delay(5);stop();delay(1);}
void turn_left_tan(void) {turn_cleft();delay(3);turn_left();delay(10);stop();delay(2);}//低弹
void turn_right_go(void) { turn_cright();delay(4);turn_right();delay(7);}//
void go_along_right_lowlow(void){go_along();delay(3);stop();delay(9);turn_right();delay(2);stop();delay(9);}
void turn_right_go_verylow(void){turn_cright();delay(2);stop();delay(9);turn_right();delay(7);stop();delay(9);}
void turn_left_verylow(void){turn_left();delay(6);stop();delay(20);}
void turn_left_low(void) { turn_left_go();delay(10);stop();delay(8); }
//****************************************************************************************************************//
void zhuanwan4(void)//4步拟合曲线
{
go_along();delay(240);turn_left_low();delay(85);stop();delay(100);
go_along();delay(240);stop();delay(50);turn_left_go();delay(160);
go_along();delay(130);stop();delay(50);turn_left_go();delay(160);
go_along();delay(100);stop();delay(50);turn_left_go();delay(100);
while((right!=1)&&(left!=1)){go_along();}stop();delay(50);go_back();delay(50);turn_left_go();delay(10);
}
void zhuanwan3(void)//3步拟合曲线
{
go_along();delay(280);turn_left_go();delay(70);stop();delay(60);
go_along();delay(200);stop();delay(50);turn_left_go();delay(200);
go_along();delay(130);stop();delay(50);turn_left_go();delay(180);
while(right!=1){go_along();}stop();delay(50);go_back();delay(50);turn_left_go();delay(10);
}
void xunji_bizhang_normal(void)//避障走法正常循迹
{
if(left==0&&right==0)
{
go_along_right();
}
if(left==0&&right==1)
{
turn_left_go1();
}
if(left==1&&right==0)
{
turn_right_go();
}
if(left==1&&right==1)
{
go_along_right();
}
}
void xunji_bizhang_low_speed(void)//低速避障循迹
{
if(left==0&&right==0)
{
go_along_right();delay(5);stop();delay(95);
}
if(left==0&&right==1)
{
turn_left_go_low();
}
if(left==1&&right==0)
{
turn_right_go();
}
if(left==1&&right==1)
{
go_along_right();delay(5);stop();delay(95);
}
}
void xunji_bizhang_chaoche_over(void)//超车结束后特殊循迹
{
if(left==0&&right==1)
{
turn_left_go_low();
}
if(right==0)
{
go_along();delay(15);stop();delay(85);
}
if(left==1&&right==1)
{
go_along();delay(15);stop();delay(85);
}
}
void chaoche_bizhang(void)//避障动作
{
flag_bizhang=1;
while(qian!=1) {turn_left();delay(27);stop();delay(30);}
stop();delay(500);
go_along();delay(600);
stop();delay(500);
while(you!=1) //如果有再直走;
{go_along_slow_r();} stop();delay(500);
while(you==1)//转到有
{turn_right();delay(39);stop();delay(60);}stop();delay(500);
while(you!=1)//转到没有
{turn_right();delay(40);stop();delay(60);}stop();delay(500);
while(you==1)//走到有
{go_along_slow_r();} stop();delay(500);
while(you!=1)//走到没有
{go_along_slow_r();} stop();delay(500);
while(you==1)//退到有
{go_back_slow();} stop();delay(500);
while(you!=1)//转到没有
{turn_right();delay(30);stop();delay(70);}stop();delay(500);
go_along();delay(500);
stop();delay(500);
turn_left();delay(80);
stop();delay(500);
flag_xunji_zhuan=1;
flag_bizhang=0;
}
void xunji_bizhang(void)//避障走法循迹函数
{
if(zhong==0)
{
if(jichu==0)
{
xunji_bizhang_normal();
}
if(jichu==1)
{
if(flag_chaoche==0)
{
xunji_bizhang_normal();
}
if(flag_chaoche==1)
{
if(flag_xunji_zhuan==0)
{
xunji_bizhang_low_speed();
if(qian==0)
{
chaoche_bizhang();
}
}
if(flag_xunji_zhuan==1)
{
xunji_bizhang_chaoche_over();
}
}
}
}
if(zhong==1) flag++;
if(flag_stop==1)
{
stop();delay(5000);flag_stop=0;flag_chaoche=0;
}
}
//***********************************************************************************************************//
//***********************************************************************************************************//
void xunji_stop_normal(void)//停车走法循迹
{
if(left==0&&right==0)
{
go_along_right();
}
if(left==0&&right==1)
{
turn_left_go_low();
}
if(left==1&&right==0)
{
turn_right_go();
}
if(left==1&&right==1)
{
go_along_right();
}
}
void xunji_stop_low_speed(void)//停车走法低速循迹
{
if(left==0&&right==0)
{
go_along_right();delay(5);stop();delay(95);
}
if(left==0&&right==1)
{
turn_left_go_low();
}
if(left==1&&right==0)
{
turn_right_go();
}
if(left==1&&right==1)
{
go_along_right();delay(5);stop();delay(95);
}
}
void xunji_very_low_speed(void)//停车区超低速走
{
if(left==0&&right==0)
{
go_along_right_lowlow();delay(2);stop();delay(98);
}
if(left==0&&right==1)
{
turn_left_verylow();
}
if(left==1&&right==0)
{
turn_right_go_verylow();
}
if(left==1&&right==1)
{
go_along_right_lowlow();delay(2);stop();delay(98);
}
// if(flag_ok==1){stop();delay(5000);flag_chaoche=0;flag_stop=0;}
}
void xunji_stop(void)//停车走法循迹函数
{
if(zhong==0)
{
if(jichu==0)
{
xunji_stop_normal();
}
if(jichu==1)
{
if(flag_chaoche==0)
{
xunji_stop_normal();
}
if((flag_chaoche==1)&&(flag_stop!=1))
{
xunji_stop_low_speed();
}
if((flag_chaoche==1)&&(flag_stop==1))
{
xunji_very_low_speed();
}
}
}
if(zhong==1) flag++;
}
//***********************************************************************************************************//
void TIMER0_ROUTINE(void) interrupt 1
{
timer++;
TH0=0x4c; //周期50MS
TL0=0x00;
if(timer==180){timer=0;TR0=0;ET0=0;flag_stop=1;}
}
void ri_inter() interrupt 4 using 1
{
unsigned char key;
RI=0;
key=SBUF;
if(key==3) {flag_ok=1;flag_chaoche=0;flag_stop=0;}
if(key==2) {flag_start=1;}
}
void main()
{
TMOD=0x21;
SCON=0x50; //8 bit
TL1=0xfd; //9600
TH1=0xfd;
TR1=1;
ES=1;
EA=1;//
flag=0;
while(1)
{
if(flag_change==0){xunji_stop(); } //停车标志 等待 超车函数
if(flag_change==1){xunji_bizhang(); } // 在超车区壁障超车
switch(flag)
{
case 0:break;
case 1:stop();delay(2000); //开始停车时间
if(flag_change==0){send232byte(2);delay(50);}
go_along_right();delay(50);flag++;break;//1
case 2:break;
case 3:stop();delay(50);zhuanwan4();flag++;break;//2
case 4:break;
case 5:stop();delay(50);zhuanwan4();flag++;break;//3
case 6:break;
case 7:go_along();delay(100);zhuanwan3();flag++;break;//4
case 8:while(right!=1){go_along();}stop();delay(50);go_back();delay(40);turn_left();delay(40);
flag_chaoche=1;
if(flag_change==0){ TH0=0x4c;TL0=0x00;TR0=1;ET0=1;}
flag++;break;//
case 9:break;
case 10:flag_chaoche=0;flag_xunji_zhuan=0;stop();delay(50);zhuanwan3();flag++;break;//5
case 11:break;
case 12:stop();delay(1000);if(flag_change==1){send232byte(3);delay(50);}flag=2;flag_change=!flag_change;break;//6
default:while(1){stop();delay(50);}break;
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -