#include<reg52.h> #define uchar unsigned char #define uint unsigned int sbit inl1=P2^0; //左电机输出1 sbit inl2=P2^1; //左电机输出2 sbit inr1=P2^2; //右电机输出1 sbit inr2=P2^3; //右电机输出2 sbit s_left=P2^4; //左传感器 sbit s_right=P2^5; //右传感器 sbit s_mid=P2^6; // 中间传感器 sbit barrier=P2^7;//障碍物扫描传感器 sbit beep=P1^0;//探到铁报警接蜂鸣器 uint b_count=0;// 障碍物扫描位置基数 uchar alter_time=0;//报警计数值 uchar go_go=1;//小车前进中断标志 sbit left_light=P1^2; sbit right_light=P1^1; uchar second=0; sbit P32=P3^2; uchar b_left,b_right; /****红外遥控程勋数据****/ uchar irtime; uchar startflag; uchar irdata[33]; uchar irreceok; uchar irproseok; uchar dis[8]; uchar bitnum; uchar cd,flag,yaokong; uchar ircode[4]; uchar right=0,left=0,stop_stop=0,model=0; uchar kuai; void stop(void); void delay(uint a); void ir_key() //遥控键盘识别 { if(ircode[2]==0x51&&ircode[3]==0xAE&&flag==1) { yaokong=~yaokong; //打开遥控模式 flag=0; } if(ircode[2]==0x55&&ircode[3]==0xAA&&flag==1) //前进后退模式选择 { model=~model; right=0; left=0; flag=0; } if(ircode[2]==0x56&&ircode[3]==0xA9&&flag==1) { //遥控前进标志位 stop_stop=~stop_stop; left=0; right=0; flag=0; } if(ircode[2]==0x17&&ircode[3]==0xE8&&flag==1) //遥控左拐标志位 { left=1; right=0; stop_stop=0; flag=0; } if(ircode[2]==0x16&&ircode[3]==0xE9&&flag==1) //遥控右转标志位 { right=1; stop_stop=0; left=0; flag=0; } if(ircode[2]==0x11&&ircode[3]==0xEE&&flag==1) //遥控右转标志位 { kuai=~kuai; flag=0; } } void timer1init() //定时器1初始化 { TMOD=0x21; TH1=0x00; TL1=0x00; ET1=1; TR1=1; } void int1init() //外部中断1初始化 { IT1=1; EX1=1; EA=1; } void irpros(void) //红外处理函数 { uchar k,j,i; uchar value; k=1; for(j=0;j<4;j++) { for(i=0;i<8;i++) { value=value>>1; if(irdata[k]>6) { value=value|0x80; } k++; } ircode[j]=value; } irproseok=1; } void irwork() //红外解码函数 { uchar i; dis[0]=ircode[0]/16; dis[1]=ircode[0]%16; dis[2]=ircode[1]/16; dis[3]=ircode[1]%16; dis[4]=ircode[2]/16; dis[5]=ircode[2]%16; dis[6]=ircode[3]/16; dis[7]=ircode[3]%16; for(i=0;i<8;i++) { if(dis[i]>9) { cd=dis[i]-9; dis[i]=0x10+cd; } } flag=1; } void inti() //初始化定时器0,中断0 { P2=0xff; P0=0xff; P1=0xff; P3=0xff; EX0=1; IT0=1; TH0=(65536-50000)/256; TL0=(65536-50000)%256; ET0=1; TR0=0; } void delay(uint a) ////延时 1ms { int i; for (; a>0; a--) for(i=0; i<110; i++); } void go_along(void) //直走 { inl1=1; inl2=0; inr1=1; inr2=0; } void go_left(void) // 向左转 { left_light=0; inl1=0; inl2=0; inr1=1; inr2=0; } void go_right(void) //向右转 { right_light=0; inl1=1; inl2=0; inr1=0; inr2=0; } void go_back(void) //后退 { inl1=0; inl2=1; inr1=0; inr2=1; } void left_back(void) //左转弯后退 { left_light=0; inl1=0; inl2=0; inr1=0; inr2=1; } void right_back(void) //右转弯后退 { right_light=0; inl1=0; inl2=1; inr1=0; inr2=0; } void stop(void) //停止 { inl1=0; inl2=0; inr1=0; inr2=0; } void kill_stop(void) //杀停 { inl1=1; inl2=1; inr1=1; inr2=1; } /***************先扫描中间传感器如不再黑线上刹停,扫描 左右两个传感器,如果左边在黑线上,向右转,如果右边在黑 向上向左转知道都在黑向上前进*******************/ void scan_sensor(void) //扫描前面传感器 并前行 { if(s_mid==1) { kill_stop(); delay(3); stop(); delay(3); if (s_right==0) { go_right(); delay(7); } else if (s_left==0) { go_left(); delay(7); } else { stop(); delay(4); go_along(); delay(5); } } else{ kill_stop(); delay(3); stop(); delay(3); if(s_right==0) { go_right(); delay(6); } else if(s_left==0) { go_left(); delay(6); } else { go_along(); delay(6); } } } /**********如果遇见障碍物先向左转到180度还有障碍物, 之后向右转到没有障碍物为止之后前进***************/ void bizhang() //避开障碍物函数 { if(barrier==0) { if(b_count<=100) { go_left(); delay(5); b_count++; } else{ left_back(); delay(10); } } else{ if(b_left==1) { go_left(); delay(50); b_left=0; } if(b_right==1) { left_back(); delay(50); b_right=0; } go_along(); delay(5); b_count=0; } } /****发现铁片则停止三秒钟****/ void fironalter() //发现铁报警清楚函数 { if(second==3) { second=0; beep=1; go_along(); delay(300); EX0=1; go_go=1; } } main() { int1init(); timer1init(); inti(); while(1) { if(irreceok) { irpros(); irreceok=0; } if(irproseok) { irwork(); irproseok=0; } ir_key(); if(yaokong==0xff) //遥控模式 { if(kuai==0) { stop(); delay(5); } if(model==0) //前行模式 { if(go_go==1) { if(left==0xff) { stop(); delay(2); go_left(); delay(5); } else if(right==0xff) { stop(); delay(2); go_right(); delay(5); } else if(stop_stop==0xff) { stop(); delay(5); } else { go_along(); delay(5); } } else { stop(); delay(5); } } else //后退模式 { if(go_go==1) { if(left==0xff) { stop(); delay(2); left_back(); delay(5); } else if(right==0xff) { stop(); delay(2); right_back(); delay(5); } else if(stop_stop==0xff) { stop(); delay(5); } else { go_back(); delay(5); } } else { stop(); delay(5); } } left=0; right=0; } else //循迹模式 { if(go_go==1) { stop(); delay(5); if(s_right==0&&s_left==0&&s_mid==0) bizhang(); else scan_sensor(); } else { stop(); } } fironalter(); left_light=1; right_light=1; } } void int0() interrupt 0 { beep=0; kill_stop(); delay(10); alter_time=0; TR0=1; go_go=0; EX0=0; } void timer0() interrupt 1 { TH0=(65536-50000)/256; TL0=(65536-50000)%256; alter_time++; if(alter_time==20) { alter_time=0; second++; } } void timer1() interrupt 3 { irtime++; } void int1() interrupt 2 { if(startflag) { if(irtime>32) { bitnum=0; } irdata[bitnum]=irtime; irtime=0; bitnum++; if(bitnum==33) { bitnum=0; irreceok=1; } } else { startflag=1; irtime=0; } }