1、基于单片机的多功能智能小车设计论文电路 程序摘要:智能作为现代的新发明,是以后的发展方向,他可以按照预先设定的模式在一个环境里自动的运作,不需要人为的管理,可应用于科学勘探等等的用途。智能电动车就是其中的一个体现。本次设计的简易智能电动车,采用STC89C52单片机作为小车的检测和控制核心;采用金属感应器TL-Q5MC来检测路上感应到的铁片,从而把反馈到的信号送单片机,使单片机按照预定的工作模式控制小车在各区域按预定的速度行驶,并且单片机选择的工作模式不同也可控制小车顺着黑色胶布循迹行驶;采用红外壁障测障碍物。采用1602LCD实时显示小车行驶的时间,小车停止行驶后,显示小车行驶时间以及硬币的
2、个数。本设计结构简单,较容易实现,但具有高度的智能化、人性化,一定程度体现了智能。关键词:STC89C52 循迹 红外壁障 金属感应器 1602LCD1. 设计任务:设计并制作了一个智能电动车,其行驶路线满足所需的要求。1.1 要求:1.1.1 基本要求:(1)分区控制:如(图1)所示:(图1)(1)电动车从出发区出发(车体不得超出出发区),沿引导黑线向终点区行驶,电动车行驶过程中不可脱离黑色引导线行驶。矚慫润厲钐瘗睞枥庑赖。(2)电动车行驶过程中遇到转角路口时发出声光指示信息。(3)电动车在AB段驶过程中遇到引导线下有硬币。电动车发出声光指示信息并且停车2秒。(4)电动车到达终点后应立即停车
3、,但全程行驶时间不能大于90秒,行驶时间到达90秒时必须立即自动停车。聞創沟燴鐺險爱氇谴净。1.1.2 发挥部分:(1)进一步提高B点到G点的行驶速度(电动车行驶过程中不可脱离黑色引导线行驶)。 (2)电动车在GH段行驶过程中如有竖直放置饮用水瓶电动车发出声光指示信息。 (3)电动车在GH段行驶过程中如有倒置放置饮用水瓶电动车起动风扇将其吹到。 (4)电动车进入终点区域后,能进一步准确驶入终点区,要求电动车的车身完全进入终点区到达终点区中心。停车后,能准确显示电动车全程行驶时间、路程以及遇到硬币的数量和饮用水瓶的数量。残骛楼諍锩瀨濟溆塹籟。2. 方案比较与选择:2.1 主控系统模块根据设计要求
4、,我认为此设计属于多输入量的复杂程序控制问题。据此,拟定了以下两种方案并进行了综合的比较论证,具体如下:酽锕极額閉镇桧猪訣锥。方案一:选用一片CPLD(如EPM7128LC84-15)作为系统的核心部件,实现控制与处理的功能。CPLD具有速度快、编程容易、资源丰富、开发周期短等优点,可利用VHDL语言进行编写开发。但CPLD在控制上较单片机有较大的劣势。同时,CPLD的处理速度非常快,而小车的行进速度不可能太高,那么对系统处理信息的要求也就不会太高,在这一点上,MCU就已经可以胜任了。若采用该方案,必将在控制上遇到许许多多不必要增加的难题。为此,我们不采用该种方案,进而提出了第二种设想。彈贸摄
5、尔霁毙攬砖卤庑。方案二:采用单片机作为整个系统的核心,用其控制行进中的小车,以实现其既定的性能指标。充分分析我们的系统,其关键在于实现小车的自动控制,而在这一点上,单片机就显现出来它的优势控制简单、方便、快捷。这样一来,单片机就可以充分发挥其资源丰富、有较为强大的控制功能及可位寻址操作功能、价格低廉等优点。因此,这种方案是一种较为理想的方案。謀荞抟箧飆鐸怼类蒋薔。针对本设计特点多开关量输入的复杂程序控制系统,需要擅长处理多开关量的标准单片机,而不能用精简I/O口和程序存储器的小体积单片机,D/A、A/D功能也不必选用。根据这些分析,我选定了P89C51RA单片机作为本设计的主控装置,51单片机
6、具有功能强大的位操作指令,I/O口均可按位寻址,程序空间多达8K,对于本设计也绰绰有余,更可贵的是51单片机价格非常低廉。厦礴恳蹒骈時盡继價骚。在综合考虑了传感器、两部电机的驱动等诸多因素后,我们决定采用一片单片机,充分利用STC89C52单片机的资源。茕桢广鳓鯡选块网羈泪。2.2 电机驱动模块方案一:采用继电器对电动机的开或关进行控制,通过开关的切换对小车的速度进行调整,此方案的优点是电路较为简单,缺点是继电器的响应时间慢,易损坏,寿命较短,可靠性不高。鹅娅尽損鹌惨歷茏鴛賴。方案二:采用电阻网络或数字电位器调节电动机的分压,从而达到分压的目的。但电阻网络只能实现有级调速,而数字电阻的元器件价
7、格比较昂贵。更主要的问题在于一般的电动机电阻很小,但电流很大,分压不仅回降低效率,而且实现很困难。籟丛妈羥为贍偾蛏练淨。方案三:采用功率三极管作为功率放大器的输出控制直流电机。线性型驱动的电路结构和原理简单,加速能力强,采用由达林顿管组成的 H型桥式电路(如图2.1)。用单片机控制达林顿管使之工作在占空比可调的开关状态下,精确调整电动机转速。这种电路由于工作在管子的饱和截止模式下,效率非常高,H型桥式电路保证了简单的实现转速和方向的控制,电子管的开关速度很快,稳定性也极强,是一种广泛采用的PWM调速技术。现市面上有很多此种芯片,我选用了L298N(如图2.2)。預頌圣鉉儐歲龈讶骅籴。图2.1
8、H桥式电路图2.2 L298N2.3 循迹模块方案一:采用简易光电传感器结合外围电路探测,但实际效果并不理想,对行驶过程中的稳定性要求很高,且误测几率较大、易受光线环境和路面介质影响。在使用过程极易出现问题,而且容易因为 该部件造成整个系统的不稳定。故最终未采用该方案。渗釤呛俨匀谔鱉调硯錦。方案二:采用四只红外对管(如图2.3),分别置于小车车身前轨道的两侧,根据两只光电开关接受到白线与黑线的情况来控制小车转向来调整车向,测试表明,只要合理安装好四只光电开关的位置就可以很好的实现循迹的功能。铙誅卧泻噦圣骋贶頂廡。方案三:采用三只红外对管,一只置于轨道中间,两只置于轨道外侧,当小车脱离轨道时,即
9、当置于中间的一只光电开关脱离轨道时,等待外面任一只检测到黑线后,做出相应的转向调整,直到中间的光电开关重新检测到黑线(即回到轨道)再恢复正向行驶。现场实测表明,小车在寻迹过程中有一定的左右摇摆不定,虽然可以正确的循迹但其成本与稳定性都次与第二种方案。擁締凤袜备訊顎轮烂蔷。通过比较,我选取第二种方案来实现循迹。图2.3 红外对管3系统的具体设计与实现:根据设计任务要求,并且根据我们自己的需要而附加的功能,该电路的总体框图可分为如下几个基本的模块:3.1 路面检测模块:采用铁片感应器TL-Q5MC来检测路面上的铁片从而给单片机中断脉冲。原理图接线如(图4)所示:(图4) 应用一个金属感应器,安装在
10、车盘下,离地略小于或约四毫米。当金属传感器检测到硬币时将对单片机发送中断信号,单片机运行中断,让小车停下2秒,并显示出硬币的个数。贓熱俣阃歲匱阊邺镓騷。3.2 LCD显示模块:采用1602LCD,由单片机的总线模式连接。为节约IO口的使用并且不影响LCD的功能,LCD数据的传送是用595进行数据传送的,题目要求显示出全过程所以的时间和检测到硬币的个数。还有题目要求在转弯时发出声音,LCD显示模块和蜂鸣器模块电路图如下:坛摶乡囂忏蒌鍥铃氈淚。LCD显示模块和蜂鸣器模块电路图3.3 红外壁障模块红外避障传感器/距离可调3-80cm简介:这是一种集发射与接收于一体的光电传感器。检测距离可以根据要求进
11、行调节。该传感器具有探测距离远、受可见光干扰小、价格便宜、易于装配、使用方便等特点,可以广泛应用于机器人避障、流水线计件等众多场合。蜡變黲癟報伥铉锚鈰赘。原理:前方无障碍输出高电平(1),有障碍输出口(黄色)电平会从高电平变成低电平(0),工作原理已经标在图上了。背面图有一个电位器可以调节障碍的检测距离。这样就可以按题目要求的那样检测到瓶子是否倒立了,如果倒立就启动电风扇吹到瓶子。買鲷鴯譖昙膚遙闫撷凄。3.4 最小系统模块: 该系统主要用到的是单片机,所以主要的部分是最小系统图,该最小系统如图所示:最小系统电路图3.5 驱动电机模块电机驱动一般采用H桥式驱动电路,L298N内部集成了H桥式驱动
12、电路,从而可以采用L298N电路来驱动电机。通过单片机给予L298N电路PWM信号来控制小车的速度,起停。其引脚图如3.2,驱动原理图如图3.3。綾镝鯛駕櫬鹕踪韦辚糴。图3.2 L298N引脚图图3.3 电机驱动电路3.6 循迹模块小车循迹原理是小车在画有黑线的白纸 “路面”上行驶,由于黑线和白纸对光线的反射系数不同,可根据接收到的反射光的强弱来判断“道路”黑线。笔者在该模块中利用了简单、应用也比较普遍的检测方法红外探测法。驅踬髏彦浃绥譎饴憂锦。红外探测法,即利用红外线在不同颜色的物理表面具有不同的反射性质的特点。在小车行驶过程中不断地向地面发射红外光,当红外光遇到白色地面时发生漫发射,反射光
13、被装在小车上的接收管接收;如果遇到黑线则红外光被吸收,则小车上的接收管接收不到信号,再通过LM324作比较器来采集高低电平,从而实现信号的检测。避障亦是此原理。电路图如图3.4和图3.5。猫虿驢绘燈鮒诛髅貺庑。市面上有很多红外传感器,在这里我选用TCRT5000型光电对管。图3.4循迹原理图图3.5比较器模块4. 结束语:经过这次的设计,让我更明白了团队的重要性以及焊接技术的重要性,也让我们对单片机编程的进一步了解,为了这次设计我们找了查找了很多资料,包括一些对该设计元件的作用、工作电压等资料的了解,感谢XX和Google 公司。他们的搜索功能庞大、快捷又免费。让我们很方便地搜索到了我们所需要
14、的设计资料和丰富的知识。此次毕业设计是我大学学习中遇到过的时段最长、涉及内容最广、工作量最大的一次设计。用老师的一句话概括就是这次毕业设计相当,如是把以前的小课程设计综合在一起的过程,只要把握住每个小课设的精华、环环紧扣、增强逻辑,那么这次的任务也就不难了。同时感谢老师对我们的指导和为我们理清思路从而使我们更快我完成设计。锹籁饗迳琐筆襖鸥娅薔。5程序和流程图:按照预定的功能,系统实现预定的功能的程序流程图如下所示:程序如下:#include #include#define uchar unsigned char#define uint unsigned intsbit lcdrs=P00; /
15、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
16、 F2=P17;sbit Y1=P06; /¥数sbit It0=P32;/外部中断0 sbit It1=P33;/外部中断1 uchar 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;xz;x+) for(y=0;y0;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; e
17、n2=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;i8;i+) SCK_595=0; byte=byte1; SE
18、R_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);
19、 /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);/第一行 else write_1602(0,0xc0+col-1);/第二行 while(*s) write_1602(1,*s+);/送字符串数据void displa
20、yc(uchar row,uchar col,uchar date) if(row=1) write_1602(0,0x80+col-1);/第一行 else write_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()
21、uchar f1,f2,f3,f4;/定义标志位 if(X1=1) f1=1;/循迹1 else f1=0; if(X2=1) f2=1;/循迹2 else f2=0; if(X3=1) f3=1;/循迹3 else f3=0; if(X4=1) f4=1;/循迹4 else 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_rig
22、ht();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(
23、); 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&
24、f2=0) go_front(); void Money() if(Y1=0) if(Y1=0) beep(); /蜂鸣器响 It1=0; /触发中断1 while(!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; /打开外部中断1 IT0=1; /下
25、降沿触发 EX0=1; /打开外部中断1 while(1)/主循环 while(!TR0) /定时90s stop(); It1=1; /中断1置高电平 Noway(); /循迹 Money(); /检测硬币 pingzi(); /检测瓶子 while(TR1) /定时器1 stop(); void Time0() interrupt 1 TH0=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 2 beep(); stop(); TR1=1; void Time1() interrupt 3 TH1=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语言入门教程
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1