智能循迹小车设计报告Word格式文档下载.docx
《智能循迹小车设计报告Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《智能循迹小车设计报告Word格式文档下载.docx(18页珍藏版)》请在冰点文库上搜索。
技术方案概要说明
本模型车的电路系统包括电源管理模块、单片机模块、传感
器模块、电机驱动模块。
工作原理:
Ø
利用红外采集模块中的红外发射接收对管检测路面上的轨迹
将轨迹信息送到单片机
单片机采用模糊推理求出转向的角度和行走速度,然后去控制
行走部分
最终完成智能小车可以按照路面上的轨迹运行。
硬件电路的设计
1、最小系统:
小车采用STC89C52单片机作为控制芯片,图1是其最小系统电路。
主要包括:
时钟电路、电源电路、复位电路。
其中各个部分的功能如下:
1、时钟电路:
给单片机提供一个外接的12MHz的石英晶振。
2、电源电路:
给单片机提供5V电源。
3、复位电路:
在电压达到正常值时给单片机一个复位信号。
图1单片机最小系统原理图
2、电源电路设计:
模型车通过自身系统,采集赛道信息,获取自身速度信息,加以处理,由芯片给出指令控制其前进转向等动作,各部分都需要由电路支持,电源管理尤为重要。
在本设计中,51单片机使用5V电源,电机及舵机使用6V电源。
考虑到电源为充电电池组,额定电压为7.2V,实际充满电后电压则为6.5-6.8V,所以单片机及传感器模块采用7805稳压后的5V电源供电,舵机及电机直接由电池供电。
3、传感器电路:
光电寻线方案一般由多对TCRT5000红外收发管组成,通过检测接收到的反射光强,判断黑白线。
原理图由红外对管和电压比较器两部分组成,红外对管输出的模拟电压通过电压比较器转换成数字电平输出到单片机。
外形及封装:
图3L9110实物图
L9110电路原理图:
由于一片L298N可以直接驱动两个电机,但是为了加大驱动力,我们采用两路并联的方式来驱动电机。
图3.3L9110电路图
软件系统的实现
小车循迹规则:
若小车偏左的时候,车轮将向右偏转;
若小车偏右,车轮将向左偏转;
若没有偏移,小车将继续向前;
若小车完全偏离黑色轨迹,小车后退以寻找黑色轨迹。
小车程序:
#include<
AT89X52.h>
//调用51单片机的头文件
intrins.h>
math.h>
#defineucharunsignedchar//宏定义
#defineuintunsignedint//宏定义
sbityou1=P1^3;
//定义单片机控制右边电机的引脚
sbityou2=P1^4;
sbitzuo1=P1^5;
//定义单片机控制左边电机的引脚
sbitzuo2=P1^6;
sbitz=P1^1;
//定义单片机连接循迹板左边光电管的引脚
sbity=P1^0;
//定义单片机连接循迹板右边光电管的引脚
sbitq=P1^2;
//定义单片机连接循迹板前边光电管的引脚
sbitchongshua=P3^6;
//定义单片机控制冲刷的引脚
sbittuodi=P3^7;
//定义单片机控制拖地的引脚
//---------------------------------------
//1602液晶相关I/O设置
sbitE=P2^3;
//1602液晶的E脚接在P2.3口上
sbitRW=P2^4;
//1602液晶的RW脚接在P2.4口上
sbitRS=P2^5;
//1602液晶的RS脚接在P2.5口上
//HC-SR04相关I/O设置
sbitTIRG=P3^4;
//定义IO口,具体可以去查看原理图
sbitECHO=P3^2;
//定义IO口,具体可以去查看原理图
bitflag=0;
uchark;
uchara=0;
//定义一个变量a,用来读取串口的数据
voiddelay(uintz)//一个带参数的延时程序
{
inti,j;
//定义两个变量
for(i=10;
i>
0;
i--)
for(j=z;
j>
j--);
//将参数z赋值给j
}
voidinit()//初始化子程序
TMOD=0x20;
//设置定时器T1为工作方式2
TH1=0xfd;
TL1=0xfd;
//T1定时器装初值
TR1=1;
//启动定时器T1
REN=1;
//允许串口接收
SM0=0;
SM1=1;
//设置串口工作方式1
EA=1;
//开总中断
ES=1;
//开串口中断
voidqian()//左右轮协同前进子函数
you1=0;
you2=1;
zuo1=0;
zuo2=1;
delay(6);
//pwm调速此为pwm有效值
you1=1;
zuo1=1;
delay(4);
voidzuo()//左右轮协同左转子函数
zuo2=0;
delay(9);
delay
(1);
voidmzuo()//左右轮协同左转子函数
delay(10);
delay(5);
voidyou()//左右轮协同右转子函数
you2=0;
voidmyou()//左右轮协同右转子函数
voidhou()//左右轮协同前进子函数
voidting()//左右轮都停止转动
voidDelay1602(unsignedintt)
{
unsignedintk;
//定义一个16位寄存器用来做延时用
for(k=0;
k<
t;
k++);
//延时
}
voidLCD1602_busy(void)
P0_7=1;
//将P0.7置1,为读状态做准备
RS=0;
//RS=0、RW=1、E=1时,忙信号输出到DB7,由P0.7读入
RW=1;
E=1;
while(P0_7==1);
//由P0.7读入1,表示1602液晶忙,需要等待
E=0;
//读完以后,恢复E的电平
voidLCD1602_Write_com(unsignedcharcombuf)
//选择指令寄存器
RW=0;
//选择写状态
P0=combuf;
//将命令字通过P0口送至DB
//E高电平将命令字写入1602液晶
//写完以后,恢复E的电平
voidLCD1602_Write_com_busy(unsignedcharcombuf)
LCD1602_busy();
//调用忙检测函数
LCD1602_Write_com(combuf);
voidLCD1602_Write_data_busy(unsignedchardatabuf)
RS=1;
//选择数据寄存器
P0=databuf;
voidLCD1602_Write_address(unsignedcharx,unsignedchary)
x&
=0x0f;
//列地址限制在0-15间
y&
=0x01;
//行地址限制在0-1间
if(y==0)//如果是第一行
LCD1602_Write_com_busy(x|0x80);
//将列地址写入
else//如果是第二行
LCD1602_Write_com_busy((x+0x40)|0x80);
voidLCD1602_init(void)
Delay1602(1500);
//调用延时函数
LCD1602_Write_com(0x38);
//8位数据总线,两行显示模式,5*7点阵显示
Delay1602(500);
LCD1602_Write_com_busy(0x38);
LCD1602_Write_com_busy(0x08);
//显示功能关,无光标
LCD1602_Write_com_busy(0x01);
//清屏
LCD1602_Write_com_busy(0x06);
//写入新的数据后,光标右移,显示屏不移动
LCD1602_Write_com_busy(0x0C);
//显示功能开,无光标
voidLCD1602_Disp(unsignedcharx,unsignedchary,unsignedcharbuf)
LCD1602_Write_address(x,y);
//先将地址信息写入
LCD1602_Write_data_busy(buf);
//再写入要显示的数据
voidTimer0(void)interrupt1
flag=0;
voidxunji()
qian();
//调用前进子函数,使小车光电管不满足以下几个条件时都处于前进状态
while((z==0)&
&
(y==1)&
(q==1))//判断当左边光电管遇到黑线,
{//右边和前边的光电管遇到白线时左转
zuo();
//调用左转函数
zd=1;
}
while((z==1)&
(y==0)&
(q==1))//判断当右边光电管遇到黑线,
{//左边和前边的光电管遇到白线时右转
you();
//调用右转函数
yd=1;
(q==1))//判断当左边光电管遇到黑线,右边光电管也遇到黑线
{//前边的光电管遇到白线时停止
ting();
//调用停止函数
hd=1;
(q==0))//判断当左边、右边、前边光电管同时遇到黑线
{//即遇到十字路口,小车前进
qian();
//调用前进函数
voidcsb()
longS;
unsignedinti;
unsignedintTimeout;
LCD1602_init();
//调用1602液晶初始化函数
//***定时器Timer0初始化***
TMOD&
=0xF0;
//将TMOD的低4位定时器0控制部分清零
TMOD|=0x01;
//设置定时器0为方式1
TMOD=0x01;
TL0=0;
//设置定时器0初值低8位
TH0=0;
//设置定时器0初值高8位
TR0=0;
//停止定时器0
ET0=1;
//Timer0中断允许
//***开全局中断设置****
//定时器Timer0设置了中断允许,此处要开全局中断
//开全局中断
TIRG=1;
//发一个脉冲触发信号
i=4;
//维持约17US,符合不低于10US的要求
while(i>
0)//维持约17US,符合不低于10US的要求
i--;
//维持约17US,符合不低于10US的要求
TIRG=0;
//撤销触发信号
TR0=0;
//关闭定时器
TL0=0;
//设置定时器0初值低8位为0
TH0=0;
//设置定时器0初值高8位为0
k=0;
//清除溢出标志
flag=0;
Timeout=0;
while((ECHO==0)&
((Timeout++)<
50000));
//等待回响高电平
TR0=1;
//回响高电平来后启动定时器
while((ECHO==1)&
//等待回响高电平结束后
S=((TH0*256+TL0)*1)/58;
if(flag==1||S>
400)//超出测量范围显示“-”
{
LCD1602_Disp(0,0,'
-'
);
//显示百位-
LCD1602_Disp(1,0,'
//显示十位-
LCD1602_Disp(2,0,'
//显示个位-
LCD1602_Disp(3,0,'
C'
//显示C
LCD1602_Disp(4,0,'
M'
//显示M
else
{
LCD1602_Disp(0,0,S%1000/100+'
0'
//显示百位
LCD1602_Disp(1,0,S%1000%100/10+'
//显示十位
LCD1602_Disp(2,0,S%1000%100%10+'
//显示个位
//显示C
//显示M
i=18000;
//维持约77400US,符合不低于60MS的要求
0)//维持约77400US,符合不低于60MS的要求
//维持约77400US,符合不低于60MS的要求
voidmain()//主程序
init();
//调用初始化子程序
while
(1)//死循环
{
switch(a)//判断a从串口读取到的数据
{
case0x00:
//如果是0x1f就前进
xunji();
break;
case0x01:
//如果是0x2f就后退
case0x02:
//如果是0x3f就左转
csb();
case0x03:
//如果是0x4f就右转
mzuo();
case0x04:
//如果是0x00就停止
hou();
case0x05:
//如果是0xa0车灯打开
myou();
case0x06:
//如果是0xb0车灯关闭
chongshua=1;
case0x07:
//如果是0xc0蜂鸣器鸣响
case0x08:
tuodi=1;
}
}
voidchuan()interrupt4//串口中断服务程序
RI=0;
//软件清除串口响应
a=SBUF;
//读取单片机串口接受的蓝牙模块发送的数据
结论
根据本次设计要求,我们小组系统地阅读了大量的资料,并认真分析了设计课题的需求,还系统学习了51系列单片机的工作原理及其使用方法,并独自设计智能小车的整个项目。
虽然条件艰苦,但经过不懈钻研和努力,购买到了所有所需的元器件,并系统的进行了多项试验,最终做出了整个小车的硬件系统,然后结合课题任务和小车硬件进行了程序的编制,本系统能够基本满足设计要求,能够较快较平稳的是小车沿引导线行驶,但由于经验能力有限,该系统还存在着许多不尽人意的地方有待于进一步的完善与改进。
通过本次课题设计,不仅是对我们课本所学知识的考查,更是对我的自学能力和收集资料能力以及动手能力的考验。
本次毕业设计使我们对一个项目的整体设计有了初步认识,还认识了几种传感器,并能独立设计出其接口电路,再有对电路板的制作有了一定的了解,并学会了使用Protel设计电路。
本次毕业设计使我们意识到了实验的重要性,在硬件制作和软件调试的过程中,出现了很多问题,最终都是通过实验的方法来解决的。
还有以前对程序只是一个很模糊的概念,通过这次的课题设计使我对程序完全有了一个新的认识,并能使用C熟练的进行编程了。
通过本次课题设计,极大的锻炼了我们的思考和分析问题的能力,并对单片机有了一个更深的认识。
总之,在课题设计的过程中,无论是对于学习方法还是理论知识,我们都有了新的认识,受益匪浅,这将激励我们在今后再接再厉,不断完善自己的理论知识,提高实践运作能力。