当前位置:文档之家› 2011年全国大学生电子设计竞赛C类小车 乙车程序

2011年全国大学生电子设计竞赛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 jichu=P1^4; //按键切换功能 接地 直走 接空壁障 或停车
sbit p15=P1^5;
sbit p27=P2^7;
sbit p32=P3^2;
sbit p26=P2^6;//fmq

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;
unsigned int t;
//**********************************************************************************************************//
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;idelay1ms();
}
/*
void delay100us()
{
unsigned char j;
for(j=0;j<33;j++)
;
}void delayus(unsigned int n)//
{
unsigned int i;
for(i=0;idelay100us();
}*/

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(10);stop();delay(20); }
void go_back_slow(void) { go_back();delay(10);stop();delay(25); }
void turn_left_go(void) { turn_cleft();delay(3);turn_left();delay(7); }
void turn_left_go_low(void) {turn_cleft();delay(4);stop();delay(1);turn_left();delay(5);stop();delay(1);}
void turn_right_go(void) { turn_cright();delay(4);turn_right();delay(7);}
void turn_left_low(void) { turn_left_go();delay(14);stop();delay(8); }
void turn_left_go1(void) { turn_cleft();delay(3);stop();delay(6);turn_left();delay(5); }

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 go_along_left(void) { go_along();delay(10);turn_left();delay(1); }
//void turn_right_low(void) { turn_right_go();delay(14);stop();delay(8); }
//************

********************************************************************************************//
//********************************************************************************************************//
void xunji_bizhang_normal(void)//避障走法正常循迹
{
if(left==0&&right==0)
{
go_along_right();
}
if(left==0&&right==1)
{
turn_left_go();
}
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();}
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(40);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(40);stop();delay(60);}stop();delay(500);
go_along();delay(500);
stop();delay(500);
turn_left();delay(110);
stop();delay(1000);
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);
}
}
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++;
// if(flag_stop==1) {stop();delay(10000);flag_stop=0;flag_chaoche=0;}
}
//*********************************************************************************************************//
void zhuanwan4(void)//4步拟合曲线
{
go_along();delay(260);turn_left_low();delay(150);
go_along();delay(200);stop();delay(50);turn_left_go();delay(200);
go_along();delay(130);stop();delay(50);turn_left_go();delay(170);
go_along();delay(100);stop();delay(50);turn_left_go();delay(150);
while((right!=1)&&(left!=1)){go_along();}
stop();delay(50);go_back();delay(50);
}
void zhuanwan3(void)//3步拟合曲线
{
go_along();delay(300);turn_left_low();delay(150);
go_along();delay(200);stop();delay(50);turn_left_go();delay(200);
go_along();delay(130);stop();delay(50);turn_left_go();delay(200);
while(right!=1){go_along();}stop();delay(50);go_back();delay(50);turn_left_go();delay(70);
}
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
{
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;p27=0;}
}
void main()
{
TMOD=0x21;
SCON=0x50; //8 bit
TL1=0xfd; //9600
TH1=0xfd;
TR1=1;
ES=1;
EA=1;//
flag=

0;

while(flag_start==0)
{
t++;delay(100);
if(t==65) // 启动保护 定时 6S 自启动
{ t=0;
flag_start=1;
}
}
flag_start=0;

while(1)
{
if(flag_change==1){xunji_stop(); }
if(flag_change==0){xunji_bizhang(); }
switch(flag)
{
case 0:break;
case 1:stop();delay(4500); //开始停车时间 3S
if(flag_change==1){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==1){ 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==0){send232byte(3);delay(50);}flag=2;flag_change=!flag_change;break;//6
default:while(1){stop();delay(50);}break;
}

}
}


相关主题
文本预览
相关文档 最新文档