/*----------------------- 循迹小车程序设计 ------------------------*/ #include #define uint unsigned int #define uchar unsigned char sbit p1_0=P1^0; //FPGA接口 sbit p1_1=P1^1;//FPGA接口 sbit p1_2=P1^2;//FPGA接口 sbit p1_3=P1^3;//FPGA接口 sbit p3_7=P3^7;//接FPGA选通鸣叫与音乐 sbit p3_6=P3^6;//鸣叫后启动电机控制口 uint count,count1; uchar cnt,cnt1,cnt2,cnt3,sec,sec1;//均用来计数 void delay(uint z)延时ms子函数 { uint i,j; for(i=z;i>0;i--) for(j=114;j>0;j--); } void delay1s(uint z)//延时zs子函数 { uint i; for(i=z;i>0;i--) delay(1000); } void init()//定时器0控制小车走出起点,定时器1控制小车走的距离 { TMOD=0x11; TH0=0X3C; TL0=0XB0; TH1=0X3C; TL1=0XB0; EA=1; TR0=1; ET0=1; ET1=1; sec=0; sec1=0; cnt1=0; cnt2=0; cnt3=0; } void main() { init(); count=P1&0x0f; P2=0x00;//单片机反馈给FPGA的信号(P2口低四位),让FPGA控制液晶显示小车状态 while(p3_6==1);//该脚接FPGA,这是FPGA反馈给单片机的信号脚 delay(50); P0=0x05;P2=0x03;//0x05是控制电机前进,0x03送给FPGA控制1602显示 delay(600); //往前冲 while(1) { if(sec1<=2)//走过斑马线后计时,增大抗干扰能力 { if((sec<15)||(sec>20))//这一段时间里没有十字路口和斑马线 { count=P1&0x0f; switch(count)//传感器接侧到的信号 { case 0:P0=0x0a;P2=0x04;break;//P0口低四位控制电机驱动电路 case 1:P0=0x07;P2=0x01;delay(100);break;//0x07是左转,延时100ms就是让他大角度转弯,下面是小角度转弯 case 3:P0=0x07;P2=0x01;delay(20);break; case 15: { if(cnt2==1) //此时检测到的是斑马线 { P0=0x0d;//右转弯纠正小车位置 delay(50); P0=0x05;P2=0x03;//往前走 delay(600); cnt3+=1; if(cnt3==2)//如果2次检测到斑马线就启动定时器 TR1=1; } else P0=0x05;P2=0x03;//否则只管往前 }break; case 6: case 14:P0=0x05;P2=0x03;break;//往前 case 7: case 10: case 4: case 2: case 5:P0=0x05;P2=0x03;break;//往前 case 12:P0=0x0d;P2=0x02;delay(20);break;//小幅度左拐弯 case 8:P0=0x0d;P2=0x02;delay(100);break;/大幅度左拐弯 } } else//另外的情况处理如下,与上类似 { count=P1&0x0f; switch(count) { case 0:P0=0x0a;break; case 1:P0=0x07;P2=0x01;delay(60);break; case 3:P0=0x07;P2=0x01;delay(20);break; case 9: case 11: case 13: case 15:P0=0x05;P2=0x03;delay(10);cnt1=cnt1+1; if(cnt1==1||2) //此时检测到的是十字路口 { P0=0x06;P2=0x01; delay1s(1); delay(20); cnt2=1; } else P0=0x05; break; case 7: case 14: case 6: case 10: case 4: case 2: case 5:P0=0x05;P2=0x03;break; case 12:P0=0x0d;P2=0x02;delay(20);break; case 8: P0=0x09;P2=0x04;delay(100);break; } } } else //过了斑马线的处理程序 { count=P1&0x0f; if(count==15) { P0=0x0a;P2=0x04;delay(2); P0=0xff;P2=0x05; p3_7=0;while(1); } else { count=P1&0x0f; switch(count) { case 0:P0=0x0a;P2=0x04;break; case 1:P0=0x07;P2=0x01;delay(100);break; case 3:P0=0x07;P2=0x01;delay(20);break; case 15:P0=0x05;P2=0x03;break; case 6: case 14:P0=0x05;P2=0x03;break; case 7: case 10: case 4: case 2: case 5:P0=0x05;P2=0x03;break; case 12:P0=0x0d;P2=0x02;delay(20);break; case 8:P0=0x0d;P2=0x02;delay(100);break; } } } } } void time0()interrupt 1 { TH0=0X3C; TL0=0XB0; cnt++; if(cnt==20) { cnt=0; sec++; if(sec==100) { sec=0; } } } void time1()interrupt 3 { TH1=0X3C; TL1=0XB0; cnt3++; if(cnt3==20) { cnt3=0; sec1++; if(sec1==100) { sec1=0; } } }