避障小车原理.docx
- 文档编号:12795688
- 上传时间:2023-06-08
- 格式:DOCX
- 页数:12
- 大小:17.48KB
避障小车原理.docx
《避障小车原理.docx》由会员分享,可在线阅读,更多相关《避障小车原理.docx(12页珍藏版)》请在冰点文库上搜索。
避障小车原理
第一步:
根据实际情况确定智能小车所需要实现的功能。
例如:
寻线、测距、避障、寻找静止物体、寻找运动物体、检测边缘……
第二步:
根据智能小车所需要实现的功能确定相应的硬件部分。
如寻线是用红外还是用激光……、测距是用超声波还是激光……、避障是用红外还是超声波……寻找物体使用红外还是超声波还是雷达还是其他的等等。
选取方案的时候既要考虑实际效果还要根据自身能力判断……不要到时候进退两难。
第三步:
编写程序。
第四步:
实验,并找出漏洞优化程序。
当然在此之前,还有一件很重要的事要做就是选取什么单片机。
51、Arm……
硬件连接
****************************************************************************/
#include
#include
#defineSevro_moto_pwmP2_7//接舵机信号端输入PWM信号调节速度
#defineECHOP2_4//超声波接口定义
#defineTRIGP2_5//超声波接口定义
#defineLeft_moto_go{P1_0=1,P1_1=0,P1_2=1,P1_3=0;}//左边两个电机向前走
#defineLeft_moto_back{P1_0=0,P1_1=1,P1_2=0,P1_3=1;}//左边两个电机向后转
#defineLeft_moto_Stop{P1_0=0,P1_1=0,P1_2=0,P1_3=0;}//左边两个电机停转
#defineRight_moto_go{P1_4=1,P1_5=0,P1_6=1,P1_7=0;}//右边两个电机向前走
#defineRight_moto_back{P1_4=0,P1_5=1,P1_6=0,P1_7=1;}//右边两个电机向前走
#defineRight_moto_Stop{P1_4=0,P1_5=0,P1_6=0,P1_7=0;}//右边两个电机停转
unsignedcharconstdiscode[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0xBF,0xff/*-*/};
unsignedcharconstpositon[3]={0xfe,0xfd,0xfb};
unsignedchardisbuff[4]={0,0,0,0,};
unsignedcharposit=0;
unsignedcharpwm_val_left=0;//变量定义
unsignedcharpush_val_left=14;//舵机归中,产生约,1.5MS信号
unsignedlongS=0;
unsignedlongS1=0;
unsignedlongS2=0;
unsignedlongS3=0;
unsignedlongS4=0;
unsignedinttime=0;//时间变量
unsignedinttimer=0;//延时基准变量
unsignedchartimer1=0;//扫描时间变量
/************************************************************************/
voiddelay(unsignedintk)//延时函数
{
unsignedintx,y;
for(x=0;x for(y=0;y<2000;y++); } /************************************************************************/ voidDisplay(void)//扫描数码管 { if(posit==0) {P0=(discode[disbuff[posit]])&0x7f;}//产生点 else {P0=discode[disbuff[posit]];}if(posit==0) {P2_1=0;P2_2=1;P2_3=1;} if(posit==1) {P2_1=1;P2_2=0;P2_3=1;} if(posit==2) {P2_1=1;P2_2=1;P2_3=0;} if(++posit>=3) posit=0; } /************************************************************************/ voidStartModule()//启动测距信号 { TRIG=1; _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); TRIG=0; } /***************************************************/ voidConut(void)//计算距离 { while(! ECHO);//当RX为零时等待 TR0=1;//开启计数 while(ECHO);//当RX为1计数并等待 TR0=0;//关闭计数 time=TH0*256+TL0;//读取脉宽长度 TH0=0; TL0=0; S=(time*1.7)/100;//算出来是CM disbuff[0]=S%1000/100;//更新显示 disbuff[1]=S%1000%100/10; disbuff[2]=S%1000%10%10; } /************************************************************************/ //前速前进 voidrun(void) { Left_moto_go;//左电机往前走 Right_moto_go;//右电机往前走 } /************************************************************************/ //前速后退 voidbackrun(void) { Left_moto_back;//左电机往前走 Right_moto_back;//右电机往前走 } /************************************************************************/ //左转 voidleftrun(void) { Left_moto_back;//左电机往前走 Right_moto_go;//右电机往前走 } /************************************************************************/ //右转 voidrightrun(void) { Left_moto_go;//左电机往前走 Right_moto_back;//右电机往前走 } /************************************************************************/ //STOP voidstoprun(void) { Left_moto_Stop;//左电机停走 Right_moto_Stop;//右电机停走 } /************************************************************************/ voidCOMM(void) { push_val_left=5;//舵机向左转90度 timer=0; while(timer<=4000);//延时400MS让舵机转到其位置 StartModule();//启动超声波测距 Conut();//计算距离 S2=S; push_val_left=23;//舵机向右转90度 timer=0; while(timer<=4000);//延时400MS让舵机转到其位置 StartModule();//启动超声波测距 Conut();//计算距离 S4=S; push_val_left=14;//舵机归中 timer=0; while(timer<=4000);//延时400MS让舵机转到其位置StartModule();//启动超声波测距 Conut();//计算距离 S1=S;if((S2<20)||(S4<20))//只要左右各有距离小于20CM小车后退 { backrun();//后退 timer=0; while(timer<=4000); } if(S2>S4) { rightrun();//车的左边比车的右边距离小右转 timer=0; while(timer<=4000); } else { leftrun();//车的左边比车的右边距离大左转 timer=0; while(timer<=4000); } }/************************************************************************/ /*PWM调制电机转速*/ /************************************************************************/ /*左电机调速*/ /*调节push_val_left的值改变电机转速,占空比*/ voidpwm_Servomoto(void) { if(pwm_val_left<=push_val_left) Sevro_moto_pwm=1; else Sevro_moto_pwm=0; if(pwm_val_left>=200) pwm_val_left=0; } /***************************************************/ ///*TIMER1中断服务子函数产生PWM信号*/ voidtime1()interrupt3using2 { TH1=(65536-100)/256;//100US定时 TL1=(65536-100)%256; timer++;//定时器100US为准。 在这个基础上延时 pwm_val_left++; pwm_Servomoto();timer1++;//2MS扫一次数码管 if(timer1>=20) { timer1=0; Display(); } } /***************************************************/ ///*TIMER0中断服务子函数产生PWM信号*/ voidtimer0()interrupt1using0 { }/***************************************************/voidmain(void) {TMOD=0X11; TH1=(65536-100)/256;//100US定时 TL1=(65536-100)%256; TH0=0; TL0=0; TR1=1; ET1=1; ET0=1; EA=1;delay(100); push_val_left=14;//舵机归中 while (1)/*无限循环*/ {if(timer>=1000)//100MS检测启动检测一次 { timer=0; StartModule();//启动检测 Conut();//计算距离 if(S<30)//距离小于20CM { stoprun();//小车停止 COMM();//方向函数 } else if(S>30)//距离大于,30CM往前走 run(); }} 头文件 (一) /*-------------------------------------------------------------------------- AT89X51.HHeaderfileforthelowvoltageFlashAtmelAT89C51andAT89LV51. Copyright(c)1988-2002KeilElektronikGmbHandKeilSoftware,Inc. Allrightsreserved. --------------------------------------------------------------------------*/ #ifndef__AT89X51_H__ #define__AT89X51_H__ /*------------------------------------------------ ByteRegisters ------------------------------------------------*/ sfrP0=0x80; sfrSP=0x81; sfrDPL=0x82; sfrDPH=0x83; sfrPCON=0x87; sfrTCON=0x88; sfrTMOD=0x89; sfrTL0=0x8A; sfrTL1=0x8B; sfrTH0=0x8C; sfrTH1=0x8D; sfrP1=0x90; sfrSCON=0x98; sfrSBUF=0x99; sfrP2=0xA0; sfrIE=0xA8; sfrP3=0xB0; sfrIP=0xB8; sfrPSW=0xD0; sfrACC=0xE0; sfrB=0xF0; /*------------------------------------------------ P0BitRegisters ------------------------------------------------*/ sbitP0_0=0x80; sbitP0_1=0x81; sbitP0_2=0x82; sbitP0_3=0x83; sbitP0_4=0x84; sbitP0_5=0x85; sbitP0_6=0x86; sbitP0_7=0x87; /*------------------------------------------------ PCONBitValues ------------------------------------------------*/ #defineIDL_0x01 #defineSTOP_0x02 #definePD_0x02/*Alternatedefinition*/ #defineGF0_0x04 #defineGF1_0x08#defineSMOD_0x80/ *------------------------------------------------ TCONBitRegisters ------------------------------------------------*/ sbitIT0=0x88; sbitIE0=0x89; sbitIT1=0x8A; sbitIE1=0x8B; sbitTR0=0x8C; sbitTF0=0x8D; sbitTR1=0x8E; sbitTF1=0x8F; /*------------------------------------------------ TMODBitValues ------------------------------------------------*/ #defineT0_M0_0x01 #defineT0_M1_0x02 #defineT0_CT_0x04 #defineT0_GATE_0x08 #defineT1_M0_0x10 #defineT1_M1_0x20 #defineT1_CT_0x40 #defineT1_GATE_0x80 #defineT1_MASK_0xF0 #defineT0_MASK_0x0F /*------------------------------------------------ P1BitRegisters ------------------------------------------------*/ sbitP1_0=0x90; sbitP1_1=0x91; sbitP1_2=0x92; sbitP1_3=0x93; sbitP1_4=0x94; sbitP1_5=0x95; sbitP1_6=0x96; sbitP1_7=0x97;/ *------------------------------------------------ SCONBitRegisters ------------------------------------------------*/ sbitRI=0x98; sbitTI=0x99; sbitRB8=0x9A; sbitTB8=0x9B; sbitREN=0x9C; sbitSM2=0x9D; sbitSM1=0x9E; sbitSM0=0x9F; /*------------------------------------------------ P2BitRegisters ------------------------------------------------*/ sbitP2_0=0xA0; sbitP2_1=0xA1; sbitP2_2=0xA2; sbitP2_3=0xA3; sbitP2_4=0xA4; sbitP2_5=0xA5; sbitP2_6=0xA6; sbitP2_7=0xA7;聽 /*------------------------------------------------ IEBitRegisters ------------------------------------------------*/ sbitEX0=0xA8;/*1=EnableExternalinterrupt0*/ sbitET0=0xA9;/*1=EnableTimer0interrupt*/ sbitEX1=0xAA;/*1=EnableExternalinterrupt1*/ sbitET1=0xAB;/*1=EnableTimer1interrupt*/ sbitES=0xAC;/*1=EnableSerialportinterrupt*/ sbitET2=0xAD;/*1=EnableTimer2interrupt*/sbitEA=0xAF;/*0=Disableallinterrupts*/聽 /*------------------------------------------------ P3BitRegisters(Mnemonics&Ports) ------------------------------------------------*/ sbitP3_0=0xB0; sbitP3_1=0xB1; sbitP3_2=0xB2; sbitP3_3=0xB3; sbitP3_4=0xB4; sbitP3_5=0xB5; sbitP3_6=0xB6; sbitP3_7=0xB7;sbitRXD=0xB0;/*Serialdatainput*/ sbitTXD=0xB1;/*Serialdataoutput*/ sbitINT0=0xB2;/*Externalinterrupt0*/ sbitINT1=0xB3;/*Externalinterrupt1*/ sbitT0=0xB4;/*Timer0externalinput*/ sbitT1=0xB5;/*Timer1externalinput*/ sbitWR=0xB6;/*Externaldatamemorywritestrobe*/ sbitRD=0xB7;/*Externaldatamemoryreadstrobe*/聽 /*------------------------------------------------ IPBitRegisters ------------------------------------------------*/ sbitPX0=0xB8; sbitPT0=0xB9; sbitPX1=0xBA; sbitPT1=0xBB; sbitPS=0xBC; sbitPT2=0xBD;聽 /*------------------------------------------------ PSWBitRegisters ------------------------------------------------*/ sbitP=0xD0; sbitFL=0xD1; sbitOV=0xD2; sbitRS0=0xD3; sbitRS1=0xD4; sbitF0=0xD5; sbitAC=0xD6; sbitCY=0xD7;聽 /*------------------------------------------------ InterruptVectors: InterruptAddress=
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 小车 原理