智能迷宫寻迹小车报告
智能循迹小车___设计报告

智能循迹小车___设计报告设计报告:智能循迹小车一、设计背景智能循迹小车是一种能够通过感知地面上的线条进行导航的小型机器人。
循迹小车可以应用于许多领域,如仓库管理、物流配送、家庭服务等。
本设计旨在开发一款功能强大、性能稳定的智能循迹小车,以满足不同领域的需求。
二、设计目标1.实现循迹功能:小车能够准确地识别地面上的线条,并按照线条进行导航。
2.提供远程控制功能:用户可以通过无线遥控器对小车进行控制,包括前进、后退、转向等操作。
3.具备避障功能:小车能够识别和避开遇到的障碍物,确保行驶安全。
4.具备环境感知功能:小车能够感知周围环境,包括温度、湿度、光照等参数,并将数据传输给用户端。
5.高稳定性和可靠性:设计小车的硬件和软件应具备较高的稳定性和可靠性,以保证长时间的工作和使用。
三、设计方案1.硬件设计:(1) 采用Arduino控制器作为主控制单元,与传感器、驱动器等硬件模块进行连接和交互。
(2)使用红外传感器作为循迹传感器,通过检测地面上的线条来实现循迹功能。
(3)使用超声波传感器来检测小车前方的障碍物,以实现避障功能。
(4)添加温湿度传感器和光照传感器,以提供环境感知功能。
(5)将无线模块与控制器连接,以实现远程控制功能。
2.软件设计:(1) 使用Arduino编程语言进行程序设计,编写循迹、避障和远程控制的算法。
(2)设计用户界面,通过无线模块将控制信号发送给小车,实现远程控制。
(3)编写数据传输和处理的程序,将环境感知数据发送到用户端进行显示和分析。
四、实施计划1.硬件搭建:按照设计方案中的硬件模块需求,选购所需元件并进行搭建。
2.软件开发:根据设计方案中的软件设计需求,编写相应的程序并进行测试。
3.功能调试:对小车的循迹、避障、远程控制和环境感知功能进行调试和优化。
4.性能测试:使用不同场景和材料的线条进行测试,验证小车的循迹性能。
5.用户界面开发:设计用户端的界面,并完成与小车的远程控制功能的对接。
循迹小车实验报告数据

一、实验目的1. 掌握循迹小车的基本原理和设计方法。
2. 熟悉红外传感器在循迹中的应用。
3. 提高单片机编程和调试能力。
二、实验原理循迹小车通过红外传感器检测地面上的黑线,根据黑线的位置控制小车的转向,使小车沿着既定路线前进。
三、实验器材1. 单片机:51单片机或Arduino2. 红外传感器:红外对管3. 电机驱动模块:L298N4. 电机:直流电机5. 车架及车轮6. 电源:可充电锂电池7. 连接线、电阻、电容等四、实验步骤1. 搭建电路将单片机、红外传感器、电机驱动模块、电机等连接起来,搭建循迹小车的电路。
2. 编程编写单片机程序,实现以下功能:(1)读取红外传感器的状态;(2)根据红外传感器的状态控制电机驱动模块,使小车转向;(3)实现小车的前进、后退、左转、右转等动作。
3. 调试调试程序,使小车能够沿着黑线稳定行驶。
五、实验数据1. 红外传感器参数| 传感器编号 | 阻值(Ω) | 电压(V) || :---------: | :-------: | :-------: || 1 | 10k | 5V || 2 | 10k | 5V || 3 | 10k | 5V || 4 | 10k | 5V |2. 电机参数| 电机型号 | 额定电压(V) | 额定电流(A) | 额定转速(r/min) || :-------: | :-----------: | :-----------: | :--------------: || 12V | 12V | 0.5A | 1000r/min |3. 程序运行数据| 指令类型 | 代码行数 | 运行时间(ms) || :-------: | :-------: | :------------: || 读取传感器 | 20 | 1ms || 控制电机 | 50 | 2ms || 其他指令 | 30 | 1ms |4. 实验结果在黑线宽度为10mm、小车与黑线距离为5cm的情况下,小车能够稳定行驶,转向灵活。
循迹小车实习报告

一、实习背景随着科技的发展,自动化技术在各个领域得到了广泛应用。
智能循迹小车作为自动化技术的一个重要应用,具有广泛的前景。
为了提高我们的实践能力,培养我们的创新精神,我们参加了智能循迹小车实习课程。
通过本次实习,我们学习了智能循迹小车的设计、制作和调试方法,了解了其工作原理,提高了我们的动手能力和团队协作能力。
二、实习目的1. 熟悉智能循迹小车的结构、原理和功能。
2. 掌握智能循迹小车的制作方法,提高动手能力。
3. 学习电路设计、传感器应用、单片机编程等知识。
4. 培养团队协作精神,提高沟通能力。
三、实习内容1. 智能循迹小车原理及结构智能循迹小车主要由以下几部分组成:车体、驱动电机、传感器、单片机、控制电路等。
车体是智能循迹小车的承载部分,驱动电机负责提供动力,传感器用于检测路面信息,单片机负责处理传感器信息,控制电路负责将单片机的指令转换为电机驱动信号。
2. 电路设计电路设计主要包括以下几个方面:(1)电源电路:为智能循迹小车提供稳定的电源。
(2)驱动电路:将单片机的控制信号转换为电机驱动信号。
(3)传感器电路:将传感器信号转换为单片机可识别的信号。
(4)控制电路:对单片机输出的控制信号进行放大、滤波等处理。
3. 传感器应用智能循迹小车主要采用红外传感器进行路面检测。
红外传感器具有体积小、成本低、安装方便等优点。
在制作过程中,我们需要对红外传感器进行调试,使其能够准确检测路面信息。
4. 单片机编程单片机编程是智能循迹小车实现智能控制的关键。
我们主要学习了C语言编程,掌握了单片机的基本指令、函数、中断等知识。
在编程过程中,我们需要编写程序,使单片机能够根据传感器信息控制小车行驶。
5. 调试与优化在制作过程中,我们需要对智能循迹小车进行调试,使其能够稳定、准确地行驶。
调试过程中,我们需要对电路、传感器、单片机等部分进行调整,以达到最佳效果。
四、实习成果通过本次实习,我们成功制作了一台智能循迹小车,并使其能够稳定、准确地行驶。
智能寻迹小车实验报告

智能寻迹小车实验报告
实验目的:
设计一个智能寻迹小车,能够依据环境中的黑线自主行驶,并避开障碍物。
实验材料:
1. Arduino开发板
2. 电机驱动模块
3. 智能车底盘
4. 红外传感器
5. 电源线
6. 杜邦线
7. 电池
实验步骤:
1. 按照智能车底盘的说明书将车底盘组装起来。
2. 将Arduino开发板安装在车底盘上,并与电机驱动模块连接。
3. 连接红外传感器到Arduino开发板上,以便检测黑线。
4. 配置代码,使小车能够依据红外传感器检测到的黑线自主行驶。
可以使用PID控制算法来控制小车的速度和方向。
5. 测试小车的寻迹功能,可以在地面上绘制黑线,观察小车是否能够准确地跟随黑线行驶。
6. 根据需要,可以添加避障功能。
可以使用超声波传感器或红外避障传感器来检测障碍物,并调整小车的行驶路线。
实验结果:
经过实验,可以发现小车能够依据红外传感器检测到的黑线自主行驶,并能够避开障碍物。
小车的寻迹功能和避障功能能够实现预期的效果。
实验总结:
本次实验成功设计并实现了智能寻迹小车。
通过使用Arduino 开发板、电机驱动模块和红外传感器等材料,配合合适的代码配置,小车能够准确地跟随黑线行驶,并能够避开障碍物。
该实验展示了智能小车的基本原理和应用,为进一步研究和开发智能车提供了基础。
智能循迹小车实验报告

智能循迹小车实验报告第一篇:智能循迹小车实验报告摘要本设计主要有单片机模块、传感器模块、电机驱动模块以及电源模块组成,小车具有自主寻迹的功能。
本次设计采用STC公司的89C52单片机作为控制芯片,传感器模块采用红外光电对管和比较器实现,能够轻松识别黑白两色路面,同时具有抗环境干扰能力,电机模块由L298N芯片和两个直流电机构成,组成了智能车的动力系统,电源采用7.2V的直流电池,经过系统组装,从而实现了小车的自动循迹的功能。
关键词智能小车单片机红外光对管 STC89C52 L298N 1 绪论随着科学技术的发展,机器人的设计越来越精细,功能越来越复杂,智能小车作为其的一个分支,也在不断发展。
在近几年的电子设计大赛中,关于小车的智能化功能的实现也多种多样,因此本次我们也打算设计一智能小车,使其能自动识别预制道路,按照设计的道路自行寻迹。
设计任务与要求采用MCS-51单片机为控制芯片(也可采用其他的芯片),红外对管为识别器件、步进电机为行进部件,设计出一个能够识别以白底为道路色,宽度10mm左右的黑色胶带制作的不规则的封闭曲线为引导轨迹并能沿该轨迹行进的智能寻迹机器小车。
方案设计与方案选择3.1 硬件部分可分为四个模块:单片机模块、传感器模块、电机驱动模块以及电源模块。
3.1.1 单片机模块为小车运行的核心部件,起控制小车的所有运行状态的作用。
由于以前自己开发板使用的是ATMEL公司的STC89C52,所以让然选择这个芯片作为控制核心部件。
STC89C52是一种低损耗、高性能、CMOS八位微处理器,片内有4k字节的在线可重复编程、快速擦除快速写入程序的存储器,能重复写入/擦除1000次,数据保存时间为十年。
其程序和数据存储是分开的。
3.1.2 传感器模块方案一:使用光敏电阻组成光敏探测器采集路面信息。
阻值经过比较器输出高低电平进行分析,但是光照影响很大,不能稳定工作。
方案二:使用光电传感器来采集路面信息。
循迹小车的实验报告

循迹小车的实验报告循迹小车的实验报告引言:循迹小车是一种基于光电传感器的智能机器人,能够通过感知地面上的黑线,实现自主导航。
本次实验旨在探索循迹小车的工作原理及其应用,并对其性能进行评估。
一、实验背景循迹小车作为一种智能机器人,广泛应用于工业自动化、仓储物流、智能家居等领域。
其基本原理是通过光电传感器感知地面上的黑线,根据传感器信号控制电机的转动,从而实现沿着黑线行进。
二、实验过程1. 实验器材准备本次实验所需器材有循迹小车、黑线地毯、计算机等。
通过连接计算机和循迹小车,可以实现对小车的控制和数据传输。
2. 实验步骤(1)将黑线地毯铺设在实验场地上,并保证地毯表面光滑清洁。
(2)将循迹小车放置在地毯上,确保其底部的光电传感器与黑线接触。
(3)通过计算机控制循迹小车的启动,观察小车是否能够准确跟踪黑线行进。
(4)记录小车在不同条件下的行进速度、转弯半径等数据,并进行分析。
三、实验结果1. 循迹性能评估通过实验观察和数据记录,我们发现循迹小车在较为平整、光线充足的黑线地毯上表现较好,能够准确跟踪黑线行进。
然而,在黑线不明显、光线较暗的情况下,小车的循迹性能会有所下降。
2. 行进速度与转弯半径根据实验数据分析,循迹小车的行进速度受到多种因素的影响,包括地面摩擦力、电机功率等。
在实验中,我们发现增加电机功率可以提高小车的行进速度,但同时也会增大转弯半径。
3. 应用前景循迹小车作为一种智能机器人,具有广泛的应用前景。
在工业自动化领域,循迹小车可以用于物料搬运、装配线操作等任务;在仓储物流领域,循迹小车可以实现货物的自动分拣、运输等功能;在智能家居领域,循迹小车可以作为家庭服务机器人,提供家居清洁、送餐等服务。
四、实验总结通过本次实验,我们深入了解了循迹小车的工作原理和应用前景。
循迹小车的循迹性能受到地面条件和光线影响,需要进一步优化。
在实际应用中,循迹小车可以广泛应用于工业自动化、仓储物流和智能家居等领域,为人们的生活和工作带来便利。
智能循迹小车-电子设计大赛优选全文

智能寻迹小车总结报告08电本3袁坤朱昊汪武杰1.设计任务:设计并制作了一个智能电动车,通过车前方的感光模块引导小车沿黑色路径运行,并记录小车整个运动过程的时间。
(1)感光模块引导小车运动:小车黑色轨迹白色背景图1如图1,小车运行在以白色背景的黑色轨迹上。
小车在整个运行过程中沿黑色轨迹运动,当黑色轨迹向左转时,小车能够自动左转弯,左转弯灯亮;当黑色轨迹向右转时,小车能够自动右转弯,右转弯灯亮。
(2)小车能记录整个运行过程的时间:在小车开始运行时,单片机控制计时,当小车收到停止指令后,计时器停止计时,并通过小车上的数码管显示小车整个运行过程的时间。
2.程序框图寻迹小车的主程序如下3.系统的具体设计与实现根据设计任务要求,并且根据我们自己的需要而附加的功能,该电路的总体框图可分为几个基本的模块,框图如(图2)所示:红外传感模块3.1设计中选用红外传感器来准确检测黑色寻迹线。
共设置2个传感器,传感器检测到黑色的寻迹线时,输出逻辑电平1,检测不到黑色寻迹线时,输出逻辑电平0。
在小车正前方中间安装两个标号是1号和2号的传感器用于定位寻迹线中心线,如图。
实物图:由电路图可以看出,在整个运行过程中,红外线发射管一直工作,发出红外线,由于黑色对红外线的反射量很小,而白色背景对红外的反射量很大,这样经过红外接收管的电压值的不同,可以判断出小车的运行情况。
当小车在黑色轨迹上正常运行时,1号和2号传感器输出1,当小车右偏时,2号由输出1转变为0,此时单片机驱动电机模块,调控小车左右两轮的转速,调整车身向左转;当小车左偏时,1号由输出1转变为0,单片机调控小车车身向右转。
传感器部分是小车的“眼睛”,只有通过它的引导小车才能正常在轨道上运行。
在小车的调试过程中,遇到了一些问题。
第一,两个传感器中的红外管有时一直感光,有时感光很差;第二,在黑线上运行时,在一些弯路传感器可以判断出来,一些反应迟钝,并且恢复直行的时候,传感器却依然保持上一状态运行。
智能循迹避障小车实习报告

智能循迹避障小车实习报告一、实习背景及目的随着科技的不断发展,嵌入式系统在各个领域的应用越来越广泛。
智能小车作为一种典型的嵌入式系统应用产品,不仅可以锻炼学生的动手能力,还能深入理解嵌入式系统的原理和应用。
本次实习旨在让学生通过设计制作智能循迹避障小车,掌握嵌入式系统的基本原理,提高动手实践能力,培养创新意识和团队协作精神。
二、实习内容与过程1. 实习准备在实习开始前,我们先学习了嵌入式系统的基本原理,了解了微控制器(如STM32)的工作原理和编程方法。
同时,我们还学习了如何使用相关开发工具(如Keil、CubeMX)进行程序开发和仿真。
2. 设计思路根据实习要求,我们确定了智能循迹避障小车的主要功能:远程控制、循迹、避障。
为了实现这些功能,我们需要选用合适的微控制器、传感器、电机驱动模块等硬件,并编写相应的软件程序。
3. 硬件设计我们选用了STM32F103C8T6作为主控制器,它具有高性能、低功耗的特点。
为了实现循迹功能,我们采用了红外传感器来检测地面上的黑线。
为了实现避障功能,我们采用了超声波传感器来检测前方的障碍物。
此外,我们还选用了两个直流电机来驱动小车行驶,并通过L298N驱动模块来控制电机转动。
4. 软件设计软件设计主要包括初始化配置、循迹算法实现、避障算法实现和远程控制实现。
我们使用了CubeMX工具对STM32的硬件资源进行配置,包括时钟、GPIO、ADC、PWM 等。
然后,我们编写了循迹算法和避障算法,通过不断地读取红外传感器和超声波传感器的数据,调整小车的行驶方向和速度,实现循迹和避障功能。
最后,我们通过蓝牙模块实现了手机APP对小车的远程控制。
5. 实习成果经过一段时间的紧张设计与制作,我们的智能循迹避障小车终于完成了。
在实习总结会议上,我们进行了演示,展示了小车的循迹、避障和远程控制功能。
通过实习,我们不仅掌握了嵌入式系统的设计方法,还提高了团队协作能力。
三、实习收获与反思通过本次实习,我们深入了解了嵌入式系统的设计原理,学会了使用相关开发工具和硬件设备,提高了动手实践能力。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
题目名称:迷宫寻迹机器人(E题)参赛队员:************************摘要:本寻迹小车选用8位89C52单片机为控制器,通过6个红外光电传感器TCRT5000对信号进行采集,采集到的信号经比较器LM393处理后传给89C52单片机,经单片机处理后,发出控制命令给L298N,驱动2台直流电动机进行相应的动作。
该小车能够识别出黑色轨迹并能沿着黑色轨迹前进直到终点,并能显示出运行时间。
1方案论证与比较1.1 传感器的选择与比较方案一采用摄像头,然后用CCD处理技术,对采集的信号进行分析。
方案二使用光敏传感器,能够采集回来黑与白两种信号,然后进行处理与分析。
由于采用摄像头进行CCD处理所用的硬件搭接较为繁琐,并且处理起来还比较麻烦,而光敏传感器TCRT5000可以虽然智能识别黑与白两种颜色由于现场条件,并不能对其造成干扰,而且其反应速度快,响应时间短,故此,我们选用光敏传感器TCRT5000。
1.2 车体的选择与比较方案一采用4轮小车,前轮由舵机控制转弯,后轮由动力电机控制前进与后退。
方案二采用三轮小车,前面两轮由两个电机分别控制,用其速度差来实现转弯与调整,后前轮为万向轮,用来维持小车的平衡由于采用4轮车,小车在转弯时会产生转弯半径,会偏离轨迹,不能按照黑色轨迹前进,而转弯半径无法缩小到满意的程度,由于三轮小车用两个电机来控制两个轮子,故很容易来实现转弯与调整,是理想的车体模型。
1.3前进路径与返回路径的最优选择由于小车需要按照黑色轨迹寻到终点,并且按最优路径返回,故小车应能识别迷宫的路况,普通寻迹小车智能按照黑色轨迹走,但不能识别路况,这样小车寻到终点的效率很低,又不能按照最优路径返回。
考虑到以上情况,我们给小车加上了识别路口程序,并且让小车按照右手原则前进,在每个路口处让小车记录出所走过的路况,并且记忆,以便于在返航时调用记录信息,使小车顺利返回。
1.4传感器个数的比较与选择方案一 总共5个传感器,两个传感器用来检测小车是否偏离轨迹,另外三个传感器用来检测小车是否遇到路口(前方.左方及右方各一个),由前方传感器来检测终点。
(如图1.1)方案二 总共6个传感器,其中两个传感器用来检测小车是否偏离轨迹,另外三个传感器用来检测小车是否遇到路口(前方.左方及右方各一个),还有一个传感器配合前方的传感器来检测终点。
(如图1.2)方案三 总共8个传感器,两个传感器用来检测小车是否偏离轨迹,另外五个传感器用来检测小车是否遇到路口(前方一个,左方及右方各两个),还有一个传感器配合前方的传感器来检测终点。
检测路口左右方向时用2个传感器,是以使能减少误判,让小车更好的寻迹。
(如图1.3)方案一比方案二多一个传感器,是为了更好的检测终点,方案一检测终点的方法是前当方传感器检测到死胡同时在让其延时继续前进如图1.4,当再检测到黑色信号时即使终点,但是实际运作时发现由于2cm 对于运动的小车来说过小,而且即便检测到终点在返回时,会再次遇到黑色信号,和死胡同标志容易产生混淆,不易于小车更好的判别路口,而当有第6个传感器辅助前方传感器检测到终点时,则能避免以上问题,当检测到死胡同标志时,只要再继续往前走,辅助检测传感器便会检测到白色信号小车就会认为到达终点如图1.5,避免了小车混淆死胡同与终点标志,同时让终点标志更好的被识别。
而方案三,将检测左右路口的传感器增加至每侧2个,以防出现如图1.6所示的误判,而图1.7的方案三只要两个传感器不全进入黑线就不会认为有路口,能大大的避免误判的几率。
但是后来在软件编写和实际测试的时候,发现了用软件可以进行防误判,而由于这种防误判方法的引入,是传感器的个数从8个减少到了6个,其具体如何防误判将在后面说明。
图1.1五个传感器示意图 图1.2六个传感器示意图图1.3八个传感器示意图图1.4 一个传感器检测终点示意图 图1.5 两个传感器检测终点示意图图1.6 路口误判示意图 图1.7 路口防误判示意图1.5传感器位置摆放的比较与选择1.为了让小车在检测到路口时就进行转弯,在转完后其中线仍与轨迹中线重合,避免了其每次转弯后都进行调整,我们经测量发现小车轮距为10cm ,而轨迹宽度为2cm ,故检测路口的传感器与轮子轴承间的距离D=(10-2)/2=4cm ,如图1.8所示。
2.为了让小车刚刚检测偏离轨迹就做出调整,同时又给小车在走直线时留有余量,经过不断实践测试,认为检测偏离轨迹的两个传感器间距以2.1cm 为最佳。
如图1.9所示。
图1.8 检测转弯路口传感器位置的计算图1.9检测偏离轨迹的传感器示意图3.为了两检测终点的传感器能够准确快速的检测并识别出终点,设定两传感器间距离为2.1cm 。
图1.10 两检测终点传感器间距4.总体摆放如下图1.11,A=1.1cm ,B=3.2cm图1.11总体摆放图2 硬件系统设计 2.1 总体设计有光敏传感器进行信号采集,经电压比较器LM393处理后直接传给AT89C52,单片机对信号按照预定的程序进行处理,将处理的结果通过IO 口传给74LS08,通过与PWM 波合成后给L298N (直流电机驱动芯片)信号,通过L298N 进行控制小车两轮子,以实现左右微调,左右转弯,前进与原地旋转等动作。
小车每到路口都进行相关的记忆处理,以便最优返回。
图2.1 总体设计框架图2.2单元电路设计2.2.1传感器单元电路的设计当传感器进入黑色轨迹中时,由发射管发射的不可见光被吸收,不能被接收器接收到,故接收一侧电路不导通,LM393的同向输入为高,输入比较器输出为高,其输出高电压为5V ,低电压为0V ,故可以直接传给单片机。
而电压比较器的输出端所接的LED 能够实时的显示传感器的工作状况。
图2.2 传感器单元电路本题目要求小车能够不偏离中心轨迹,由于轨迹交窄小车相对运动速度快,故要求传感器单元必须较为灵敏,相应时间短,反应速度快。
我们采用的LM393电压比较器,其工作电源电压范围宽,单电源、双电源均可工作,消耗电流小,输入失调电压小,共模输入电压范围宽,反应时间快,其内部结构图如图 2.3所示。
2.2.2 电机驱动单元电路的设计图2.4 电机驱动电路图由于要对电机实行加速减速刹车的控制,故采用由L298N 和74LS08构成的驱动电路,由1.0和1.1口负责控制1号电机的前进与后退,而与他们一起走与门74LS08的1.4口负责输出PWM 波,由PWM 波负责控制小车的减速与加速以及制动的控制。
同时与门也起到了扩大单片机输出电流的作用,由于L298N 需要的输入电流AT89C52无法驱动,与门在此起到一定的上拉作用。
因为要用单片机对电动机进行四象限的控制,由于控制象限的复杂以及驱动电机功率的问题,这里我们需要采用电动机驱动芯片来实现,我们采用的是L298N 这款电机驱动芯片,该芯片具备控制简单,反应快,输出功率大,支持外接电机工作电源等一系列优点。
其结构图如图2.5所示。
图2.3 LM393内部结构图图2.5 L298N 内部结构图2.2.3电源模块单元电路的设计由于整个控制板都需要5V 电压,考虑到电池随着使用时间的增强,电压会有所下降,故我们选用直流稳压电源9V 进行供电,由于多方同时分流,有可能造成电量不足,为了保持电压能够稳定在5V ,故选用L7805进行稳压。
在其输出输入端口各并联一个电容,以起到保护芯片的作用。
其内部结构图如2.7所示。
图2.6 电源模块单元电路图图2.7 L7805内部结构图2.2.4液晶显示单元电路设计图2.8液晶显示单元电路图采用1602液晶进行时间和方向的显示,我们采用单独的AT89S52来控制液晶,减少其对小车控制的干扰,然后由2根数据线让其与主控AT89S52进行通信,以此来显示小车运行的时间和方向。
图2.8中R38用来控制液晶字幕的清晰度,R37用来控制液晶屏幕的对比度。
3软件系统设计3.1 总体设计小车自上电时程序开始运行,我们依着右手原则为小车寻迹方法,右为先。
自上电后小车进入初始化阶段之后转入主函数,我们将小车能遇到的各种情况进行一一排列出来,这样无论传感器反馈回来什么样的信号都有与之对应的命令,分为以下10种情况:左微调,右微调,前进,左转,右转,T型,左T,右T,十字路口,死胡同。
其流程图如图3.1所示。
3.2 各子模块的设计3.2.1 转弯模块的设计为了让小车能够顺利并且及时的停止转弯,我们将其转弯的停止标志设为当检测前方是否有路的传感器遇到黑色轨迹,即表示其已完成转弯,这样避免了小车转弯过大或者过小的问题。
3.2.2 终点识别模块的设计为了让小车能够准确的识别终点标志,采用2个传感器来检测终点标志,当且仅当前后检测终点的传感器同时检测到终点信号时,才认定到达终点,即当前后前后检测终点的传感器3.2.3 防误判模块的设计列出了小车在行走时可能碰到的各种误判情况,对其一一分析后判别出应是那种路况,将其对应情况列出,并给出小车应该正确运行的指令。
4附加功能增加了小车转弯的转向灯模拟功能,转向灯能随小车的转向实时的闪烁起来,以此一次来表示小车的运转状态,还在车尾处额外增加了两组led小灯,以此表示小车现在处于附录1 主控程序清单#include <reg52.h>#include <stdio.h>#include <intrins.h>/////////////////////////////////////////////////////////////////char pro_left,pro_right,i,j; //左右占空比标志extern int a[24]={3,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};extern int n=2,logo=0;//////////////////////////////////////////////////////////////////sbit left1=P1^0; //左电机正反转sbit left2=P1^1;sbit right1=P1^2; //右电机正反转sbit right2=P1^3;sbit en1=P1^4; //输出PWM1波控制左电机sbit en2=P1^5; //输出PWM2波控制左电机sbit p16=P1^6; //sbit p17=P1^7;//////////////////////////////////////////////////////////////////sbit p23=P2^3;sbit p24=P2^4;sbit p25=P2^5;sbit p26=P2^6;/////////////////////////////////////////////////////////////////sbit left_turn=P0^0; //左侧传感器(识别路口)sbit left=P0^1; //微调左位置sbit midb=P0^2; //后中间传感器(识别路口)sbit midf=P0^3; //前中间(识别路口)sbit right=P0^4; //微调右位置sbit right_turn=P0^5; //右侧传感器(识别路口)////////////////////////////////////////////////////////////////////sbit p20=P2^2; //左拐sbit p21=P2^1; //直走sbit p22=P2^0; //右拐void first_straight(); //启动直走void straight(); //直走void sd_straight(); //左岔直走void stop(); //终点稍停void end(); //回到起点停车void wleft(); //左微调void wright(); //右微调void ft_left(); //左转90 由黑到白void sd_left(); //左转90 由白到黑void ft_right(); //右转90 由黑到白void sd_right(); //右转90 由白到黑void ft_180rt(); //左转180 由黑到白void sd_180rt(); //左转180 由白到黑//////////////////////////////////////////////////////////////////void infrared(); //初次循迹void comeback(); //返航void memory(int x); //记忆void delay(int z); //延时1ms//////////////////////////////////////////////////////////////////void delay(int z) //延时z*1ms {char k;while(z--){for(k=0;k<121;k++);} //延时1ms }//////////////////////////////////////////////////////////////////void first_straight() //启动走直线{p20=1;p21=0;p22=1;pro_left=85;pro_right=85;left1=1;left2=0;right1=1;right2=0;delay(5);}//////////////////////////////////////////////////////////////////void straight() //走直线函数{p20=1;p21=0;p22=1;pro_left=80;pro_right=80;left1=1;left2=0;right1=1;right2=0;}//////////////////////////////////////////////////////////////////void sd_straight() //左岔走直线函数{p20=1;p21=0;p22=1;straight();if((left_turn==1))//&&(right_turn==0)&&(midf==1) {sd_straight();}else{straight();}}//////////////////////////////////////////////////////////////////void wleft() //微调左转函数{pro_left=0;pro_right=85;left1=0;left2=0;right1=1;right2=0;}//////////////////////////////////////////////////////////////////void wright() //微调右转函数{pro_left=85;pro_right=0;left1=1;left2=0;right1=0;right2=0;}//////////////////////////////////////////////////////////////////void ft_left() //左转90 由黑到白{p20=0;p21=1;p22=1;pro_left=0;pro_right=80;left1=0; //左轮不动left2=0; //右轮动right1=1;right2=0;if(midf==1){ft_left();}else{sd_left();}}void sd_left() //左转90 由白到黑{p20=0;p21=1;p22=1;pro_left=0;pro_right=80;left1=0; //左轮不动left2=0; //右轮动right1=1;right2=0;if(midf==0){sd_left();}else{first_straight();straight();}}//////////////////////////////////////////////////////////////////void ft_right() //右转90 由黑到白{p20=1;p21=1;p22=0;pro_left=85;pro_right=0;left1=1; //左轮动left2=0; //右轮不动right1=0;right2=0;if(midf==1){ft_right();}else{sd_right();}}void sd_right() //右转90 由白到黑{p20=1;p21=1;p22=0;pro_left=80;pro_right=0;left1=1; //左轮动left2=0; //右轮不动right1=0;right2=0;if(midf==0){sd_right();}else{first_straight();straight();}}//////////////////////////////////////////////////////////////////void ft_180rt() //左转由黑到白{p20=0;p21=0;p22=0;pro_left=80;pro_right=80;left1=0; //左轮反转left2=1; //右轮正转right1=1;right2=0;if(midf==1){ft_180rt();}elseif(midf==0){sd_180rt();}}void sd_180rt() //左转由白到黑{p20=0;p21=0;p22=0;pro_left=80;pro_right=80;left1=0; //左轮反转left2=1; //右轮正转right1=1;right2=0;if(midf==0){sd_180rt();}else{first_straight();straight();}}////////////////////////////////////////////////////////////////// void stop() //回到起点{while(1){p17=1;p16=1;p23=0;p24=0;p25=0;p26=0;pro_left=0;pro_right=0;left1=1; //或是全等于0left2=1;right1=1;right2=1;}}//////////////////////////////////////////////////////////////////void end() //单程刹车{pro_left=0;pro_right=0;left1=0; //或是全等于1 left2=0;right1=0;right2=0;delay(150);}////////////////////////////////////////////////////////////////// void infrared() //循迹char flag=10;p16=0;p17=1;p23=0;p24=0;p25=1;p26=1;if((left_turn==0)&&(right_turn==0)&&(midf==1)&&(midb==1)&&(left==0)&&(right==0)) {flag=7;} //直线elseif((left_turn==0)&&(right_turn==0)&&(midf==0)&&(midb==0)&&(left==0)&&(right==0 )){flag=4;} // memory(4); 死胡同elseif((left_turn==1)&&(right_turn==0)&&(midf==0)&&(midb==1)){flag=3;} //memory(3);左拐elseif((left_turn==1)&&(right_turn==0)&&(midf==0)&&(midb==0)){flag=13;} //误认为左拐左拐elseif((left_turn==0)&&(right_turn==1)&&(midf==0)&&(midb==1)){flag=1;} //memory(1); 右拐elseif((left_turn==0)&&(right_turn==1)&&(midf==0)&&(midb==0)){flag=11;} //误认为右拐右拐elseif((left_turn==1)&&(right_turn==0)&&(midf==1)&&(midb==1)){flag=2;} //memory(2); 左岔elseif((left_turn==1)&&(right_turn==0)&&(midf==1)&&(midb==0)){flag=12;} //误认为左岔直走elseif((left_turn==1)&&(right_turn==1)&&(midf==0)&&(midb==1)){flag=1;} //memory(1); 丁字elseif((left_turn==1)&&(right_turn==1)&&(midf==0)&&(midb==0)){flag=11;} //误认为丁字右拐elseif((left_turn==0)&&(right_turn==1)&&(midf==1)&&(midb==1)){flag=1;} //memory(1); 右岔elseif((left_turn==0)&&(right_turn==1)&&(midf==1)&&(midb==0)){flag=11;} // 误认为右岔右拐if((left_turn==1)&&(right_turn==1)&&(midf==1)&&(midb==1)){flag=1; } //memory(1); 十字elseif((left_turn==1)&&(right_turn==1)&&(midf==1)&&(midb==0)){flag=11; } //误判十字右拐elseif((left_turn==0)&&(right_turn==0)&&(midf==1)&&(midb==0)&&(left==0)&&(right==0 )){flag=0;} //memory(0); 终点elseif((left_turn==0)&&(right_turn==0)&&(left==0)&&(right==1)){flag=5;} //左偏(right)elseif((left_turn==0)&&(right_turn==0)&&(left==1)&&(right==0)){flag=6;} //右偏(left)else{flag=7;} //直走switch (flag){case 0: p17=0;p16=0;p23=0;p24=0;p25=0;p26=0;end();ft_180rt();memory(0); logo=1; break; //p17=0;p16=0;终点两个灯全亮case 1: ft_right();memory(1); logo=0; break; //右拐case 2: sd_straight();memory(2); logo=0; break; //直走case 3: ft_left();memory(3); logo=0; break; //左拐case 4: ft_180rt();memory(4); logo=0; break; //死胡同case 5: wright(); logo=0; break; //左偏case 6: wleft(); logo=0; break; //右偏case 7: straight(); logo=0; break; //直走case 11: ft_right(); logo=0; break; //误认为右case 12: straight(); logo=0; break; //误认为直case 13: ft_left(); logo=0; break; //误认为左default: straight(); logo=0; break; //}}//////////////////////////////////////////////////////////////////void memory(int mflag) //记忆程序{if(mflag==1){a[n]+=1;if(a[n]==4){a[n]=0;n=n-2;}n++;}elseif(mflag==2){a[n]+=2;n++;}elseif(mflag==3){a[n]+=3;n++;}elseif(mflag==4){a[n]=0;n--;}elseif(mflag==0){n--;}}//////////////////////////////////////////////////////////////////void comeback(){p23=1;p24=1;p25=0;p26=0;p17=0;p16=1;if((left_turn==0)&&(right_turn==0)&&(midf==1)&&(midb==1)&&(left==0)&&(right==0)){ straight();logo=1;} //直线elseif((left_turn==1)&&(midb==1)) //左边有路{switch(a[n]){case 1: ft_left(); logo=1;n--; break;case 2: sd_straight(); logo=1;n--; break;case 3: ft_right(); logo=1;n--; break;}}elseif((right_turn==1)&&(midb==1)) //右边有路{switch(a[n]){case 1: ft_left(); logo=1;n--; break;case 2: sd_straight(); logo=1;n--; break;case 3: ft_right(); logo=1;n--; break;}}elseif((left_turn==0)&&(right_turn==0)&&(midf==0)&&(midb==0)&&(left==0)&&(right==0 )) //&&(n==1){ p17=1;p16=1;stop();} //回到起点两个灯全灭elseif((left_turn==0)&&(right_turn==0)&&(left==0)&&(right==1)){wright();logo=1;} //左偏(motor_right)elseif((left_turn==0)&&(right_turn==0)&&(left==1)&&(right==0)){wleft();logo=1;} //右偏(motor_left)/* else{straight();logo=1;}*/}//////////////////////////////////////////////////////////////////void init(){TMOD=0x01;TH0=(65536-100)/256;TL0=(65536-100)%256;EA=1; //中断总开关ET0=1; //开启定时器0TR0=1; //定时器0启动en1=1; //使能1端en2=1; //使能2端}void time0(void)interrupt 1{i++;j++;if(i<=pro_left) {en1=1;}else en1=0;if(i==100) {en1=~en1;i=0;}if(j<=pro_right) {en2=1;}else en2=0;if(j==100) {en2=~en2;j=0;}TH0=(65536-100)/256;TL0=(65536-100)%256;}//////////////////////////////////////////////////////////////////void main(void){init();delay(1);while(1){if(logo==0){infrared();}if(logo==1){comeback();}}}void int0(void)interrupt 0{}附录2 液晶驱动源代码程序#include<reg52.h>#define uchar unsigned char#define uint unsigned intsbit rs=P1^0;sbit lcden=P1^1;sbit p20=P2^0;sbit p21=P2^1;uchar count,num;char miao,shi,fen;uchar code table[]="2010-6-22 ROBOT"; uchar code table1[]=" 00:00:00"; void time();void delay(uint z){uint x,y;for(x=z;x>0;x--)for(y=110;y>0;y--);}void write_com(uchar com){rs=0;lcden=0;P0=com;delay(5);lcden=1;delay(5);lcden=0;}void write_date(uchar date){rs=1;lcden=0;P0=date;delay(5);lcden=1;delay(5);lcden=0;}void init(){uchar num;lcden=0;write_com(0x38);write_com(0x0c);write_com(0x06);write_com(0x01);write_com(0x80);for(num=0;num<15;num++){write_date(table[num]);delay(5);}write_com(0x80+0x40);for(num=0;num<12;num++){write_date(table1[num]);delay(5);}TMOD=0x01;TH0=(65536-50000)/256;TL0=(65536-50000)%256;EA=1;ET0=1;TR0=1;}void write_sfm(uchar add,uchar date) {uchar shi,ge;shi=date/10;ge=date%10;write_com(0x80+0x40+add);write_date(0x30+shi);write_date(0x30+ge);}void main(){init();while(1){if((p20==1)&&(p21==1))//回到起点{TR0=0;}elseif((p20==0)&&(p21==1))//单程去{TR0=1;time();}elseif((p20==1)&&(p21==0))//单程回{TR0=1;time();}elseif((p20==0)&&(p21==0))//终点{TR0=0;}}}void timer0() interrupt 1{TH0=(65536-50000)/256;TL0=(65536-50000)%256;count++;}void time(void){if(count==18){count=0;miao++;if(miao==60){miao=0;fen++;if(fen==60){fen=0;shi++;if(shi==24){shi=0;}write_sfm(4,shi);}write_sfm(7,fen);}write_sfm(10,miao);}}附录3总体电路图(见下页)。