基于单片机的智能小车控制.docx
《基于单片机的智能小车控制.docx》由会员分享,可在线阅读,更多相关《基于单片机的智能小车控制.docx(24页珍藏版)》请在冰豆网上搜索。
基于单片机的智能小车控制
信息工程专业
课程设计
(二)
题目
基于《STC89C52》单片机的智能小车
姓名
袁诚
学号
2014116020431
所在院系
教育信息与技术
所在班级
1404
完成时间
2016.6.25
基于单片机的智能小车
摘要:
智能化作为现代电子产品的新趋势,是今后的电子产业的发展方向。
智能化设计的电子产品可以按照预先设定的模式在一个环境里自动运作,不需要人为的管理,可应用于科学勘探、环境监测、智能家居等方面。
基于单片机的智能小车控制就是其中的一个体现。
本设计实现了一种基于51单片机的按键操作控制和温度检测显示系统,通过温度传感器采集温度数据并且通过显示模块显示出来,通过对按键的操作,自动控制转向电机转向,改变行驶方向。
本课题设计的智能小车,具有按键控制前后左右的功能,温度采集功能,液晶显示功能。
序言1
第1章总体设计方案2
1.1课题任务分析2
1.2方案论证3
1.2.1小车驱动部分3
1.2.2温度显示部分3
第2章系统硬件构成4
2.1系统设计原理4
2.2主要元器件简介4
2.2.1STC89C52RC简介4
2.2.2液晶显示电路5
2.2.3L298N芯片直流电机驱动模块6
2.2.4遥控部分独立按键电路7
第3章软件的设计与说明8
3.1软件设计8
3.2软件的说明9
3.2.1控制部分主程序流程9
3.2.2温度检测显示部分主程序流程图10
第4章调试与总结12
4.1调试的总结12
参考文献13
致谢14
附录15
附件1L298N电机驱动模块15
附件2小车侧视图16
附件3小车俯视图16
附件4小车最终硬件图17
附件5程序清单18
序言
随着我国科学技术的进步,智能化和自动化技术越来越普及,各种高科技也广泛应用于智能小车和机器人玩具制造领域,使智能机器人越来越多样化。
智能小车是一个多种高新技术的集成体,它融合了机械、电子、传感器、计算机硬件、软件、人工智能等许多学科的知识,涉及到当今许多前沿领域的技术[1]。
而智能电动车正是智能机器人的一种,具有不可估量的实际意义。
智能车辆是一个运用计算机、传感、信息、通信、导航、人工智能及自动控制等技术来实现环境感知、规划决策和自动行驶为一体的高新技术综合体。
它在军事、民用和科学研究等方面已获得了应用,对解决道路交通安全提供了一种新的途径。
随着汽车工业的迅速发展,关于汽车的研究也就越来越受人关注。
全国电子大赛和省内电子大赛几乎每次都有智能小车这方面的题目,全国各高校也都很重视该题目的研究,许多国家已经把电子设计比赛作为创新教育的战略性手段。
电子设计涉及到多个学科,机械电子、传感器技术、自动控制技术、人工智能控制、计算机与通信技术等等,是众多领域的高科技。
电子设计技术,它是一个国家高科技实例的一个重要标准,可见其研究意义很大。
第1章总体设计方案
1.1课题任务分析
本文设计了智能小车控制系统。
智能小车是一个运用传感器、单片机、信号处理、电机驱动及自动控制等技术来实现环境感和自动行驶为一体的高新技术综合体,它在军事、民用和科学研究等方面已获得了应用。
通过各种选题之后,我发现制作智能小车非常有意思,它唤起我们对玩具的革新思想,智能小车制作的兴趣。
自己遇到过的汽车的功能是怎样的,想通过自己的手创作出属于自己的智能汽车。
也夹杂一种童年时对玩具智能化的假想。
所以我选定制作单片机智能小车。
通过这次设计,掌握51单片机的原理,了解简单传感器组成原理,初步掌握传感器的调整及测试方法,提高动手能力和排除故障的能力。
同时通过本课题设计与装配、调试,提高自己的动手能力,巩固已学的理论知识,建立单片机理论和实践的结合,了解传感器各单元电路之间的关系及相互影响,从而能正确设计、计算定时计数的各个单元电路。
初步掌握传感器的调整及测试方法。
提高动手能力和排除故障的能力。
本设计采用直流电机,电机专用驱动芯片L298N进行电机驱动控制,主控芯片为STC89C52,控制器部分采用简单按键,温度数据的采集采用DS18B20温度传感器模块,显示部分采用1602液晶。
本次设计虽然只是一个演示模型,但是具有充分的科学性和实用性。
首先我们根据汽车的复杂情况,按照现有材料搭建一个小车模型,车轮,车身,直流电机,按键,温度传感器,单片机,L29BN电机驱动模块等。
DS18B20温度传感器将检测到的温度数据传给单片机,单片机根据接收到的信号进行处理再传给显示
模块显示,由按键模块控制小车进行倒车、前进、左转、右转等动作。
1.2方案论证
1.2.1小车驱动部分
方案一:
小车的电机驱动部分采用自己搭建的9012三极管电路来实行小车的驱动,9012三极管电路具有电路简单,操作方便的等特点。
方案二:
小车的电机驱动部分采用L298N芯片直流电机驱动模块,该模块具有较大的驱动带载能力,驱动部分端子供电范围Vs:
+5V~+35V,并且另外自带了5V、3V的输出端口。
方案论证:
本设计为2轮驱动的小车,对于小车驱动部分要求能够有较大的帯载能力,并且在小车的实际设计过程中,需要不同的输出电压来提供给小车的各个模块。
因此综上所述采用方案二,小车的电机驱动部分使用L298N芯片直流电机驱动模块。
1.2.2温度显示部分
方案一:
温度的显示通过数码管显示,数码管驱动简单,但是所能显示的字符数量有限有局限性
方案二:
用液晶来显示温度传感器采集到的温度,虽然操作比数码管要复杂一点,但是功能比数码管要强大很多,能够显示各种各样的字符
方案论证:
本设计是要显示温度,并且要显示需要显示英文字符,数码管无法满足要求,因此采用1602液晶来做显示模块
第2章系统硬件构成
2.1系统设计原理
本设计主要分为两部分:
按键控制部分和温度检测部分。
控制部分主要由电源电路,单片机最小系统,按键模块和电机驱动模块组成,遥控部分的系统框图如图2-1所示。
小车部分由电源电路,单片机最小系统,显示电路,无线电木块,报警电路,超声波电路等电路模块组成,小车部分的系统框图如图2-2所示。
2.2主要元器件简介
2.2.1STC89C52RC简介
常用的单片机有很多种:
Intel8051系列、Motorola和M68HC系列、Atmel的AT89系列、台湾华邦(Winbond)W78系列、荷兰PiliPs的PCF80C51系列、MicrochiP公司系列4位单片机、台湾义隆的EM-78系列等[1]。
本次设计最终选用了STC89C52单片机。
本系统采用最常用的STC89C52单片机,它是一种带4K字节闪烁可编程可擦除只读存储器(FPEROM—FalshProgrammableandErasableReadOnlyMemory)的低电压,高性能CMOS8位微处理器。
该器件采用ATMEL高密度非易失存储器制造技术制造,与工业标准的MCS-51指令集和输出管脚相兼容。
由于将多功能8位CPU和闪烁存储器组合在单个芯片中,ATMEL的STC89C52是一种高效微控制器。
STC89C52单片机为很多嵌入式系统提供了一种灵活性高且价廉的方案。
[6]引脚排列如图2-3所示。
图2-3STC89系列引脚排列
2.2.2液晶显示电路
该设计的显示部分采用LCD1602来显示超声波测距模块测得的距离。
对于现实电路我们可以采用数码管,也可以采用液晶显示。
液晶显示相对于数码管显示电路更简洁,显示更明了,故我们采用液晶显示电路。
液晶又分字符型和点阵型,我们使用的液晶是字符型液晶。
LCD1602自带字符库,不需要查找代码,英文字符可直接使用。
液晶电路使用时,如果发现液晶不亮可以调节连接液晶的电位器,调节液晶的亮度。
液晶显示电路如图2-11所示。
图2-11液晶显示电路
2.2.3L298N芯片直流电机驱动模块
该模块由L298N作为双H桥直流电机驱动芯片,驱动部分端子供电范围Vs:
+5V~+35V。
如果在模块上取电压供电,则模块供电范围为Vs:
+7V~+35V。
模块的驱动不封峰值电流Io为2A。
其他相关参数见表2-1。
模块的实物图见附录附件1(注:
红色线框部分为电源接口)。
表2-1L298N芯片直流电机驱动模块产品参数
逻辑部分端子供电范围Vss
+5V~+7V(可板内取电+5V)
逻辑部分工作电流范围
0~36mA
控制信号输入电压范围
低电平:
-0.3V≤Vin≤1.5V
高电平:
2.3V≤Vin≤Vss
使能信号输入电压范围
低电平:
-0.3≤Vin≤1.5V(控制信号无效)
高电平:
2.3V≤Vin≤Vss(控制信号有效)
最大功耗
20W(温度T=75℃时)
存储温度
-25℃~+130℃
驱动板尺寸
82mm*57mm*33mm
(带固定铜柱,散热片高度)
驱动板重量
60g
其他扩展
控制方向指示灯、
逻辑部分板内取电接口
2.2.4遥控部分独立按键电路
遥控部分的独立按键与单片机的接口设置为P1.2、P1.3、P1.4、P1.5,分别控制小车的前进、后退、左转弯、右转弯。
独立按键采用低电平触发,即当按下按键时给单片机一个低电平信号,单片机随后做出相应的处理,当按键松开时,单片机接收到一个高电平信号,单片机随后继续做出相应处理。
控制部分的独立按键电路如图2-12所示。
图2-12控制部分独立按键电路
第3章软件的设计与说明
3.1软件设计
系统功能的实现依赖于软、硬件的协同工作。
主控芯片为STC89C52RC单片机。
单片机控制软件实现遥控和小车的各项功能。
程序编译采用KeiluVision4编程软件,KeiluVision4程序编译界面如图3-1所示。
程序部分采用目前单片机最通用的C语言进行编程。
程序的烧录软件采用STC_ISP_V479软件烧写编译好的HEX文件,STC_ISP_V479软件程序烧写界面如图3-2所示。
图3-1KeiluVision4编程软件界面
图3-2STC_ISP_V479软件程序烧写界面
3.2软件的说明
3.2.1控制部分主程序流程
遥控部分主程序流程图如图3-3所示。
程序从主函数开始执行,独立按键模块初始化,同时在主函数中定义单片机口对应的按键按下时所发出的函数值。
接下来判断是否有按键按下,如果有按键按下,则发送相应的按键对应的函数值,接着判断是否又有按键按下。
如果未发现按键按下则在主函数中循环判断是否有按键按下。
图3-3遥控主程序流程图
3.2.2温度检测显示部分主程序流程图
小车部分主程序流程图如图3-5所示。
程序从主函数开始执行,液晶显示模块初始化,按键模块初始化。
各个模块初始化完毕后,单片机判断是否接受到了DS18B20采集的数据信号,如果接收到信号,处理相应的数值,如果没有接收到新的数值则返回继续判断是否接受到新的信号。
接收到信号后,单片机对应的对液晶的读写进行命令。
图3-5温度检测显示部分流程图
第4章调试与总结
基于单片机的智能小车控制有许多的模块,在做整体设计之前首先是对每个模块的调试。
只有在确保每个模块都正常的情况下才能进行总体的设计和总体的调试。
每个模块都需要软硬件的调试才能确保模块的正常。
单片机的电路系统相对于简单一些,对于焊接只要多练习就不会出现问题,但是,单片机的电路系统中只要出于一处的错误,则会对检测造成很大的不便,而且电路的交叉线较多,对于各种锋利的引脚都要注意处理,否则会刺破带有包皮的导线,则会对电路造成短路现象。
在本次单片机的设计调试中遇到了很多的问题。
回想这些问题只要认真多思考都是可以避免的,主要问题在于电机不能正常速度驱动,原因出于电源电压不够造成的。
解决方案:
更换大功率电源。
4.1调试的总结
通过这次设计,掌握51单片机的原理,了解简单传感器组成原理,初步掌握传感器的调整及测试方法,提高动手能力和排除故障的能力。
同时通过本课题设计与装配、调试,提高自己的动手能力,巩固已学的理论知识,建立单片机理论和实践的结合,了解传感器各单元电路之间的关系及相互影响,从而能正确设计、计算定时计数的各个单元电路。
初步掌握传感器的调整及测试方法。
提高动手能力和排除故障的能力。
调试期间要多向同学老师请教,有问题就该虚心请教。
经过多次的反复测试与分析,可以对电路的原理及功能更加熟悉,同时提高了设计能力与对电路的分析能力,同时在软件的编程方面得到更高的提高,对编程能力得到加强,同时对所学的知识得到很大的提高与巩固。
参考文献
[1]徐国华.移动机器人的发展现状及其趋势[J].机器人技术与应用,2001,(03):
1102-1103,1150.
[2]彭宏业,段哲民编著.小型舞蹈机器人的驱动系统设计[J].国外电子元器件.2005,(04):
56-65.
[3]陈南主编.定位控制器的设计与实现[J].西安科技大学学报.2003.
[4]谭浩强.C语言程序设计[M].北京:
清华大学出版社,1998.
[5]苏卫东,任思聪等.温控箱数学模型的建立及其自适应PID控制[J].中国惯性技术学报,1995年,(3):
4.
[6]万福君.MCS-51单片机原理、系统设计与应用[M].北京:
清华大学出版社,2008.
[7]彭宏业,段哲民编著.小型舞蹈机器人的驱动系统设计[J].国外电子元器件.2005,(4).
[8]刘甘娜等编著.IBM-PC微机原理及接口技术[J].西安:
西安电子科技大学出版社,1998.
[9]孙广清.便携式温度传感标定装置[D].西北工业大学硕士学位论文,2007.
[10]鲍丽星,陈晓争.一种高精度信号源的设计[J].南京航空航天大学,2008,16(4):
588-590.
[11]党宏社.智能车辆系统发展及其关键技术概述[J].公路交通科技,2002.(4)
[12]林敏.简易数字化语音存储与回放系统[J].仪表技术,2008,28(9):
13-18.
[13]余祖俊.微机监测与控制应用系统设计,北方交通大学出版社,2001.12
[14]温志明.运动控制系统分析与应用[J],国防工业出版社,2008.2
[15]WANGSHX,WUGN,JIANGW,etal.Theprincipleandillumination
appliesoflightemittingdiode[J].LightandLighting,2006,14(5):
21-23.
[16]I.MFilanvsky,H.Baltes.CMOSSchmitTriggerDesign[J].IEEETransactiomsonCircuitsandSystem-FundamentalTheoryandApplications.1994,41
(1):
46-49.
致谢
在作品完成之际,我们要特别感谢严焰老师的热情关怀和悉心指导。
在我们作品制作的过程中,老师们给了我们很多耐心的指导和启发,不仅让我学到了专业知识,还让我学到了很多做人的道理。
特别是他们广博的学识、深厚的学术素养、严谨的治学精神和一丝不苟的工作作风使我们终生受益,在此表示真诚地感谢。
在作品的制作过程中,也得到了许多同学的宝贵建议,在此一并致以诚挚的谢意。
感谢所有关心、支持、帮助过我们的朋友。
最后,向在百忙中抽出时间对本文进行评审并提出宝贵意见的各位领导老师表示衷心地感谢!
由于自身水平有限,设计中一定存在很多不足之处,敬请各位老师批评指正。
附录
附件1L298N电机驱动模块
附件2小车侧视图
附件3小车俯视图
附件4小车最终硬件图
附件5程序清单
#include
#include
#defineucharunsignedchar
#defineuintunsignedint
sbitkey1=P1^2;
sbitkey2=P1^3;
sbitkey3=P1^4;
sbitkey4=P1^5;
sbitIN1=P0^1;
sbitIN2=P0^2;
sbitIN3=P0^3;
sbitIN4=P0^4;
sbitRS=P0^5;//液晶
sbitRW=P0^6;
sbitEN=P0^7;
sbitDQ=P3^0;//ds18b20与单片机连接口
unsignedcharcodestr1[]={"temperature:
"};
unsignedcharcodestr2[]={""};
uchardatadisdata[5];
uinttvalue;//温度值
uchartflag;//温度正负标志
voiddelay(uintxms)
{
inti,j;
for(i=xms;i>0;i--)
for(j=110;j>0;j--);
}
/**************小车部分********************/
voidqianjin()
{
IN1=1;
IN2=0;
delay(5);
IN3=1;
IN4=0;
}
voidhoutui()
{
IN1=0;
IN2=1;
delay(5);
IN3=0;
IN4=1;
}
voidzuozhuan()
{
IN1=1;
IN2=0;
delay(5);
IN3=0;
IN4=0;
}
voidyouzhuan()
{
IN1=0;
IN2=0;
delay(5);
IN3=1;
IN4=0;
}
voidtingzhi()
{
IN1=0;
IN2=0;
delay(5);
IN3=0;
IN4=0;
}
/*************************lcd1602程序**************************/
voiddelay1ms(unsignedintms)//延时1毫秒(不够精确的)
{unsignedinti,j;
for(i=0;ifor(j=0;j<100;j++);
}
voidwr_com(unsignedcharcom)//写指令//
{delay1ms
(1);
RS=0;
RW=0;
EN=0;
P2=com;
delay1ms
(1);
EN=1;
delay1ms
(1);
EN=0;
}
voidwr_dat(unsignedchardat)//写数据//
{delay1ms
(1);;
RS=1;
RW=0;
EN=0;
P2=dat;
delay1ms
(1);
EN=1;
delay1ms
(1);
EN=0;
}
voidlcd_init()//初始化设置//
{delay1ms(15);
wr_com(0x38);delay1ms(5);
wr_com(0x08);delay1ms(5);
wr_com(0x01);delay1ms(5);
wr_com(0x06);delay1ms(5);
wr_com(0x0c);delay1ms(5);
}
voiddisplay(unsignedchar*p)//显示//
{
while(*p!
='\0')
{
wr_dat(*p);
p++;
delay1ms
(1);
}
}
voidinit_play()//初始化显示
{
lcd_init();
wr_com(0x80);
display(str1);
wr_com(0xc0);
display(str2);
}
/******************************ds1820程序***************************************/
voiddelay_18B20(unsignedinti)//延时1微秒
{
while(i--);
}
voidds1820rst()/*ds1820复位*/
{
unsignedcharx=0;
DQ=1;//DQ复位
delay_18B20(4);//延时
DQ=0;//DQ拉低
delay_18B20(100);//精确延时大于480us
DQ=1;//拉高
delay_18B20(40);
}
uchards1820rd()/*读数据*/
{
unsignedchari=0;
unsignedchardat=0;
for(i=8;i>0;i--)
{DQ=0;//给脉冲信号
dat>>=1;
DQ=1;//给脉冲信号
if(DQ)
dat|=0x80;
delay_18B20(10);
}
return(dat);
}
voidds1820wr(ucharwdata)/*写数据*/
{
unsignedchari=0;
for(i=8;i>0;i--)
{DQ=0;
DQ=wdata&0x01;
delay_18B20(10);
DQ=1;
wdata>>=1;
}
}
read_temp()/*读取温度值并转换*/
{uchara,b;
ds1820rst();
ds1820wr(0xcc);//*跳过读序列号*/
ds1820wr(0x44);//*启动温度转换*/
ds1820rst();
ds1820wr(0xcc);//*跳过读序列号*/
ds1820wr(0xbe);//*读取温度*/
a=ds1820rd();
b=ds1820rd();
tvalue=b;
tvalue<<=8;
tvalue=tvalue|a;
if(tvalue<0x0fff)
tflag=0;
else
{tvalue=~tvalue+1;
tflag=1;
}
tvalue=tvalue*(0.625);//温度值扩大10倍,精确到1位小数
return(tvalue);
}
/*******************************************************************/
voidds1820disp()//温度值显示
{ucharflagdat;
disdata[0]=tvalue/1000+0x30;//百位数
disdata[1]=tvalue%1000/100+0x30;//十位数
disdata[2]=tvalue%100/10+0x30;//个位数
disdata[3]=tvalue%10+0x30;//小数位
if(tflag==0)
flagdat=