完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
实验简介
使用STC89C53单片机作为主控制器芯片实现了带全向轮的两轮驱动避障以及循线小车,感知模块为超声波和红外传感器。本实验分为3个独立的部分: 1、利用超声波实现小车的避障功能;元器件介绍 如下是一款常见的超声波模块HC-SR04的外观图,HC-SR04超声波测距模块可提供2cm-400cm的非接触式距离感测功能,测距精度可达高到3mm;模块包括超声波发射器、接收器与控制电路。使用51单片机采集HC-SR04数据时就要用到AD转换器,这部分的知识请参见前几个章节。 下图是一个四路的红外循迹模块,其原理是利用红外传感器感知车轮下是否有目标线(黑色),然后将这个数据交给单片机处理后控制相应的电机,红外模块的读取只需要用到单片机的输入IO。 下图是一个电机驱动模块,使用的芯片是L293D,通过对信号线(M1A、M1B)的控制进而驱动电机。这里之所以要使用到电机驱动模块,是因为单片机的电压输出是5v并且其电流输出也很微弱,而电机是一个较大功率的用电器,因此就要使用一个驱动模块单片机只需要输出逻辑控制信号便可以控制电机的转动。 电路结构图 代码 1、超声波避障 #include #include #include #define TX P2_1 #define RX P2_0 //速度调节 0~256 #define Forward_L_DATA 180 #define Forward_R_DATA 180 ***it IN1=P1^2; ***it IN2=P1^3; ***it IN3=P1^6; ***it IN4=P1^7; ***it EN1=P1^4; ***it EN2=P1^5; ***it K=P2^7; unsigned char code Range[]="==Range Finder=="; unsigned char code ASCII[13]="0123456789.-M"; unsigned char code table[]="Distance:000.0cm"; unsigned char code table1[]="!!! Outof range"; unsigned char di***uff[4]={0,0,0,0}; unsigned int time=0; unsigned long S=0;//存放距离值 bit flag=0; bit turn_right_flag; void Delay1ms(unsigned int i) { unsigned int x,y; for(x=0;x { for(y=0;y<250;y++) { _nop_(); _nop_(); _nop_(); _nop_(); } } } void Forward(unsigned char Speed_Right,unsigned char Speed_Left)//前进 { IN1=0; IN2=1; IN3=1; IN4=0; } void Stop(void)//刹车 { IN1=0; IN2=0; IN3=0; IN4=0; } void Turn_Right(unsigned char Speed_Right,unsigned char Speed_Left)//后 { IN1=1; IN2=0; IN3=0; IN4=0; } void Conut(void) { time=TH1*256+TL1; TH1=0; TL1=0; S=time*2; S=S*0.17;//单位毫米 if(S<=300) { if(turn_right_flag!=1) { Stop(); Delay1ms(5); } turn_right_flag=1; P2_3=0; Delay1ms(50); P2_3=1; Turn_Right(120,120); } else { turn_right_flag=0; Forward(Forward_R_DATA,Forward_L_DATA); } if((S>=5000)||flag==1) { flag=0; DisplayListChar(0,1,table); } else { di***uff[0]=S%10; di***uff[1]=S/10%10; di***uff[2]=S/100%10; di***uff[3]=S/1000; DisplayOneChar(9,1,ASCII[di***uff[3]]); DisplayOneChar(10,1,ASCII[di***uff[2]]); DisplayOneChar(11,1,ASCII[di***uff[1]]); DisplayOneChar(12,1,ASCII[di***uff[10]]); DisplayOneChar(13,1,ASCII[di***uff[0]]); } } void zd0() interrupt 3 { flag=0; RX=0; } //计算脉冲宽度 void Timer_Count(void) { TR1=1; while(RX); TR1=0; Count(); } void StarModule() { TX=1; Delay1ms(1); TX=0; } void main(void) { unsigned char i; unsigned int a; Delay1ms(400); LCMInit(); Delay1ms(5); DisplayListChar(0,0,Range); DisplayListChar(0,1,table); TMOD=0x10; EA=1; TH1=0; TL1=0; ET1=1; turn_right_flag=0; while(1) { if(K==0) { RX=1; StartModule(); for(a=951;a>0;a--) { if(RX==1) { Timer_Count(); } } } } } 红外避障 #include #include #include #define uchar unsigned char #define uint unsigned int ***it K=P2^7; uint i; void init() { TMOD=0x01; TH0=0xfc; TL0=0x16; TR0=1; ET0=1; EA=1; } void delay_nms(uint i) { uint x,y; for(x=0;x { for(y=0;y<250;y++) { _nop_(); _nop_(); _nop_(); _nop_(); } } } void main() { B: for(i=0;i<50;i++) { delay_nms(1); if(P2_7!=0) goto B; } init(); while(1) { if(Left_1_led==1&&Right_1_led==1) { run(); } if(Right_1_led==0&&Left_1_led==0) { rearrun(); delay_nms(500); leftrun(); delay_nms(200); } if(Right_1_led==0&&Left_1_led==1) { rightrun(); } if(Right_1_led==1&&Left_1_led==0) { leftrun(); } } } 红外循迹 #include #include #define uchar unsigned char #define uint unsigned int uint i,count; ***it K4=P2^7; void init(); void main() { init(); while(1) //无限循环 { if(K4==0) { //有信号为0 没有信号为1 if(Left_1_led==0&&Right_1_led==0) { run(); //调用前进函数 } if(Left_1_led==0&&Right_1_led==1) //左边检测到黑线 { rightrun(); //调用小车右转 函数 } if(Right_1_led==0&&Left_1_led==1) //右边检测到黑线 { leftrun(); //调用小车左转 函数 } } } } void init() { TMOD=0x11; TH0=0xfc; TL0=0x18; TR0=1; ET0=1; EA=1; } |
|
|
|
只有小组成员才能发言,加入小组>>
2496 浏览 0 评论
1059浏览 2评论
678浏览 1评论
440浏览 0评论
175浏览 0评论
292浏览 0评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-10 14:20 , Processed in 0.937645 second(s), Total 47, Slave 40 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号