单片机课程设计智能小车.docx
《单片机课程设计智能小车.docx》由会员分享,可在线阅读,更多相关《单片机课程设计智能小车.docx(42页珍藏版)》请在冰点文库上搜索。
单片机课程设计智能小车
单片机课程设计
智
能
小
车
学院:
电子工程学院
指导教师:
制作人:
制作时间:
2010/7/13
二、系统方案论证与选择4
6
7
三、硬件系统的设计与功能实现8
电源电路原理与设计10
四、软件设计的实现与说明10
红外接收程序17
25
循迹小车黑线程序28
30
八、参考文献:
33
摘要
智能车辆是当今车辆工程领域研究的前沿,它体现了车辆工程、人工智能、自动控制、计算机等多个学科领域理论技术的交叉和综合,是未来汽车发展的趋势。
本小组设计制作的一款智能小车,本文介绍一款红外线遥控小车,以STEC89C52单片机为核心控制器,用L283驱动直流电机工作,控制小车的运行。
本款小车具有红外线遥控手动驾驶、自动驾驶、寻迹前进等功能。
本系统采用模块化设计,软件用C语言编写。
本作品以四个直流减速电机为驱动,通过各类传感器件来采集信息,送入主控单元STC89C52单片机,处理数据后完成相应的操作,以实现相应的功能。
直流减速电机采用电机专用驱动芯片L293进行驱动,其中采红外接收发送模,来实现避障、循迹;
关键词:
小车底盘、无线遥控、STC89C52、L293、HD74HCO4P
一、设计任务和要求
以STEC89C52单片机为核心,制作一款红外遥控小车,小车具有自动驾驶,手动驾驶和循迹前进等功能。
自动驾驶时,前进过程中可以避障。
手动驾驶时,遥控控制小车前进、后退、左转、右转等操作。
寻迹前进时小车还可以按照预先 设计好的轨迹前进。
1.1设计任务概述
设计制作一个智能小车,该小车能按照要求自动前进、后退、左转、右转。
能通过预设好的黑色路线自动循迹。
1、实现前进、后退、左转、右转.
2、前进过程中遇到障碍物能自动停止,从而进行人为操作(图一)
3、循迹电路是用以实现小车沿着场地的黑色弧形引导轨迹BC进行前进,并校正的,且小车不能偏离该轨迹。
(图三)
(图一)
路径黑线的识别的准确程度决定智能车能否完成快速、稳定的寻线。
识别装置由高发射功率红外光电二极管和高灵敏度光电晶体管组成,以非接触检测方式检测距离可调整达4~20mm。
为了精确测定智能车的相对位置,将3对ST178并排安放在车底盘下部的前端,其分布垂直于智能车行走的方向。
当车行走时,保持3个发光管发光,当某一个光电对管的下方为黑色轨迹时,相应的接收管输出为高电平,而下方为白色路面的接收管输出为低电平。
再经数据处理后,控制系统就可以分析出当前车行走的位置,从而达到调整智能车运行状态的目的。
例如,假设路面黑线的宽度为三组红外线对管的宽度,当黑线在车体中间时,7个输入引脚为28H(0011100);当车体左或右偏时,接收到的数据会改变,即“1”会相应的左移或右移,如0001110(右偏)、0111000(左偏),偏移幅度不同,“1”的移动位数便不同
(图二)
二、系统方案论证与选择
根据题目中的设计要求,本系统主要由微控制器模块、电源模块、避障模块、循迹传感器模块、直流电机及其驱动模块等构成。
本系统的方框图如图1所示:
系统总框图
为较好的实现各模块的功能,我们分别设计了几种方案并分别进行了论证。
方案1:
购买玩具电动车。
购买的玩具电动车具有组装完整的车架车轮、电机及其驱动电路。
玩具电动车的电机多为玩具直流电机,力矩小,空载转速快,负载性能差,不易调速。
而且这种电动车一般都价格不菲。
因此我们放弃了此方案。
方案2:
自己制作电动车。
经过反复考虑论证,我们制定了四两轮分别驱动,即四个轮分别用四个转速和力矩基本完全相同的直流电机进行驱动。
这样,当两个直流电机转向相反同时转速相同时就可以实现电动车的原地旋转,由此可以轻松的实现小车坐标不变的90度和180度的转弯。
方案3:
通过淘宝网上订购小车车体,因为实验室的材料限制,所以我们选择此方案
小车实物
方案一:
采用凌阳公司的16位单片机,它是16位控制器,具有体积小、驱动能力强、可靠性高、功耗低、结构简单、具有语音处理、运算速度快等优点,但考虑到我们小组对这个方案采用的微处理器并不熟悉,使用起来并不是很方便,这对于硬件电路的设计和软件编程增加了难度。
我们决定不再使用此方案,考虑其他方案。
方案二:
采用STC89C52单片机作为主控制器。
STC89C52是一个超低功耗,和标准51系列单片机相比较具有运算速度快,抗干扰能力强,支持ISP在线编程,片内含8k空间的可反复擦写1000次的Flash只读存储器,具有256bytes的随机存取数据存储器(RAM),32个I/O口,2个16位可编程定时计数器。
其指令系统和传统的8051系列单片机指令系统兼容,降低了系统软件设计的难度,电路设计简单、价格低廉,在后来的实验中我们发现,STC89C52精确度和运算速度也都完全符合我们系统的要求。
综合以上方案我们选择比较普通的更为熟悉的方案二使用STC89C52单片机为我们整个系统的控制核心。
由于本系统需要给救援小车系统供电,我们考虑如下几种方案:
方案一:
采用7.2V可充电动力电池组。
动力电池组具有较强的电流驱动能力及稳定的电压输出性能,经测试在用此种供电方式下,单片机和传感器工作稳定,直流电机工作良好,且电池体积较小、可以充电、能够重复利用等,能够满足系统的要求。
方案二:
采用为直流电机供电,将两个6V电压分别给单片机系统和其它芯片供电。
由于小车耗电量大,故选择容易更换的电池组
综上考虑,我们选择了方案二来完成智能小车系统供电的任务。
方案一:
采用直流减速电机。
直流减速电机转动力矩大,体积小,重量轻,装配简单,使用方便,小车电机内部装有减速齿轮组,所以并不需要考虑调速功能,很方便的就可以实现通过单片机对直流减速电机前进、后退、停止等操作,
方案二:
采用步进电机作为该系统的驱动电机,由于其转动的角度可以精确定位,可以实现小车前进距离和位置的精确定位。
虽然采用步进电机有诸多优点,但步进电机的输出力矩较低,随转速的升高而下降,且在较高的转速时会急剧下降,其转速较低时不适于小车等对速度有一定要求的系统。
经综合比较分析我们决定放弃此方案。
综合以上考虑我们选择方案一的直流减速电机作为整个救援小车的驱动电机。
方案一:
采用分立组件组成的平衡式驱动电路,这种电路可以由单片机直接对其进行操作,但由于分立组件占用的空间比较大,还要配上两个继电器,考虑到小车的空间问题,此方案不够理想,我们决定放弃此方案。
方案二:
因为小车电机内部装有减速齿轮组,考虑不需调速功能,采用市面易购的电机驱动芯片L293控制减速电机,该芯片是利用TTL电平进行控制,通过改变芯片控制端的输入电平,即可以对电机进行正转、反转和停止操作,亦能满足直流减速电机的要求,用该芯片作为电机驱动具有的操作方便、稳定性好等优点。
综合以上分析与论证我们选择方案二的驱动芯片L293D作为整个救援小车系统的电机驱动电路。
方案一:
用超声波传感器进行避障。
超声波传感器的原理是:
超声波由压电陶瓷超声波传感器发出后,遇到障碍物便反射回来,再被超声波传感器接收。
超声波传感器在避障的设计中被广泛应用。
但是超声波传感器需要40KHz的方波信号来工作,因为超声波传感器对工作频率要求较高,偏差在1%内,所以用模拟电路来做方波发生器比较难以实现。
因此我们考虑其它的方案。
方案二:
用漫反射式光电开关进行避障。
光电开关的工作原理是根据光线发射头发出的光束,被物体反射,其接收电路据此做出判断反应,物体对红外光由同步回路选通而检测物体的有无。
当有光线反射回来时,输出低电平。
当没有光线反射回来时,输出高电平。
考虑到本系统只需要检测障碍物,没有十分复杂的环境。
为了使用方便,便于操作和调试,我们最终选择了方案二。
光电开关的实物如下图:
方案三:
通过红外接收发送来实现,它测量距离近,但反应灵敏、准确。
相比光电传感器而言,其体积较小,价格低,安装较容易.
方案一:
用光敏电阻组成光敏探测器。
光敏电阻的阻值可以跟随周围环境光线的变化而变化。
当光线照射到白线上面时,光线发射强烈,光线照射到黑线上面时,光线发射较弱。
因此光敏电阻在白色轨迹上方和黑色轨迹上方时,阻值会发生明显的变化。
将阻值的变化值经过比较器就可以输出高低电平。
单片机据此来判断小车是否偏离轨道,并根据反馈来不同的电平信号,发出相应的控制操作命令来校验小车的位置。
来完成小车的循迹任务。
但是这种方案的缺点是受环境中光线的影响很大,不能够稳定的工作。
因此我们考虑其它更加稳定的方案。
方案二:
用HD74HCO4P红外接收发送模块来为系统循迹。
HD74HCO4P芯片构成的是集成电路,因此具有体积小,结构集成紧凑,灵敏度高,容易调整。
。
经测试方案二不论是在黑暗或者是强光照射下,小车系统均可以很稳定的工作,对环境的适应能力较强。
因此我们选择方案二
。
2.8智能救援小车最终方案
经过反复的探讨和论证我们最终确定智能救援小车的如下最终方案:
1.车体采用购买的整体车体
2.采用STC89C52单片机作为整个电路的控制核心。
3.使用八节电池为系统提供基准电源。
4.采用直流减速电机作为小车系统的驱动电机。
5.使用电机专用驱动芯片L293作为直流减速电机的驱动芯片。
红外接收发送模块器组成小车的避障、循迹系统。
三、硬件系统的设计与功能实现
小车主线路板制作
微控制器电路是整个智能救援小车系统的核心控制部分,它负责对各路传感信号的采集、处理、分析及对各部分硬件电路进行调整。
本设计制作的智能救援小车系统以STC89C52单片机最小系统电路为整个系统的控制电路,通过各种传感器电路,采集各种传感器信息,以发出各种控制信号命令,来完成相应的操作,单片机控制电路原理图如所示:
单片机控制电路原理图
电源电路原理与设计
本设计中采用的电机专用驱动芯片L293D。
L293D是欧洲著名的SGS公司的产品,为单块集成电路、高电压、高电流、四通道驱动。
设计用来接收DTL或者TTL逻辑电平,驱动感性负载(比如继电器,直流电机),和开关电源晶体管。
内部包含4通道逻辑驱动电路。
其额定工作电流为1A,最大可达1.5A,Vss电压最小4.5V,最大可达36V。
输入引脚和输出引脚的逻辑关系
L293d可直接的对电机进行控制,无须隔离电路。
通过单片机的I/O输入改变芯片控制端的电平,即可以对电机进行正反转,停止的操作(表1是其使能端、输入引脚和输出引脚的逻辑关系。
),操作非常方便,亦能满足直流减速电机的大电流要求。
调试时在依照上表,用程序输入对应的码值,即可以实现对应的操作。
其驱动电路原理图如下所示:
四、软件设计的实现与说明
我们所设计的软件的主程序流程图如下图所示:
五、系统程序
include
#definesen_portP1
#defineLEDP0
sbitEN1=P2^2;
sbitIN1=P2^3;
sbitIN2=P2^4;
sbitEN2=P2^5;
sbitIN3=P2^6;
sbitIN4=P2^7;
sbitbeed=P2^0;
sbitstart_botton=P1^6;//thesecondtoucthbotton
sbitstop_botton=P1^7;//thefristtoucthbotton
unsignedcharpattern=0;
voiddelay(unsignedlongn)//延时子程序
{
unsignedinti,j,k;
for(i=n;i>0;i--)
for(j=10;j>0;j--)
for(k=50;k>0;k--);
}
unsignedcharsensor_inp()
{
unsignedcharsensor;
sensor=sen_port;
sensor&=0x07;
//LED=sensor|0xf8;
returnsensor;
}
/*********************************motorcontrolprogram************************/
voidfaward()
{
IN1=1;
IN2=0;
IN3=1;
IN4=0;
EN1=1;
EN2=1;
}
voidturn_left()
{
IN1=1;
IN2=0;
IN3=0;
IN4=0;
EN1=1;
EN2=1;
}
voidturn_right()
{
IN1=0;
IN2=0;
IN3=1;
IN4=0;
EN1=1;
EN2=1;
}
voidstop()
{
EN1=0;
EN2=0;
}
/***************************beedcontrolprogram******************************/
voidbeed_on()//beedison
{
beed=0;
}
voidbeed_off()//
{
beed=1;
}
/*******************************start&stop*********************************/
voidturn_onoff()
{
if(start_botton==0)
pattern=1;
if(stop_botton==0)
pattern=0;
}
/********************************check_line***********************************/
voidcheck_line()
{
if(sensor_inp()==0x03)
{
LED=0xf0;
pattern=21;
}
if(sensor_inp()==0x06)
{
LED=0x0f;
pattern=31;
}
}
/********************************main*****************************************/
voidmain(void)
{
LED=0x55;
delay(150);
LED=0xAA;
delay(150);
LED=0xff;
while
(1)
{
turn_onoff();
switch(pattern)
{
case0:
//waitingforthestartbotton
stop();
LED=0x1f;
delay(30);
LED=0xf8;
delay(30);
break;
case1:
//thetimetostart
stop();
LED=0x7f;
beed_on();
delay(80);
beed_off();
delay(60);
LED=0x0f;
beed_on();
delay(80);
beed_off();
delay(60);
LED=0x00;
beed_on();
delay(120);
beed_off();
delay(40);
pattern=11;
break;
case11:
//flowingtheblackline
check_line();
switch(sensor_inp())
{
case0x02:
faward();break;
case0x04:
turn_right();break;
case0x01:
turn_left();break;
default:
break;
}
break;
case21:
turn_left();
beed_on();
delay(20);
beed_off();
delay(80);
pattern=22;
break;
case22:
//stopcarinleftcart
switch(sensor_inp())
{
case0x02:
faward();break;
case0x04:
turn_right();break;
case0x01:
turn_left();break;
case0x07:
stop();pattern=0;break;
default:
break;
}
break;
case31:
turn_right();
beed_on();
delay(20);
beed_off();
delay(80);
pattern=32;
break;
case32:
//stopcarinrightcart
switch(sensor_inp())
{
case0x02:
faward();break;
case0x04:
turn_right();break;
case0x01:
turn_left();break;
case0x07:
stop();pattern=0;break;
default:
break;
}
break;
default:
break;
}
}
}
#include
#include
#defineucharunsignedchar
#defineuintunsignedint
#definesen_portP1//传感器入口
sbitEN1=P2^0;
sbitIN1=P2^1;
sbitIN2=P2^2;
sbitEN2=P2^3;
sbitIN3=P2^4;
sbitIN4=P2^5;
sbitbz=P1^4;
voiddelay1(uintx)
{
uinta,b;
for(a=x;a>0;a--)
for(b=1000;b>0;b--);
}
voiddelay(unsignedlongn)//延时子程序
{
unsignedinti,j,k;
for(i=n;i>0;i--)
for(j=10;j>0;j--)
for(k=50;k>0;k--);
}
unsignedcharsensor_inp()
{
unsignedcharsensor;
sensor=sen_port;
sensor&=0x07;
P1=sensor;
returnsensor;
}
voidfaward()
{
IN1=1;
IN2=0;
IN3=1;
IN4=0;
EN1=1;
EN2=1;
}
voidbackward()
{
IN1=0;
IN2=1;
IN3=0;
IN4=1;
EN1=1;
EN2=1;
}
voidturn_left()
{
IN1=1;
IN2=0;
IN3=0;
IN4=1;
EN1=1;
EN2=1;
}
voidturn_right()
{
IN1=0;
IN2=1;
IN3=1;
IN4=0;
EN1=1;
EN2=1;
}
voidleft()
{
IN1=1;
IN2=0;
IN3=0;
IN4=0;
EN1=1;
EN2=1;
}
voidright()
{
IN1=0;
IN2=0;
IN3=1;
IN4=0;
EN1=1;
EN2=1;
}
voidstop()
{
EN1=0;
EN2=0;
}
voidxunji()
{
//delay(10);
switch(sensor_inp())
{
case0x02:
faward();break;
case0x01:
right();break;
case0x04:
left();break;
default:
break;
}
}
voidbizang()
{
if(bz==0)
{
backward();
delay1(10);
turn_left();
delay1(8);
}
else
{
faward();
}
}
voidmain(void)
{
init_IR();
while
(1)
{
switch(read_IR())
{
case0x1c:
bizang();break;
case0x19:
xunji();break;
case0x14:
turn_left();break;
case0x13:
faward();break;
case0x10:
turn_right();break;
case0x17:
backward();break;
case0x0e:
stop();break;
default:
break;
}
}
}
红外遥控程序
#include
#include
sbitbeep=P2^0;
sbitinf=P3^3;
sbitled1=P2^1;
sbitCLK=P1^0;
sbitDAT=P1^1;
ucharkey_code=255;
uintbuf_key_code=0;
ucharkey_bit_count=0;
uintcount_T=0,buf_CT=0;
ucharcommon_code_count=0;
ucharinf_status=0;
unsignedcharw[4];
unsignedcharcodetab[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e};//0-11,-,全灭(共阳字段表)
/*********