智能循迹小车设计.docx
智能循迹/避障小车研究工作报告一、智能循迹小车程序构造框图二、ProteIlS仿真图三、软件程序设计一、智能循迹小车程序构造框图通过几天在网上查找,对智能循迹/避障小车有了大体理解,普通有三个模块:1、最基本小车驱动模块,使用两个二相四线步进电机对小车两个后轮分别进行驱动,前轮最佳用万向轮,能使小车更好地转弯;2、小车循迹模块,在小车底部有三个并排安装红外对管,对黑色与白色反射信号不同,经单片机解决后对小车进行相应解决;3、避障模块,我写程序中对于避障模块是用中断来解决(即安装在小车车头红外对管检测到有障碍物后,就会向单片机P32口输出一种高电平或是低电平,这时中断程序将对小车进行预先设定好避障解决),但是在程序构造框图中,我不太会表达中断解决方式,因此就用查询方式画了。停止?二、ProteUS仿真图我用PrOteUS大概地仿真了小车运营状态。图中两个二相四线步进电机就代表小车左右轮(假定步进电机顺时针转动方向为小车迈进方向),网上有诸各种驱动芯片,在仿真时我只使用1.298N芯片来驱动步进电机。用三个单刀双制开关模仿用于小车循迹三个红外对管输出信号,经一种与门与三极管开关连接到P3_3口,中断程序对Pl_0,Pl-1,P1-2三个口进行检测,并做出相应解决。同步由于避障模块优先级高于循迹模块,因此将外部中断。用于避障,外部中断1用于循迹。Pl_3口则用于检测小车与否到达终点。1、小车驱动模块:使用一片298芯片驱动一种二相四线步进电机,电机电压为12Vo2、小车循迹模块:左边为三个单刀双制开关模仿小车循迹使用红外对管输出信号,经一种与门和三极管开关送至P3_3口,有Pl_4口定期响应中断程序。又经或门送至Pl_3口(图因找不到或门,因此用7411和7404代替),检测小车与否到达终点.3、避障模块:(用一种开关代替车头红外对管输出信号)4、仿真成果:依照两个步进电机转动状况,小车可以按照预先设计好程序进行循迹(转弯,直走),避障解决,最后停止迈进。三、软件程序设计ttinclude<reg52.h>#defineucharunsignedcharsbitP1_2=P2;/Pl口低三位作为小车循迹三个红外对管与单片机信号接口sbitP1.O=PlP;sbitP1J=P1;sbitP1_3=P3;三个循迹红外对管输出口经或门后成果与Pl_3接,用于实时检测sbitP1_7=P7;控制两个二相四线步进电机启动与停止sbitP1_6=P6;sbitP1_4=P4;/为循迹中断所用定期/计数器0输出口uchari,j,ms;uchardianji=0xll,0x22,0x44,0x88);电机转动使小车迈进ucharback=0x88,0x44,0x22,0x11;电机转动使小车后退voiddelay(intz)延时程序(intx,y;for(x=0;x<z;x+)for(y=0;y<500:y+);)voidgoahcad()小车迈进程序,一种循环使小车车轮转动一周Pl_6=l;Pl_7=l;for(i=0;i<4;i+)(P2=dianjii;delay(50);)voidturnleft()小车左转程序,小车采用两个步进电机驱动,分别控制小车左右两个车轮转动。小车左转时,左边电机停止转动,右边电机Pl_6=0;依然转动,即实现小车左转动作;反之则是小车右转动作Pl_7=l;for(i=0;i<4;i+)(P2=dianjii;delay(50);)voidturnright()小车右转程序Pl_6=l;Pl_7=0;for(i=0;i<4;i+)P2=dianjii;delay(50);)voidqianjin()小车迈进程序,此程序是为小车遇到障碍时进行躲避解决时小车前进程序,一种循环小车车轮转动三周Pl_6=l;Pl_7=l;for(j=0;j<3;j+)(for(i=0;i<4;i+)(P2=dianjii;delay(50);)voidgobackO小车后退程序,此程序也是小车避障环节中为小车后退程序,一种循环,小车车轮向后转动三周Pl_6=l;Pl_7=l;for(j=0;j<3;j+)P2=backi;delay(50);)voidmain(void)主程序TMOD=OxOI;为循迹中断时,设立了一种定期/计数器0,使得循迹中断会定期被响应THO=(65536-50000)/256;设立定期/计数器初值T1.O=(65536-50000)%256:TRO=I;启动定期/计数器0IE=0x87;/打开TO,INTO,INTl中断ITO=I;两个外部中断中断触发方式ITl=I;Pl_4=0;设定初值ms=0;WhiIe(P1_3)场地为白纸黑线,红外对管发射接受后,若为黑色则向单片机输出低电(平,若为白色则输出高电平。三个红外对管接一种或门后到Pl_3口,只goahead0;要有一种对管检测到白线,小车就始终向前走。场地终点为一条与循迹线路相垂直黑线,若三个对管都检测到黑线,即输出都为低电平,Pl_6=0;此时跳出循环,关闭两个步进电机,小车停止运营。Pl7=0;voidtimc()interrupt0避障中断解决程序。在小车车头安装一种或是两个红外对管,用于检测循迹轨道上障碍物。若有障碍物浮现则红外Pl_6=0;对管向单片机P3_2口输出低电平,做出相应解决。Pl_7=0;先关闭两个步进电机,使其正转与反转之间有一种缓冲时间goback();后退,左转,迈进,右转,迈进,右转,直走turnleftO;qianjin();turnright();qianjin();turnright();goahcad();)voidtt_O()interrupt2循迹中断程序。由于安装在小车下面三个红外对管会长时间地保持一种电平不变,若直接将此信号经与门连接到P3_3口时,中断程序只执行一次便不再继续响应,因此我加了一种三极管开关。这样隔一段时间三极管导通,将信号传送到P3_3口。由定期器设定每100nlS导通三极管一次,将三个用于循迹对管输出经或门后送到P3_3口。tif(Pl_0=0&&Pl_2=l)若左边红外管输出为低电平,右边为高电平,则左转turnleft();if(Pl_0=l&&Pl_2=0)若左边红外管输出为高电平,右边为低电平,则右转turnright();if(Pl_0=0&&Pl_l=0&&Pl_2=0)若三个都为低电平,则关闭步进电机,小车停止Pl_6=0;Pl_7=0;)voidtime_0()interrupt1定期100ms,Pl_4口反相(THO=(65536-50000)/256;T1.O=(65536-50000)%256;ms+;if(ms>=2)P1_4=!P1_4;ms=0;