资源描述
综合能力实训项目设计报告
1 避障小车设计阐明
该设计运用单片机STC89C52RC作为主控芯片,该芯片是一种高速、低功耗、抗干扰能力强芯片,其最高时钟工作频率为48MHz,顾客应用程序空间为8K。可以满足程序空间需要。驱动采用L298N驱动芯片,它是一种双全桥步进电机专用芯片,通过对其输入端控制可以实现小车启动、转向、停止等动作。为节约成本,小车由两个直流减速电机加一种万向轮构成,并采用后轮驱动。
系统采用单片机为控制核心,运用自制小车或玩具小车进行小车模仿,采用超声波避障模块进行障碍物检测。单片机控制避障模块发射和接受,通过相应程序解决,判断障碍物位置。依照检测状况单片机控制电机驱动模块,控制小车电机正反转实现小车转向,启动等相应动作,来实现避开障碍物。
2 总体设计方案
2.1设计规定
在小车行驶过程中,50ms启动一次超波模块,对前方路况进行检测,当障碍物不大于40cm时,小车自动左转90度,当小车转过90度后,对前方道路再次检测,若无障碍,向前行驶。如果存在障碍物且不大于40cm,小车右转180度,并再次检测前方路况,若无障碍物,向前行驶,有障碍物且距离不大于40cm,小车向右转90度并向前行驶。
2.2系统设计方案
依照设计规定,为了便于调试和改进,采用模块化设计。系统可分为:微控制器、避障模块、驱动模块、小车模块。
2.3总体设计
基于单片机STC89C52RC设计智能避障小车,本设计需提供+5V电源,,DC+5CV由蓄电池通过降压模块得到+5V电源,为单片机及其她电路提供工作电压。超声波避障模块,采用购买现成超生波发射接受模块,通过单片机控制超声波模块去小车行驶道路上障碍物进行检测,然后单片机通过解决反馈信息,判断障碍物距离,进而发出指令控制驱动模块,控制小车实现转向,达到避障目。
系统框图
总体设计框图
2.4功能阐明
本设计主控芯片采用51芯片,负责传感器状态,并向电机驱动模块发出动作指令。复位采用手动复位。电源由蓄电池提供,为单片机及其她模块供电,+5V重要为驱动电机提供电源。避障模块采用购买成品,该模块在单片机控制下对小车前方路况进行检查,并将检测信息反馈给单片机,单片机通过解决反馈回来信息,发出相应指令控制驱动模块,从而控制小车做出相应动作,达到避障目。
3 硬件选取与构成
3.1单片机选取
采用单片机STC89C52RC为核心,8K内部程序存储器(ROM),512个内部数据存储器(RAM),4个寄存器区,32个通用I/O端口,2个16位定期、计数器,有ISP功能,能用于下载线进行在线编程,设有4个中断源,可以完毕设计规定,且该芯片价格便宜,采用该芯片可以达到设计规定。
该设计选用STC89C52作为主控芯片。单片机用是STC89C52RC,该芯片存储容量大,体积小。单片机最小系统:电源某些、晶振某些、复位电路和31号脚接高电平。单片机包括中央解决器、程序存储器(ROM)、数据存储器(RAM)、定期/计数器、并行接口、串行 接口和中断系统等几种大单元及数据总线地址总线和控制总线等三大总线。9号复位信号脚,时钟电器开始工作,复位端会浮现24个时钟周期以上高电平,系统即初始复位。其复位方式普通为手动复位,VCC断电期间,此引脚可接上备用电源,以保证单片机内部RAM数据不丢失。31脚程序存储器内外部选通线,内置有8kb程序存储器,当EA为高电平并且程序地址不大于8kb时,读取内部程序存储器指令数据。因此该设计31脚应当接高电平。51单片机内置最高频率达12MHz时钟电路,用于产生整个单片机运营脉冲时序,18、19脚就接电容和晶振电路。单片机40脚接VCC,可以提供电源,20脚接地。
3.2避障模块选取
该某些采用购买HC-SR04超声波测距模块,该模块可提供2cm-400cm非接触式距离感测功能,测距精度可达到3cm,模块涉及超生波发射器,接受器与控制电路。 工作原理:
(1)采用IO口TRIG触发测距,给至少给10us高电平 ;
(2)模块自动发送8个40khz方波,自动检测与否有信号返回;
(3)有信号返回,通过IO口ECHO输出一种高电平,高电平持续时间就是超声波从发射到返回时间。
测试距离=(高电平时间*声速(340m/s))/2。
3.3驱动模块选取
驱动采用L298N驱动芯片,该芯片是双全桥步进电机专用驱动芯片,内涵4信道逻辑驱动电路,是一种二相和四相步进电机专用驱动器,可同步驱动2个二相或1个四相步进电机,内含二个H-Bridge高电压、大电流双全桥驱动器,接受原则TTL逻辑信号,可驱动46V、2A
如下步进电机,且可以直接透过电源来调节输出电压;此芯片可直接由单片机IO端口来提供模仿时序信,第1脚和第15脚可与电流侦测用电阻连接来控制负载电路。OUTPUT1、OUTPUT2和OUTPUT3、OUTPUT4 之间分别接2个直流电机;INPUT1~INPUT4输入控制电位来控制电机正反转;Enable则控制电机停转。
电源供电某些使用直流可调稳压电源,提供直流+5V电压,运用三线稳压器件7805,输出+5V电源。由于7805简朴易用、价格低廉,在大多电路中充分采用。通过电解电容隔离滤波作用,电源某些可输出+5V直流电源。
4 软件程序流程图
4.1主流程图
在程序设计中,为了便于调试,以便找到程序问题所在,程序采用在主函数中调用各个子函数形式。当启动一次超声波测距程序时,单片机会依照检测反馈回来信息进行相应解决,进而判断与否有障碍物,当障碍物距离不大于设定安全距离时,单片机会发出相应指令,控制驱动电路,对小车行驶方向进行调节。当小车前方无障碍物时,主程序会在一定期间内自动启动一次超生波测距程序,若无障碍继续按本来方向行驶。如此循环,达到避障目。
4.2 模块程序设计阐明
在程序中我采用了两个计数器溢出中断,其中一种是T0计数器溢出中断,是用来计算障碍物距离,如果障碍物距离超过测距范畴,运用该中断设立标志位。另一种是T1计数器溢出中断,我运用该中断控制超声波发射时间间隔,即对路面障碍物检测时间间隔,来适时判断路面状况,变化小车行驶方向,达到小车躲避行驶过程中遇到障碍物。
4.3 超声波避障程序
只需提供一种10us以上脉冲信号,该模块内部将发出8个40KHz周期电平并检测回波。一旦检测到有回波信号则输出回响信号。回响信号脉冲宽度与所测距离成正比。由此通过发射信号到接受到回响信号时间间隔可以计算得到距离。
4.4驱动模块程序
当在主程序中当计数器T1溢出中断响应时,会一方面判断障碍物距离与否不大于设定安全距离(被设计中为40cm),若不不大于安全距离,小车继续按本来方向行驶,若不大于安全距离,小车一方面左转90度,停下并启动超声波避障程序再次对前方路况进行障碍有无检测,若无障碍物或有障碍但不不大于安全距离,小车沿该方向迈进,反之当障碍物距离不大于安全距离时,小车向右旋转180度,停止并再次启动超生波避障程序,对前方路况进行检测,若无障碍物或有障碍物但距离不不大于安全距离,小车沿该方向迈进,反之当障碍物距离不大于安全距离时。小车向右转90度,沿该方向行驶。如此循环实现避障。
5 小车整体程序某些
#include <reg52.h> //器件配备文献
#include <intrins.h>
sbit RX=P2^2; //接受端口
sbit TX=P2^3; //发射端口
//驱动引脚定义
sbit IN1=P1^0; //M2
sbit IN2=P1^1;
sbit IN3=P1^2; //M1
sbit IN4=P1^3;
unsigned int time=0;
unsigned long S=0,num=0;
bit flag=0; /*---------------------------- uS延时函数大体延时 长度如下 T=tx2+5 uS --------------------*/
void DelayUs2x(unsigned char t)
{
while(--t);
}
/*---------------------------------mS延时函数---------------------------------*/
void DelayMs(unsigned char t)
{
while(t--)
{
//大体延时1mS
DelayUs2x(245);
DelayUs2x(245);
}
}
void delay(void)
{
DelayMs(200);DelayMs(200);
DelayMs(200);DelayMs(200);
DelayMs(200);DelayMs(200);
DelayMs(200);DelayMs(200);
}
/*********驱动模块********************/
forword() //迈进
{
IN1=1;
IN2=0;
IN3=1;
IN4=0;
}
turn_left() //左拐
{
IN1=1;
IN2=0;
IN3=0;
IN4=0;
}
turn_right() //右拐
{
IN1=0;
IN2=0;
IN3=1;
IN4=0;
}
stop() //停止
{
IN1=0;
IN2=0;
IN3=0;
IN4=0;
}
/*****T0中断用来计数器溢出,超过测距范畴******/
void zd0() interrupt 1
{
flag=1; //中断溢出标志
}
/*********启动超生波模块*****************/
void StartModule()
{
TX=1; //启动一次模块
DelayUs2x(8); //延时大概20us
TX=0;
while(!RX); //当RX为零时等待
TR0=1; //启动计数
while(RX); //当RX为1计数并等待
TR0=0; //关闭计数
}
unsigned int count()
{
time=TH0*256+TL0;
TH0=0;
TL0=0;
S=(time*1.7)/100;
//算出来是CM
if((S>=700)||flag==1)//超过测量范畴
{
flag=0;S=700;
} DelayMs(80); //80MS
return S;
} //定期器T1溢出中断一定期间启动一次测距模块
void time1()interrupt 3
{
ET1=0;
TR1=0;
TH1=(65536-15536)/256;
TL1=(65536-15536)%256;
StartModule();
num=count();
if(num<40)
{
turn_left();
delay();//延时1.6s完毕转向
stop();
StartModule();//启动一次模块
num=count();//计算障碍物距离
if(num<40)
{
turn_right();
delay();//延时3.2s完毕转向
delay();
stop();
StartModule();//启动一次模块 num=count();//计算障碍物距离
if(num<40)
{
turn_right();
delay();//延时1.6s完毕转向 forword();
}
else forword();
}
else forword();
}
else forword();
ET1=1;TR1=1;
}
/**************主函数*********************/
void main()
{
unsigned int i=0;
TMOD=0x11;
//设T0为方式1,GATE=1;
TH0=0;
TL0=0;
ET0=1; //容许T0中断
TH1=(65535-15536)/256;
TL1=(65535-15536)%256;
ET1=1; //容许T1中断
TR1=1;
EA=1; //启动总中
while(1)
{
forword();
}
}
展开阅读全文