您好,欢迎访问三七文档
/*机器人擂台赛51程序*****************************************//*使用芯片:AT89S52或者STC89C52或AT89S51STC89C51*//*晶振:11.0592MHZ****************************************//*编译环境:Keil*************************************//*作者:wangzhianyuhao******************************//*时间:20120526*************************************//*机器人底座四个角下面各有一个灰度传感器,正前面对称安装两个红外传感器,后面,左面右面个一个传感器*//*电机电压为12V直流减速电机,驱动为L298N模块*//*程序应尽量避免电机转向的突然变化,电机为高速蜗杆减速电机,转速高,电压高,突然转向容易闪火花,烧坏电机*/#includereg52.h#defineucharunsignedchar#defineuintunsignedint#defineconP0ucharsj,sec,count;ucharsj1,sec1,count1;ucharsj2,sec2,count2;ucharsj3,sec3,count3;ucharsj4,sec4,count4;ucharsj5,sec5,count5;uinta,b,m;/*==============机器人电路接线图=====================*//*四个灰度传感器,从左到右,序号从0到3,为P2口的低四位,遇到遮挡物返回为低电平*/sbitf0=P2^7;sbitf1=P2^6;sbitf2=P2^5;sbitf3=P2^4;/*五个红外传感器,从左到右,序号从0到3,为P2口的高四位,检测到目标后返回是低电平*/sbitf4=P2^3;sbitf5=P2^2;sbitf6=P2^1;sbitf7=P2^0;intz[]={0xa0,0x50,0x90,0x60,0xe5,0xb5,0xad,0xa7,0xda,0x7a,0x5e,0x5b};//z[0]前进0xaa,二进制为10101010//z[1]后退0x55,二进制为01010101//z[2]左转0x5a,二进制为01101010//z[3]右转0xa5,二进制为10100101//z[4]沿左后轮顺时针转0xe5,二进制为11100101//z[5]沿左前轮顺时针转0xb5,二进制为10110101//z[6]沿右前轮顺时针转0xad,二进制为10101101//z[7]沿右后轮顺时针转0xa7,二进制为10100111//z[8]沿左后轮逆时针转0xda,二进制为11011010//z[9]沿左前轮逆时针转0x7a,二进制为01111010//z[10]沿右前轮逆时针转0x5e,二进制为01011110//z[11]沿右前轮逆时针转0x5b,二进制为01011011inthdjc();//灰度检测inthwjc();//红外检测voidzttz();//姿态调整voidxzsm();//扫描voidxzsm1();//旋转扫描voidjingong();//进攻voiddelay(uinti);voidmain(){m=0;sec1=2;//一秒count1=0;//1代表10微秒,sj1=20*sec1+count1;//左转时间sec2=2;count2=0;sj2=20*sec2+count2;//前进时间sec3=2;count3=0;sj3=20*sec3+count3;//扫描前进时间sec4=3;count4=0;sj4=20*sec4+count4;//扫描旋转时间sec5=1;count5=10;sj5=20*sec5+count5;//扫描旋转时间TMOD=0x01;IE=0x82;TH0=(65536-50000)/256;TL0=(65536-50000)%256;//左转45度/*con=z[2];count=0;sec=0;//秒置0TR0=1;//定时器1开始工作do{a=hdjc();//灰度检测b=hwjc();//红外检测sj=sec*20+count;}while((a==0)&&((b==0)||(b==4))&&(sj=sj1));TR0=0;//定时器1停止工作*///前进到擂台中间con=z[0];count=0;sec=0;//秒置0TR0=1;//定时器1开始工作do{a=hdjc();//灰度检测b=hwjc();//红外检测sj=sec*20+count;}while((a==0)&&(b==0)&&(sj=sj2));TR0=0;//定时器1停止工作a=hdjc();b=hwjc();while(1){if((a==0)||(a==5)||(a==8)){if(b==0)xzsm();//未遇到边沿,未遇到敌人,旋转扫描elseif((b==1)||(b==2))xzsm1();elseif((b==3)||(b==4))jingong();//遇到敌人,进攻}elsezttz();//遇到边沿,但没发现敌人,调整姿态}}voiddelay(uinti){uintx,y;for(x=i;x0;x--)for(y=110;y0;y--);}//灰度检测inthdjc(){inti=0;if((f3==0)&&(f2==0)&&(f1==0)&&(f0==1))i=1;//0001,左后遇到边沿if((f3==0)&&(f2==0)&&(f1==1)&&(f0==0))i=2;//0010,左前遇到边沿if((f3==0)&&(f2==0)&&(f1==1)&&(f0==1))i=6;//0011,左边两个都遇到边沿if((f3==0)&&(f2==1)&&(f1==0)&&(f0==0))i=3;//0100,右前遇到边沿if((f3==0)&&(f2==1)&&(f1==1)&&(f0==0))i=8;//0110,前面两个都遇到边沿if((f3==1)&&(f2==0)&&(f1==0)&&(f0==0))i=4;//1000,右后遇到边沿if((f3==1)&&(f2==0)&&(f1==0)&&(f0==1))i=5;//1001,后面两个都遇到边沿if((f3==1)&&(f2==1)&&(f1==0)&&(f0==0))i=7;//1100,右边都两个遇到边沿return(i);}//红外检测inthwjc(){inti=0;if(f5==0)i=3;else{if(f4==0)i=1,m=1;if(f6==0)i=2,m=2;}if(f7==0)i=4;return(i);}//旋转扫描函数voidxzsm(){intj,k;j=0;k=0;do{//前进扫描if(j=1){if(a==0)con=z[0];if(a==5)con=z[0];elseif(a==8)con=z[1];}elsej++;/*{con=z[1];j++;}elsecon=z[0];*/count=0;sec=0;//秒置0TR0=1;//定时器1开始工作do{a=hdjc();//灰度检测b=hwjc();//红外检测sj=sec*20+count;//计时}while((a==0)&&(b==0)&&(sj=sj3));//发现边沿,敌人,到达定时,则跳出TR0=0;//定时器1停止工作if((a==0)&&(b==0)){con=z[3];count=0;//100毫秒置0sec=0;//秒置0TR0=1;do{a=hdjc();//灰度检测b=hwjc();//红外检测sj=sec*20+count;//计时}while((a==0)&&(b==0)&&(sj=sj4));//发现边沿,敌人,到达定时,则跳出TR0=0;//定时器1停止工作}}while(((a==0)||(a==5)||(a==8))&&(b==0));//发现边沿,敌人,则跳出}voidxzsm1(){if(m==1)con=z[2];elseif(m==2)con=z[3];count=0;//100毫秒置0sec=0;//秒置0TR0=1;do{a=hdjc();//灰度检测b=hwjc();//红外检测sj=sec*20+count;//计时}while((a==0)&&(b!=0)&&(b!=3)&&(b!=4)&&(sj=sj5));//发现边沿,敌人,到达定时,则跳出TR0=0;//定时器1停止工作if(sjsj5)do{con=0x00;}while(!((f4==1)&&(f6==1)));}//姿态调整函数voidzttz(){do{switch(a){case1:con=z[0];delay(400);con=z[3];delay(400);con=z[0];break;//前进,右转,后退case2:con=z[1];delay(400);con=z[2];delay(400);con=z[1];break;//后退,左转,前进case3:con=z[1];delay(400);con=z[3];delay(400);con=z[1];break;//后退,右转,前进case4:con=z[0];delay(400);con=z[2];delay(400);con=z[0];break;//前进,左转,后退case6:con=z[3];delay(900);con=z[1];break;case7:con=z[2];delay(900);con=z[1];break;}a=hdjc();b=hwjc();}while((a!=0)&&(a!=5)&&(a!=8));//调整姿态,正对边沿跳出}//进攻函数voidjingong(){do{switch(b){case3:con=z[0];break;case4:con=z[1];break;}a=hdjc();b=hwjc();}while((a==0)&&((b==3)||(b==4)));}voidtimer0()interrupt1using1{TH0=(65536-50000)/256;TL0=(65536-50000)%256;count++;if(count==20){count=0;sec++;if(sec==60)sec=0;}}
本文标题:小车擂台
链接地址:https://www.777doc.com/doc-5496554 .html