1、word完整版基于STC89C51单片机的智能超声波避障小车基于STC89C52单片机的智能超声波避障小车参赛人员:周志强 王俊 朱纪伟 聂孟杰班 级:2012级自动化3班日 期:2015年3月一、方案概述本小车使用一台 AT89C52 单片机作为主控芯片,它通过超声波测距来获取小车距离障碍物的距离,并且用液晶显示器实时的显示出来,在小车与障碍物的距离小于安全距离(40cm) 时,小车上蜂鸣器会发出警报声,并且后退并拐弯,同时通过LCD1602显示器显示出小车与障碍物之间的距离,精确到0。1cm. 在避开障碍物后,小车会沿直线前进。本系统设计的简易智能小车分为几个模块:单片机控制系统、LCD1
2、602显示器。超声波路面检测系统、前进、 转弯控制电机以及方向指示灯系统。它们之间的相互关系如下图所示. 智能小车简要原理框架图二总体电路原理图超声波模块三、主要模块基本原理(1)超声波模块超声波时序图以上时序图表明你只需要提供一个10uS以上脉冲触发信号,该模块内部将发出8个40kHz周期电平并检测回波.一旦检测到回波信号则输出回响信号。回响信号的脉冲宽度与所测的距离成正比.由此通过发射信号到收到的回响信号时间间隔可以计算得到距离.公式:距离=高电平时间声速(340M/S)/2.(2)液晶显示模块如上图所示,整个液晶屏采用标准的16 脚接口,其中GND 为电源地,VCC 接5V正电源,VEE
3、 为液晶显示屏对比度调整端,通过一个可调电阻接地,可调电阻调到最大时对比度最弱,可调电阻调到零时对比度最高.RS 为寄存器选择端,高电平时选择数据寄存器、低电平时选择指令寄存器。RW 为读写信号线,高电平时进行读操作,低电平时进行写操作.当RS 和RW 共同为低电平时可以写入指令或者显示地址,当RS 为低电平RW 为高电平时可以读忙信号,当RS 为高电平RW为低电平时可以写入数据.E 端为使能端,当E 端由低电平跳变成高电平时,液晶屏执行命令。DB0DB7 为8 位双向数据线.四、流程图及源代码主函数流程图 N Y N Y源程序#include at89x51。h #include inclu
4、de ”LCD1602display.h”#define TX P2_1#define RX P2_0sbit DU = P26;sbit WE = P27;define Forward_L_DATA 180/当前进不能走直线的时候,请调节这两个参数,理想的时候是100,100,最大256,最小0.0的时候最慢,256的时候最快define Forward_R_DATA 180 /例如小车前进的时候有点向左拐,说明右边马达转速过快,那可以取一个值大一点,另外一个值小一点,例如 200 190 /直流电机因为制造上的误差,同一个脉宽下也不一定速度一致的,需要自己手动调节/sbit P4_0=0x
5、c0; /P4口地址/*按照原图接线定义/sbit L293D_IN1=P12; sbit L293D_IN2=P13;sbit L293D_IN3=P16;sbit L293D_IN4=P17;sbit L293D_EN1=P14;sbit L293D_EN2=P15;sbit BUZZ=P23; /蜂鸣器void cmg88()/关数码管,点阵函数DU=1; P0=0X00;DU=0;void Delay400Ms(void);/延时400毫秒函数unsigned char code Range =”=Range Finder=;/LCD1602显示格式unsigned char code
6、 ASCII13 = 0123456789.-M;unsigned char code table=”Distance:000。0cm;unsigned char code table1=! Out of range;unsigned char disbuff4=0,0,0,0;/用于分别存放距离的值0.1mm、mm、cm和m的值void Count(void);/距离计算函数 unsigned int time=0;/用于存放定时器时间值unsigned long S=0;/用于存放距离的值bit flag =0; /量程溢出标志位bit turn_right_flag;/=void For
7、ward(unsigned char Speed_Right,unsigned char Speed_Left)/ 前进 L293D_IN1=0; L293D_IN2=1; L293D_IN3=1; L293D_IN4=0;void Stop(void) /刹车 L293D_IN1=0; L293D_IN2=0; L293D_IN3=0; L293D_IN4=0;void Turn_Right(unsigned char Speed_Right,unsigned char Speed_Left) /后退左转 L293D_IN1=1; L293D_IN2=0; L293D_IN3=1; L293
8、D_IN4=0; Delay(100); L293D_IN1=1; L293D_IN2=0; L293D_IN3=1; L293D_IN4=0;/=/*距离计算程序*/ void Conut(void) time=TH1*256+TL1; TH1=0; TL1=0; /此时time的时间单位决定于晶振的速度,外接晶振为11.0592MHZ时, /time的值为0.54ustime,单位为微秒 /那么1us声波能走多远的距离呢?1s=1000ms=1000000us / 340/1000000=0。00034米 /0。00034米/1000=0.34毫米 也就是1us能走0。34毫米 /但是,我
9、们现在计算的是从超声波发射到反射接收的双路程, /所以我们将计算的结果除以2才是实际的路程 S=time*2;/先算出一共的时间是多少微秒. S=S0。17;/此时计算到的结果为毫米,并且是精确到毫米的后两位了,有两个小数点 if(S=5000)|flag=1) /超出测量范围 flag=0; DisplayListChar(0, 1, table1); else disbuff0=S10; disbuff1=S/1010; disbuff2=S/100%10; disbuff3=S/1000; DisplayListChar(0, 1, table); DisplayOneChar(9, 1
10、, ASCIIdisbuff3); DisplayOneChar(10, 1, ASCIIdisbuff2); DisplayOneChar(11, 1, ASCIIdisbuff1); DisplayOneChar(12, 1, ASCII10); DisplayOneChar(13, 1, ASCIIdisbuff0); /*/ void zd0() interrupt 3 /T0中断用来计数器溢出,超过测距范围 flag=1; /中断溢出标志 RX=0; /*超声波高电平脉冲宽度计算程序*/void Timer_Count(void) TR1=1; /开启计数 while(RX); /当
11、RX为1计数并等待 TR1=0; /关闭计数 Conut(); /计算/*/ void StartModule() /启动模块 TX=1; /启动一次模块 Delay10us(2); TX=0; /*/ /*主程序*/void main(void) unsigned char i; unsigned int a; cmg88();/关数码管 Delay1ms(400); /启动等待,等LCM讲入工作状态 LCMInit(); /LCM初始化 Delay1ms(5);/延时片刻 DisplayListChar(0, 0, Range); DisplayListChar(0, 1, table);
12、 TMOD=TMOD0x10;/设T0为方式1,GATE=1; EA=1; /开启总中断 TH1=0; TL1=0; ET1=1; /允许T0中断 /= /PWM_ini(); /= turn_right_flag=0; /=B: for(i=0;i50;i+) /判断K3是否按下 Delay1ms(1); /1ms内判断50次,如果其中有一次被判断到K3没按下,便重新检测 if(P3_6!=0 )/当K3按下时,启动小车 goto B; /跳转到标号B,重新检测 /蜂鸣器响一声 BUZZ=0; /50次检测K3确认是按下之后,蜂鸣器发出“滴声响,然后启动小车。 Delay1ms(50); BUZZ=1;/响50ms后关闭蜂鸣器 /= while(1) RX=1; StartModule(); /启动模块 for(a=951;a0;a-) if(RX=1) Timer_Count(); /超声波高电平脉冲宽度计算函数 结束语:本系统有STC89C52单片机,超声波模块,LCD1602显示器,报警系统等组成。STC89C52控制电机的转动和报警系统的动作。LCD1602显示智能型小车到障碍物之间的距离便于人查看。智能小车能够实现自动避障,自动报警,实时监控障碍距离的功能。
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1