基于STC89C51单片机的智能超声波避障小车讲解.docx
- 文档编号:26819288
- 上传时间:2023-06-23
- 格式:DOCX
- 页数:20
- 大小:309.68KB
基于STC89C51单片机的智能超声波避障小车讲解.docx
《基于STC89C51单片机的智能超声波避障小车讲解.docx》由会员分享,可在线阅读,更多相关《基于STC89C51单片机的智能超声波避障小车讲解.docx(20页珍藏版)》请在冰豆网上搜索。
基于STC89C51单片机的智能超声波避障小车讲解
基于STC89C52单片机的智能超声波避障小车
参赛人员:
周志强王俊朱纪伟聂孟杰
班级:
2012级自动化3班
日期:
2015年3月
、方案概述
本小车使用一台AT89C52单片机作为主控芯片,它通过超声波测距来获取小车距离障碍物的距离,并且用液晶显示器实时的显示出来,在小车与障碍物的距离小于安全距离(40cm)时,小车上蜂鸣器会发出警报声,并且后退并拐弯,同时通过LCD1602显示器显示出小车与障碍物之间的距离,精确到0.1cm.在避开障碍物后,小车会沿直线前进。
本系统设计的简易智能小车分为几个模块:
单片机控制系统、LCD1602显示器.超声波路面检测系统、前进、转弯控制电机以及方向指示灯系统。
它们之间的相互关系如下图所示。
显示与报警装置
智能小车简要原理框架图
二、总体电路原理
I
R15
475
—
■7
L-
VCC
VCC
W3K
W21031:
VCC
十
7
£
P3.4
1,
XIN3了
OV33
VCC4
0V45
oT~INIIN2
VCC:
CM
INS
IN7
10SK
XIN46
P3.57
IN4
02
LSG24
W1
1031:
11GNDioo\n
14P>3
13XDC
12CAT!
VCC
INSOS
VCC
传感器模块
电源指示
Fl
L
VCC
12
34
56
78
GND
VCC
GND
¥CC
GND
VCC
GND
J17
电規开尺
KS1
C2
220uF
1^—\\~|hGND
Cl|+1i
A70iiF
GND
gS©
电源供电系统
P32
1K
1K
R12
P33L1
1K
VCC
R1J4=1K
P34I5K
L4
传感器指示灯
超声波模块接口
mJLC
35
0TL-4
3
OTU
6
PL
5
pl.
R1
7pl
14
10
vcczz需总
Ml
1K
0TU1
5
0TU2
GND«||
4
iT
6
Pl.3
7
7.2V
8
册0UT1GNDGND0UT2Evcc
3D
9
L2
电机驱动模块
Tv
—5%
R9
、:
.
R310K.
Th
R>w肥6VTO
h>5
咲
WRST
srcii
u
lT
l2U
10
丄
qg
12;KRdICk
|R6
75K
RHIK
X»Nl
fl®
R中2侬
lOnF
C9
T宏F 2K 4 '-*'1VT < 6 HI2 7SK w 22 2OLT InF PSP n loa. i1 <3 iuvn II K) 12 15 nxra IOL7 4OLT nv -IV vcc 2、 4fV- GN> 3Z 3OLT R13 IUK 14 : 3 CI+ VCV CI- \S* C2* vs« C2- TlCtrr 71TS 12N T2 RIOJT Rir* R2V1-T R2N CiM) 10Un R19 CH 发ih : 2\T hi-r1j 10 160 S6K 士接收 超声波模块 三、主要模块基本原理 (1)超声波模块 」U 10uS的TTL 发信号 i■坏发岀8个40KHZ脉冲 □ 值号 楔块内郎发出信号 回QR电平無出与怯测距SB成比例 超声波时序图 以上时序图表明你只需要提供一个10uS以上脉冲触发信号,该模块内部将发出8个40kHz周期电平并检测回波。 一旦检测到回波信号则输出回响信号。 回响信号的脉冲宽度与所测的距离成正比。 由此通过发射信号到收到的回响信号时间间隔可以计算得到距离。 公式: 距离二高电平时间*声速(340M/S)/2。 (2)液晶显示模块 LCD1602 如上图所示,整个液晶屏采用标准的16脚接口,其中GND为电源地,VCC接5V正电源,VEE为液晶显示屏对比度调整端,通过一个可调电阻接地,可调电阻调到最大时对比度最弱,可调电阻调到零时对比度最高。 RS为寄存器选择端,高电平时选择数据寄存器、低电平时选择指令寄存器。 RW为读写信号线,高电平时进行读操作,低电平时进行写操作。 当RS和RW共同为低电平时可以写入指令或者显示地址,当RS为低电平RW为高电平时可以读忙信号,当RS为高电平RW为低电平时可以写入数据。 E端为使能端,当E端由低电平跳变成高电平时,液晶屏执行命令。 DBO―DB7为8位双向数据线。 四、流程图及源代码 主函数流程图 源程序 #include #include include,,LCD1602display.hn #deflneTXP2_l #defineRXP2_0 sbitDU=P2A6; sbitWE=P2A7; #deflneFonvard_L_DATA180//当前进不能走直线的时候,请调节这两个参数,理想的时候是100,100,最大256,最小0。 0的时候最慢,256的时候最快 #defineFonvard_R_DATA180〃例如小车前进的时候有点向左拐,说明右边马达转速过快,那可以取一个值大一点,另外一个值小一点,例如200190 〃直流电机因为制造上的误差,同一个脉宽下也不一定速度一致的,需要自己手动调节 //sbitP4_0=0xc0;//P4口地址 /*****按照原图接线定义******/ sbitL293D_IN1=P1A2; sbitL293D_IN2=P1A3; sbitL293D_IN3=P1A6; sbitL293D_IN4=P1A7; sbitL293D_EN1=P1A4; sbitL293D_EN2=P1人5; sbitBUZZ=P2A3;〃蜂鸣器 voidcmg88()//关数码管,点阵函数 { DU=1; P0=0X00; DU=0; } voidDelay400Ms(void);//延时400毫秒函数 unsignedchaicodeRange[]='-=RangeFindei==u;//LCD1602显示格式 unsignedchaicodeASCH[13]=“0123456789.-M”; unsignedchaicodetable[]=,'Distance: 000.0cm,'; unsignedchaicodetablel[]="! ! ! Outofrange"; unsignedchaidisbuff[4]={0,0,0,0};//用于分别存放距离的值0.1mm、mm、cm和m的值 voidCount(void);//距离计算函数 unsignedmttime=0;//用于存放定时器时间值 unsignedlongS=0;//用于存放距离的值 bitflag=0;〃量程溢出标志位 bittuin_nght_flag; 〃—================================ voidFonvard(unsignedchaiSpeed_Right,unsignedcharSpeed_Left)//前进 { L293D_IN1=O; L293D_IN2=1; L293D_IN3=1; L293D_IN4=0; } voidStop(void)〃杀! |车 L293D_IN1=O; L293D_IN2=0; L293D_IN3=0; L293D_IN4=0; }_ voidTurn_Right(unsignedcharSpeed_Right,unsignedchaiSpeed_Left)//后退左转 { L293D_IN1=1; L293D_IN2=0; L293D_IN3=1; L293D_IN4=0; Delay(lOO); L293D_IN1=1; L293D_IN2=0; L293D_IN3=1; L293D_IN4=0; } voidConut(void) r tmie=THl*256+TLl; TH1=O; TL1=O; 〃此时time的时间单位决定于晶振的速度,外接晶振为11.0592MHZ时, //time的值为0.54us*time,单位为微秒 〃那么lus声波能走多远的距离呢? ls=1000ms=1000000i】s //340/1000000=0.00034米 //0.00034米/1000=0.34毫米也就是lus能走0.34毫米 〃但是,我们现在计算的是从超声波发射到反射接收的双路程,〃所以我们将计算的结果除以2才是实际的路程 S=tune*2y/先算出一共的时间是多少微秒。 S=S*0.17;〃此时计算到的结果为毫米,并且是精确到毫米的后两位了,有两个小数点 if(S<=300)// if(tuni_nght_flag! =1) { StopO; Delaylms(5);//发现小车自动复位的时候,可以稍微延长一点这个延时,减少电机反向电压对电路板的冲击。 } tuni_nght_flag=1; P2_3=0; Delaylms(50); P2_3=l; Tuin_Right(120,120);〃小于设定距离时电机后退转弯 } else { nnn_nght_flag=O; Fonvaid(Fonvard_R_DATA,Fowaid_L_DATA);〃前进(大于 20-30CM前进) } //====================if((S>=5OOO)||flag==l)//超出测量范围 { flag=0; DisplayListCliar(O,1,tablet); } else { disbuff[0]=S%10; disbuff[l]=S/10%10; disbuff[2]=S/100%10; disbuff[3]=S/lOOO; DisplayListCliar(O,1,table); DisplayOneChar(9,1,ASCII[disbuff[3]]); DisplayOneChar(10,1,ASCII[disbuff[2]]); DisplayOneChar(l1,1,ASCII[disbuff[l]]); DisplavOneChar(12,1,ASCII[10]); DisplayOneChar(13,1,ASCII[disbuff[O]]); } } *******************************************************/ voidzdOQlnteriupt3//TO中断用來计数器溢出,超过测距范围 flag=l; RX=O; } //中断溢出标志 /********超声波高电平脉冲宽度计算程序***************/ voidTunei_Count(void) TR1=1; while(RX); 〃开启计数 〃当RX为1计数并等待 TR1=O; ConutQ; 〃关闭计数 〃计算 } ****************************************************** voidStailModuleQ〃启动模块 { TX=1;〃启动一次模块 Delay10us (2); TX=0; } y*******************************************************voidmam(void) { unsignedchaii; unsignedinta; cmg88()^/关数码管 Delaylms(400);〃启动等待,等LCM讲入工作状态LCMIiiitO;//LCM初始化 Delaylms(5);〃延时片刻 DisplavListChar(O,0,Range); DisplayListChar(O,1,table); TMOD=TMOD|OxlO;//设TO为方式1,GATE=1; EA=1;〃开启总中断 TH1=O; TL1=O; ET1=1;〃允许TO中断 //==—======—=============//PWM_mi(); //==—======—============= tum_nght_flag=0; B: foi(i=0;i<50;i++)〃判断K3是否按下 { Delaylms(l);//lms内判断50次,如果其中有一次被判断到K3没按下,便重新检测 if(P3_6! =0)〃当K3按下时,启动小车 gotoB;〃跳转到标号B,重新检测 } //蜂鸣器响一声 BUZZ=0;〃50次检测K3确认是按下之后,蜂鸣器发出“滴”声响,然后启动小车。 Delaylms(50); BUZZ=1;//响50ms后关闭蜂鸣器 while(l) { RX=1; StartModuleQ;〃启动模块 for(a=951;a>0;a-) if(RX=l) { Timer_Count();〃超声波高电平脉冲宽度计算函数 } } } 结束语: 本系统有STC89C52单片机,超声波模块,LCD1602显示器,报警系统等组成。 STC89C52控制电机的转动和报警系统的动作。 智能小 LCD1602显示智能型小车到障碍物之间的距离便于人査看。 车能够实现自动避障,自动报警,实时监控障碍距离的功能
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 基于 STC89C51 单片机 智能 超声波 小车 讲解