基于单片机的多功能智能小车设计电路程序论文.doc
摘要:智能作为现代的新发明,是以后的发展方向,他可以按照预先设定的模式在一个环境里自动的运作,不需要人为的管理,可应用于科学勘探等等的用途。智能电动车就是其中的一个体现。本次设计的简易智能电动车,采用STC89C52单片机作为小车的检测和控制核心;采用金属感应器TL-Q5MC来检测路上感应到的铁片,从而把反馈到的信号送单片机,使单片机按照预定的工作模式控制小车在各区域按预定的速度行驶,并且单片机选择的工作模式不同也可控制小车顺着黑色胶布循迹行驶;采用红外壁障测障碍物。采用1602LCD实时显示小车行驶的时间,小车停止行驶后,显示小车行驶时间以及硬币的个数。本设计结构简单,较容易实现,但具有高度的智能化、人性化,一定程度体现了智能。关键词:STC89C52 循迹 红外壁障 金属感应器 1602LCD1. 设计任务:设计并制作了一个智能电动车,其行驶路线满足所需的要求。1.1 要求:1.1.1 基本要求:1分区控制:如图1所示:图11电动车从出发区出发车体不得超出出发区,沿引导黑线向终点区行驶,电动车行驶过程中不可脱离黑色引导线行驶。2电动车行驶过程中遇到转角路口时发出声光指示信息。3电动车在AB段驶过程中遇到引导线下有硬币。电动车发出声光指示信息并且停车2秒。4电动车到达终点后应立即停车,但全程行驶时间不能大于90秒,行驶时间到达90秒时必须立即自动停车。1.1.2 发挥部分:1进一步提高B点到G点的行驶速度电动车行驶过程中不可脱离黑色引导线行驶。2电动车在GH段行驶过程中如有竖直放置饮用水瓶电动车发出声光指示信息。3电动车在GH段行驶过程中如有倒置放置饮用水瓶电动车起动风扇将其吹到。4电动车进入终点区域后,能进一步准确驶入终点区,要求电动车的车身完全进入终点区到达终点区中心。停车后,能准确显示电动车全程行驶时间、路程以及遇到硬币的数量和饮用水瓶的数量。2. 方案比较与选择:2.1 主控系统模块根据设计要求,我认为此设计属于多输入量的复杂程序控制问题。据此,拟定了以下两种方案并进行了综合的比较论证,具体如下:方案一:选用一片CPLD如EPM7128LC84-15作为系统的核心部件,实现控制与处理的功能。CPLD具有速度快、编程容易、资源丰富、开发周期短等优点,可利用VHDL语言进行编写开发。但CPLD在控制上较单片机有较大的劣势。同时,CPLD的处理速度非常快,而小车的行进速度不可能太高,那么对系统处理信息的要求也就不会太高,在这一点上,MCU就已经可以胜任了。若采用该方案,必将在控制上遇到许许多多不必要增加的难题。为此,我们不采用该种方案,进而提出了第二种设想。方案二:采用单片机作为整个系统的核心,用其控制行进中的小车,以实现其既定的性能指标。充分分析我们的系统,其关键在于实现小车的自动控制,而在这一点上,单片机就显现出来它的优势控制简单、方便、快捷。这样一来,单片机就可以充分发挥其资源丰富、有较为强大的控制功能及可位寻址操作功能、价格低廉等优点。因此,这种方案是一种较为理想的方案。针对本设计特点多开关量输入的复杂程序控制系统,需要擅长处理多开关量的标准单片机,而不能用精简I/O口和程序存储器的小体积单片机,D/A、A/D功能也不必选用。根据这些分析,我选定了P89C51RA单片机作为本设计的主控装置,51单片机具有功能强大的位操作指令,I/O口均可按位寻址,程序空间多达8K,对于本设计也绰绰有余,更可贵的是51单片机价格非常低廉。在综合考虑了传感器、两部电机的驱动等诸多因素后,我们决定采用一片单片机,充分利用STC89C52单片机的资源。2.2 电机驱动模块方案一:采用继电器对电动机的开或关进行控制,通过开关的切换对小车的速度进行调整,此方案的优点是电路较为简单,缺点是继电器的响应时间慢,易损坏,寿命较短,可靠性不高。方案二:采用电阻网络或数字电位器调节电动机的分压,从而达到分压的目的。但电阻网络只能实现有级调速,而数字电阻的元器件价格比较昂贵。更主要的问题在于一般的电动机电阻很小,但电流很大,分压不仅回降低效率,而且实现很困难。方案三:采用功率三极管作为功率放大器的输出控制直流电机。线性型驱动的电路结构和原理简单,加速能力强,采用由达林顿管组成的 H型桥式电路<如图2.1>。用单片机控制达林顿管使之工作在占空比可调的开关状态下,精确调整电动机转速。这种电路由于工作在管子的饱和截止模式下,效率非常高,H型桥式电路保证了简单的实现转速和方向的控制,电子管的开关速度很快,稳定性也极强,是一种广泛采用的PWM调速技术。现市面上有很多此种芯片,我选用了L298N<如图2.2>。图2.1 H桥式电路图2.2 L298N2.3 循迹模块方案一:采用简易光电传感器结合外围电路探测,但实际效果并不理想,对行驶过程中的稳定性要求很高,且误测几率较大、易受光线环境和路面介质影响。在使用过程极易出现问题,而且容易因为 该部件造成整个系统的不稳定。故最终未采用该方案。方案二:采用四只红外对管<如图2.3>,分别置于小车车身前轨道的两侧,根据两只光电开关接受到白线与黑线的情况来控制小车转向来调整车向,测试表明,只要合理安装好四只光电开关的位置就可以很好的实现循迹的功能。方案三:采用三只红外对管,一只置于轨道中间,两只置于轨道外侧,当小车脱离轨道时,即当置于中间的一只光电开关脱离轨道时,等待外面任一只检测到黑线后,做出相应的转向调整,直到中间的光电开关重新检测到黑线即回到轨道再恢复正向行驶。现场实测表明,小车在寻迹过程中有一定的左右摇摆不定,虽然可以正确的循迹但其成本与稳定性都次与第二种方案。通过比较,我选取第二种方案来实现循迹。图2.3 红外对管3系统的具体设计与实现:根据设计任务要求,并且根据我们自己的需要而附加的功能,该电路的总体框图可分为如下几个基本的模块:3.1 路面检测模块:采用铁片感应器TL-Q5MC来检测路面上的铁片从而给单片机中断脉冲。原理图接线如图4所示:图4 应用一个金属感应器,安装在车盘下,离地略小于或约四毫米。当金属传感器检测到硬币时将对单片机发送中断信号,单片机运行中断,让小车停下2秒,并显示出硬币的个数。3.2 LCD显示模块:采用1602LCD,由单片机的总线模式连接。为节约IO口的使用并且不影响LCD的功能,LCD数据的传送是用595进行数据传送的,题目要求显示出全过程所以的时间和检测到硬币的个数。还有题目要求在转弯时发出声音,LCD显示模块和蜂鸣器模块电路图如下:LCD显示模块和蜂鸣器模块电路图3.3 红外壁障模块红外避障传感器/距离可调3-80cm简介:这是一种集发射与接收于一体的光电传感器。检测距离可以根据要求进行调节。该传感器具有探测距离远、受可见光干扰小、价格便宜、易于装配、使用方便等特点,可以广泛应用于机器人避障、流水线计件等众多场合。原理:前方无障碍输出高电平<1>,有障碍输出口黄色电平会从高电平变成低电平<0>,工作原理已经标在图上了。背面图有一个电位器可以调节障碍的检测距离。这样就可以按题目要求的那样检测到瓶子是否倒立了,如果倒立就启动电风扇吹到瓶子。3.4 最小系统模块: 该系统主要用到的是单片机,所以主要的部分是最小系统图,该最小系统如图所示:最小系统电路图3.5 驱动电机模块电机驱动一般采用H桥式驱动电路,L298N部集成了H桥式驱动电路,从而可以采用L298N电路来驱动电机。通过单片机给予L298N电路PWM信号来控制小车的速度,起停。其引脚图如3.2,驱动原理图如图3.3。图3.2 L298N引脚图图3.3 电机驱动电路3.6 循迹模块小车循迹原理是小车在画有黑线的白纸 "路面"上行驶,由于黑线和白纸对光线的反射系数不同,可根据接收到的反射光的强弱来判断"道路"黑线。笔者在该模块中利用了简单、应用也比较普遍的检测方法红外探测法。红外探测法,即利用红外线在不同颜色的物理表面具有不同的反射性质的特点。在小车行驶过程中不断地向地面发射红外光,当红外光遇到白色地面时发生漫发射,反射光被装在小车上的接收管接收;如果遇到黑线则红外光被吸收,则小车上的接收管接收不到信号,再通过LM324作比较器来采集高低电平,从而实现信号的检测。避障亦是此原理。电路图如图3.4和图3.5。市面上有很多红外传感器,在这里我选用TCRT5000型光电对管。图3.4循迹原理图图3.5比较器模块4. 结束语:经过这次的设计,让我更明白了团队的重要性以及焊接技术的重要性,也让我们对单片机编程的进一步了解,为了这次设计我们找了查找了很多资料,包括一些对该设计元件的作用、工作电压等资料的了解,感百度和Google 公司。他们的搜索功能庞大、快捷又免费。让我们很方便地搜索到了我们所需要的设计资料和丰富的知识。此次毕业设计是我大学学习中遇到过的时段最长、涉及容最广、工作量最大的一次设计。用老师的一句话概括就是这次毕业设计相当,如是把以前的小课程设计综合在一起的过程,只要把握住每个小课设的精华、环环紧扣、增强逻辑,那么这次的任务也就不难了。同时感老师对我们的指导和为我们理清思路从而使我们更快我完成设计。5程序和流程图:按照预定的功能,系统实现预定的功能的程序流程图如下所示:程序如下:#include <reg52.h>#include<intrins.h>#define uchar unsigned char#define uint unsigned intsbit lcdrs=P00; /1602数据、命令端sbit lcden=P01; /1602液晶使能端 sbit SER_595=P02; /串行数据输入 14脚SERsbit RCK_595=P03; /输出锁存器控制脉冲 12脚RCKsbit SCK_595=P04; /移位时钟脉冲 11脚SCKsbit BEEP=P05;sbit in1=P10; /电机控制位sbit in2=P11; sbit en1=P12;sbit in3=P13;sbit in4=P14;sbit en2=P15;sbit X1=P23;sbit X2=P22;sbit X3=P21;sbit X4=P20;sbit F1=P16;sbit F2=P17;sbit Y1=P06; /¥数sbit It0=P32;/外部中断0 sbit It1=P33;/外部中断1uchar num0=0,t0=0,t1=0,num1=0,y=0,d=0,p1=0,p2=0;void delay<uint z>uint x,y;for<x=0;x<z;x+>for<y=0;y<110;y+>void delay_s<uchar n>uchar i=0;for<i=n;i>0;i->delay<100>void beep<>BEEP=0;delay<8>BEEP=1;void go_front<>en2=1;en1=1;in1=1;in2=0;in3=1;in4=0;void go_back<>en1=1;en2=1;in1=0;in2=1;in3=0;in4=1;void stop<>en1=0;en2=0;in1=0;in2=0;in3=0;in4=0;void turn_left<>en1=1;en2=1;in1=0;in2=1;in3=1;in4=0;void turn_right<>en1=1;en2=1;in1=1;in2=0;in3=0;in4=1;void display_595<uchar byte>/通过接595送数据到lcd1602 uchar i; for<i=0;i<8;i+>SCK_595=0;byte=byte<<1;SER_595=CY;SCK_595=1;RCK_595=0;RCK_595=1; void write_1602<uchar Lcdcs,uchar Com_Date>/1602写指令和写数据lcdrs=Lcdcs;/Lcdrs=0写指令,Lcdrs=1写数据display_595<Com_Date> /指令和数据delay<5>lcden=1;delay<5>lcden=0;void lcd1602_init<>/1602初始化函数lcden=0;write_1602<0,0x38> /设置8位显示模式write_1602<0,0x0c> /0x0c开显示,不显示光标,不闪烁;write_1602<0,0x06> /指针加1模式,光标右移write_1602<0,0x01> /显示清屏write_1602<0,0x0c>/光标显示void displays<uchar row,uchar col,uchar *s>/row是行,col是列,*s为字符串if<row=1>write_1602<0,0x80+col-1>/第一行elsewrite_1602<0,0xc0+col-1>/第二行while<*s>write_1602<1,*s+>/送字符串数据void displayc<uchar row,uchar col,uchar date>if<row=1>write_1602<0,0x80+col-1>/第一行elsewrite_1602<0,0xc0+col-1>/第二行write_1602<1,0x30+date>void displayz<uchar row,uchar col,uchar date>/三位数的处理displayc<row,col,date/100>displayc<row,col+1,date%100/10>displayc<row,col+2,date%10>void Noway<>uchar f1,f2,f3,f4;/定义标志位if<X1=1> f1=1;/循迹1else f1=0; if<X2=1> f2=1;/循迹2else f2=0;if<X3=1> f3=1;/循迹3else f3=0;if<X4=1> f4=1;/循迹4else f4=0;if<<f1=1|f2=1>&&<f3=0|f4=0>>turn_left<>if<<f1=0|f2=0>&&<f3=1|f4=1>>turn_right<>if<f1=1&&f2=1&&f3=0&&f4=0>turn_left<>beep<>if<f1=0&&f2=0&&f3=1&&f4=1>turn_right<>beep<>if<f1=1&&f2=1&&f3=1&&f4=0>turn_left<>if<f1=0&&f2=1&&f3=1&&f4=1>turn_right<>if<f1=1&&f2=1&&f3=0&&f4=1>turn_left<>if<f1=1&&f2=0&&f3=1&&f4=1>turn_right<>if<f1=0&&f2=0&&f3=0&&f4=0>go_front<>if<f1=0&&f2=1&&f3=1&&f4=0>go_front<>if<f1=1&&f2=0&&f3=0&&f4=1>go_front<>if<f1=1&&f2=1&&f3=1&&f4=1>stop<>void pingzi<>uchar f1,f2;if<F1=0> f1=1;/上面的壁障else f1=0; if<F2=0> f2=1;/下面的壁障else f2=0;if<f1=1&&f2=1>/检测正立的瓶子It1=0;if<It1=0>p1+;if<p1=10>p1=0;displayc<1,5,p1>/正立的瓶子数if<f1=1&&f2=0>go_front<>if<f1=0&&f2=1>/检测倒立的瓶子It1=0;if<It1=0>p2+;if<p1=10>p1=0;displayc<1,8,p2>/倒立的瓶子数if<f1=0&&f2=0>go_front<>void Money<>if<Y1=0>if<Y1=0>beep<> /蜂鸣器响It1=0; /触发中断1while<!Y1>d+; /硬币数加一displayc<2,2,d> /显示硬币数void main<>lcd1602_init<>displays<1,1,"$ P Q T: ">TMOD=0x11;EA=1;ET0=1;TR0=1;TH0=0x4c;TL0=0x00;ET1=1;TH1=0x4c;TL1=0x00;TR1=0;IT1=1; /下降沿触发EX1=1; /打开外部中断1IT0=1; /下降沿触发EX0=1; /打开外部中断1while<1>/主循环while<!TR0> /定时90sstop<>It1=1; /中断1置高电平Noway<> /循迹Money<> /检测硬币pingzi<> /检测瓶子while<TR1> /定时器1stop<>void Time0<> interrupt 1TH0=0x4c;TL0=0x00;num0+;if<num0=20>num0=0;t0+;if<t0=250>TR0=0;num0=0;stop<>displayz<1,14,t0>void Init1<> interrupt 2beep<>stop<>TR1=1;void Time1<> interrupt 3TH1=0x4c;TL1=0x00;num1+;if<num1=20>num1=0; t1+;if<t1=2>TR1=0;go_front<>delay<1500>It1=1;t1=0,num1=0;y+;if<y=10>y=0; displayc<1,2,y>6. 参考文献1 吴黎明 第一版 单片机原理及应用技术2 谭浩强 第二版 C程序设计3 LAB2000系列单片机实验系统实验指导书4 单片机C语言入门教程