超声波避障小车
自动避障小车工作原理

自动避障小车工作原理小伙伴们!今天咱们来唠唠超级有趣的自动避障小车。
你看那些小小的车子,在各种复杂的环境里能灵活地避开障碍物,是不是感觉特别神奇呀?自动避障小车呀,就像是一个小小的机灵鬼。
它里面最关键的部分之一就是传感器啦。
传感器就像是小车的小眼睛,有各种各样的类型呢。
比如说超声波传感器,这个东西可有意思啦。
它能发出超声波,就像小车子在喊:“前面有没有东西呀?”然后超声波碰到前面的障碍物就会反射回来,传感器就像小耳朵一样接收到这个反射波。
通过计算发出波和接收波之间的时间差,小车就能知道自己离前面的障碍物有多远啦。
就像我们玩捉迷藏的时候,通过听声音来判断小伙伴的位置一样有趣。
还有红外传感器呢。
红外传感器就像是小车发射出的小触手,它发射出红外线。
如果前面有障碍物,红外线就会被挡住然后反射回来。
小车就知道,“前面有东西挡着我啦,我得绕开。
”这种感觉就像是我们走路的时候,伸出手去摸一摸前面有没有墙一样。
如果摸到了,就赶紧换个方向走。
那小车知道前面有障碍物了,接下来该怎么办呢?这就轮到它的控制部分出场啦。
控制部分就像是小车的小脑袋,它根据传感器传来的信息做决定。
如果传感器告诉它前面的障碍物很近了,小脑袋就会说:“不行啦,得转弯啦。
”然后它就会控制小车的电机。
电机就像是小车的小脚丫,控制着小车的轮子转动。
如果要转弯,它就会让一边的轮子转得快一点,另一边的轮子转得慢一点,这样小车就自然而然地转弯啦。
就像我们走路的时候,想往左边转,就把左边的脚迈得小一点,右边的脚迈得大一点。
而且呀,这个自动避障小车的程序也很重要呢。
程序就像是给小车制定的小规则。
比如说,它规定了在距离障碍物多远的时候开始做出反应。
如果这个距离设置得太短,小车可能就会撞到障碍物上,那就像个小迷糊一样啦。
如果距离设置得太长,小车可能就会过于敏感,老是在没必要的时候转弯。
就像我们人一样,如果太胆小,看到一点点风吹草动就吓得乱跑,或者太大胆,对危险都没反应,那可都不行呢。
超声波避障小车实习报告

超声波避障小车实习报告一、实习背景及目的随着科技的不断发展,机器人技术逐渐应用于各个领域,其中智能避障小车在工业、农业、家庭等领域具有广泛的应用前景。
本次实习旨在学习并掌握超声波避障小车的设计原理与制作方法,提高自己在电子技术、嵌入式系统等方面的实践能力。
二、实习内容与过程1. 原理学习在实习开始前,首先学习了超声波避障小车的基本原理。
超声波避障小车主要是利用超声波传感器测量前方障碍物的距离,根据距离信息控制小车的行驶和转向。
通过学习超声波传感器、控制模块、电机驱动等关键部件的工作原理,为后续的实践操作打下基础。
2. 硬件选型与搭建根据实习要求,选择了AT89S51单片机作为控制核心,搭配HC-SR04超声波传感器、L293D电机驱动模块等硬件。
首先,将超声波传感器与控制模块连接,再通过电机驱动模块控制小车的行驶。
搭建过程中,注意保证电路连接的稳定性和可靠性。
3. 程序编写与调试编写程序时,首先实现超声波传感器的初始化,然后通过循环语句不断检测障碍物距离,当距离小于设定阈值时,控制小车转向。
在程序调试过程中,通过不断修改参数和逻辑,确保小车在各种环境下都能实现稳定避障。
4. 功能测试与优化在实际运行过程中,发现小车在遇到较低矮的障碍物时,避障效果不佳。
分析原因后,针对此问题进行优化,增加了一个红外传感器,用于检测地面高度,当红外传感器检测到地面时,小车进行转向。
经过多次测试,最终实现了较为理想的避障效果。
三、实习收获与反思通过本次实习,掌握了超声波避障小车的设计原理与制作方法,提高了自己在电子技术、嵌入式系统等方面的实践能力。
同时,在实习过程中,学会了如何分析问题、解决问题,培养了自己的动手能力和团队协作精神。
反思整个实习过程,认为在硬件选型和程序编写方面还有待提高。
在硬件选型方面,可以考虑使用更为先进的单片机和传感器,以提高小车的避障精度和速度。
在程序编写方面,可以尝试采用更高效的数据处理算法,减小误判和漏判的情况。
超声波避障小车实训报告

一、实训目的1. 了解超声波避障的基本原理和应用;2. 掌握超声波传感器的工作原理和操作方法;3. 学会使用单片机控制超声波传感器进行避障;4. 培养动手能力和团队协作能力。
二、实训内容1. 超声波传感器原理及特性;2. 单片机编程及驱动;3. 超声波避障系统设计;4. 小车底盘搭建及驱动;5. 超声波避障系统测试与优化。
三、实训步骤1. 超声波传感器原理及特性学习超声波传感器是一种利用超声波进行测距的传感器,其基本原理是发射超声波,接收反射回来的超声波,通过计算超声波的传播时间来得到距离。
超声波传感器具有非接触、抗干扰能力强、测量范围广等特点。
2. 单片机编程及驱动学习单片机是一种具有微处理器的嵌入式系统,用于控制电子设备。
本实训中,我们使用STC89C51单片机作为控制核心。
通过学习单片机编程,我们可以编写程序控制超声波传感器进行避障。
3. 超声波避障系统设计(1)设计思路本实训中,我们设计一款基于超声波避障的小车。
当小车遇到障碍物时,超声波传感器检测到障碍物,单片机接收到信号后,控制小车进行避障。
(2)系统组成系统主要由以下部分组成:①超声波传感器:用于检测前方障碍物;②单片机:负责处理传感器信号,控制小车行驶;③电机驱动模块:驱动小车前进、后退、左转或右转;④电源系统:为整个系统提供电力支持。
(3)系统原理当超声波传感器发射超声波时,遇到障碍物会反射回来。
单片机接收到反射回来的超声波信号后,根据超声波的传播时间计算出障碍物的距离。
当距离小于预设的安全距离时,单片机控制小车进行避障。
4. 小车底盘搭建及驱动(1)小车底盘搭建小车底盘采用4个轮子,分别连接到两个电机驱动模块上。
在底盘上安装超声波传感器,用于检测前方障碍物。
(2)电机驱动模块本实训中,我们使用L298N电机驱动模块。
该模块可以驱动两个电机,实现小车的运动控制。
5. 超声波避障系统测试与优化(1)测试在搭建好的小车底盘上,安装超声波传感器和电机驱动模块。
智能小车超声波避障原理

智能小车超声波避障原理
智能小车超声波避障原理
智能小车是一种能够自动识别环境并作出相应动作的机器人。
其中,
超声波避障技术是实现智能小车避免障碍物的重要手段之一。
超声波传感器是一种利用超声波原理工作的传感器,其工作原理类似
于蝙蝠发出超声波来探测周围环境。
当传感器发出一束超声波时,如
果有障碍物挡住了它的路径,这束超声波就会被反射回来,并被传感
器接收到。
通过计算反射回来的时间和速度,就可以得到障碍物与传
感器之间的距离。
在智能小车中,通常会使用多个超声波传感器分布在不同位置上,以
便更全面地掌握周围环境信息。
当智能小车行驶时,每个超声波传感
器都会不断地发出信号,并接收反射回来的信号。
根据接收到的信息,智能小车可以判断周围是否有障碍物,并做出相应动作。
例如,在前方有障碍物时,智能小车可以通过调整方向或减速等方式
避开障碍物。
同时,智能小车还可以根据不同的传感器反馈信息,判
断障碍物的具体位置和形状,从而更加精确地避开障碍物。
总之,超声波避障技术是智能小车实现自主避障的重要手段之一。
通过多个超声波传感器的配合和反馈信息的处理,智能小车可以更加准确地感知周围环境,并做出相应动作,从而实现自主避障。
超声波避障小车设计

该智能车系统可分为三个主要模块:单片机主控核心模块,传感器避障模块,电机驱动模块。系统主要原理是:经过超声波避障模块(即感测模块)实时监测路面情况并及时传输给单片机。由单片机主控核心模块根据感测模块给予的信息控制小车两电机转动工作状态。电机驱动模块驱动两电机转动,实现前进或者左、右转。
(1)单片机主控核心模块。在这次设计中我们选用已经学过的MCS-51单片机为核心作为控制模块。MCS-51系列单片机是美国Intel公司于1980年推出的产品,MCS-51系列单片机的影响及其深远,许多公司都推出了兼容系列单片机,使MCS-51内核成为一个8位单片机的标准,其典型产品有8031、8051、8751等等。
同组设计者及分工:
张佳炜:资料查找、电路搭建与调试、方案设计
魏孙贵:程序设计及编写
指导教师签字___________________
年月日
教研室主任意见:
教研室主任签字___________________
年月日
开题报告
1立项依据
1.1立项目的
(1)设计一辆利用超声波传感器来实现避障功能的小车,使小车对其运动方向受到的阻碍作出各种躲避障碍的动作。
(2)传感器避障模块。智能车避障系统中的传感器一般分为接触型和非接触型两种,接触型相对比较简单。这里我们使用了超声波传感器进行测量,也即非接触型传感器。
超声波是一种振动频率高于声波的机械波,由换能晶片在电压的激励下发生震动产生的,在碰到杂质获分界面会产生显著反射从而形成反射回波,超声波传感器就是根据超声波在障碍物界面上的反射来判断检测物体的存在以及距离的。超声波频率高,波长短,绕射现象小,方向性好,再加上信息处理简单且价格低廉,因此这里我们使用28015-PING-v1.6超声波传感器对小车行进前方路况进行探测以及判断,它能实现从3cm到1.8m距离的测量,从而识别出范围内的障碍物。我们将其作为传感器避障模块,利用其返回的数据,从而实现小车避障的功能。图1为超声波传感器。
超声波避障小车研究报告2024

超声波避障小车研究报告引言:超声波避障小车是一种基于超声波技术的智能移动装置,能够通过发射和接收超声波信号来实现避障功能。
本文将对超声波避障小车进行详细研究,包括其原理、设计和应用。
概述:超声波避障小车是一种以超声波技术为基础的智能移动装置,主要用于避免与障碍物发生碰撞。
它通过发射超声波信号并接收回波,计算出物体与小车之间的距离,在避障过程中调整方向和速度,从而实现安全移动。
正文内容:1.超声波避障小车的原理1.1超声波避障原理概述1.2超声波传感器的工作原理1.3超声波传感器的种类与选择2.超声波避障小车的设计2.1硬件设计2.1.1控制系统设计2.1.2超声波传感器布置设计2.1.3车体结构设计2.2软件设计2.2.1系统控制算法设计2.2.2超声波信号处理算法设计2.2.3状态判断与控制策略设计3.超声波避障小车的应用3.1家庭智能清洁3.2工业自动化生产线上的搬运工具3.3物流仓储场景中的无人搬运小车3.4农业领域中的自动化播种3.5无人驾驶汽车中的避障技术应用4.超声波避障小车的优缺点4.1优点4.1.1实时性强4.1.2精度较高4.1.3成本相对较低4.2缺点4.2.1受环境因素干扰较大4.2.2测距范围有限4.2.3障碍物形状复杂时易产生误判5.超声波避障小车的发展前景5.1技术趋势5.2市场需求5.3应用前景总结:超声波避障小车是一种利用超声波技术实现避障功能的智能移动装置。
它的原理是通过发射超声波信号并接收回波来测量物体与小车之间的距离,并根据距离调整移动方向和速度,以避免碰撞。
在设计方面,需要考虑控制系统、传感器布置和车体结构等因素。
在应用方面,超声波避障小车可以广泛应用于家庭清洁、工业自动化生产线、物流仓储、农业以及无人驾驶汽车等领域。
尽管超声波避障小车具有一定的优点,如实时性强、精度高和成本相对低廉,但也存在受环境因素干扰大、测距范围有限以及复杂障碍物误判等缺点。
随着技术的不断进步和市场的不断需求,超声波避障小车仍具有广阔的发展前景。
超声波避障小车实习报告

一、实习背景随着科技的不断发展,智能机器人技术在各个领域得到了广泛应用。
其中,超声波避障技术作为一种非接触式测距技术,因其具有非破坏性、高精度、抗干扰能力强等优点,在智能机器人领域具有广泛的应用前景。
本次实习,我们设计并制作了一款基于超声波避障技术的智能小车,旨在通过实践操作,提高我们的动手能力和创新能力。
二、实习目的1. 熟悉超声波避障技术的基本原理和应用。
2. 掌握超声波传感器、单片机、电机驱动器等硬件设备的使用方法。
3. 学会编写控制程序,实现小车自主避障功能。
4. 提高团队协作能力和实践操作能力。
三、实习内容1. 超声波避障原理超声波避障技术是利用超声波传感器发射超声波,当超声波遇到障碍物时,会被反射回来。
通过计算发射和接收超声波的时间差,可以计算出障碍物与传感器之间的距离。
当距离小于设定值时,控制系统会发出避障指令,使小车改变行驶方向。
2. 硬件设备(1)超声波传感器:用于检测前方障碍物距离。
(2)单片机:作为控制系统核心,负责处理数据、发出控制指令。
(3)电机驱动器:驱动小车前进、后退、左转或右转。
(4)电源模块:为整个系统提供稳定可靠的电力支持。
3. 软件设计(1)编写控制程序:根据超声波传感器检测到的距离,编写程序控制小车行驶方向。
(2)调试程序:通过调试,使小车在遇到障碍物时能够自动避障。
四、实习过程1. 硬件组装(1)根据电路图,将超声波传感器、单片机、电机驱动器等硬件设备连接到电路板上。
(2)连接电源模块,确保电路板供电正常。
2. 编写控制程序(1)编写程序实现超声波传感器数据读取、处理和避障逻辑。
(2)编写程序实现电机驱动控制,使小车按照预设逻辑行驶。
3. 调试程序(1)通过调试,使小车在遇到障碍物时能够自动避障。
(2)调整程序参数,提高小车避障精度和稳定性。
五、实习成果1. 成功制作了一款基于超声波避障技术的智能小车。
2. 掌握了超声波避障技术的基本原理和应用。
3. 提高了动手能力和编程能力。
寻迹避障小车原理

寻迹避障小车原理
小车避障就是一种无人机,它可以认出汽车前方的不同障碍物,并以
此作出响应。
它具有自主的智能,即在它看到障碍物之后,会根据障碍的
位置和距离选择合适的方法来避开它。
一种典型的小车避障就是超声波避障。
它使用超声波传感器来测量障
碍物的距离,而且能够自动识别障碍物的大小、形状和位置。
检测到障碍
物之后,小车就会根据障碍物的位置来决定向左转还是向右转,还可以前
进避开障碍物,最后回到正常的路径。
此外,超声波避障的检测距离通常
只有几厘米,所以它也可以用于小距离的避障。
另一种小车避障的解决方案是使用红外传感器。
与超声波传感器不同,红外传感器可以检测到更远距离的障碍物,而且它还可以分辨出障碍物的
形状。
因此,使用红外传感器就可以在更远的距离上检测到障碍物,从而
更好地避免碰撞。
有时候,为了更准确地让小车避障,还会使用摄像头。
摄像头可以拍
摄到前方的障碍物,从而让小车根据障碍物的形状和大小来决定避开它们
的方法。
同时,摄像头也可以用来检测前方是否有其他车辆,从而给小车
提供躲避其他车辆的能力。
最后,为了让小车自主寻找传感器能够检测到的障碍物,可以采用激
光定位系统。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
《单片机课程设计》设计报告设计课题:超声波避障小车专业班级:电子信息工程121班学生姓名:范东耀指导教师:蔡岗设计时间: 2015年7月8日赣南师范学院科技学院数学与信息科学系超声波避障小车一、设计任务与要求1.设计任务:1、采用超声波模块实现小车自动避障功能。
2、用LCD1602显示当前的障碍距离。
2.扩展部分:测出当前小车的行驶速度,并用LCD1602显示当前速度。
二、方案设计与论证1设计方案系统采用51单片机作为核心控制单元用于智能车系统的控制,驱动板则以L289N驱动芯片为核心,应用超声波模块及光电传感器和LCD液晶模块,成功的实现了小车的避障、测速和显示功能这三大功能。
在超声波检测到障碍物之后,主控芯片根据距离值控制电机的转动,在与障碍物距离较大的情况下,快速前进,在与障碍物距离较小但未到达临界转弯方向值得时候,慢速前进。
在与障碍物距离较近时,小车转弯,在与障碍物很近时,小车后退转弯,来进行避障。
测速传感器为光电测速传感器,在单位时间内计算脉冲的次数,然后再进行转换和处理即得到所测量的速度。
通过软件pwm进行调速。
通过LCD1602显示障碍距离及当前的小车行驶速度。
2 原理框图简要原理框图如图1所示。
图1 系统原理框图三、电路设计1 电路设计(1)超声波测距模块:超声波测距的原理是首先利用单片机输出一个40kHz的触发信号,把触发信号通过TRIG管脚输入到超声波测距模块,再由超声波测距模块的发射器向某一方向发射超声波,在发射时刻的同时单片机通过软件开始计时,超声波在空气中传播,途中碰到障碍物返回,超声波测距模块的接收器收到反射波后通过产生一个回应信号并通过ECHO脚反馈给单片机,此时单片机就立即停止计时。
时序图如图1所示。
由于超声波在空气中的传播速度为340m/s,根据计时器记录的时间t,就可以计算出发射点距障碍物的距离,即:S=VT/2,通过单片机来算出距离。
超声波测距原理图如图2所示。
图2 超声波测距原理(2)显示模块:系统采用LCD1602显示,它不仅节省了单片机的资源,相比较数码管液晶显示更加直观、节能,同时可以直接显示字母、数字、符号等,具有灵活易操作的特性。
故采用LCD显示。
引脚功能说明:LCD1602采用标准的16脚(带背光)接口,各引脚接口说明如表1所示:表1 LCD1602引脚说明(3)电机驱动模块:本系统采用由双极性管组成的H桥电路(L298N)。
用单片机控制晶体管使之工作在占空比可调的开关状态,精确调整电机转速。
这种电路由于工作在管子的饱和截止模式下,则效率非常高;H桥电路保证了可以简单地实现转速和方向的控制,电子开关的速度很快,稳定性也很高。
而且它有更强的驱动能力。
L298N 有过电流保护功能,当出现电机卡死时,可以保护电路和电机等。
驱动电机的运行,I/O端口状态与电机制动对照表,如下表2所示。
表2 I/O端口状态与电机制动对照表(4)光耦传感器光耦传感器原理是传感器开孔圆盘的转轴与减速电机转轴相连,光源的光通过开孔盘的孔和缝隙反射到光敏元件上,开孔盘旋转体转一周,光敏元件上照到光的次数等于盘上的开孔数,从而测出旋转体旋转速度。
灵敏度较高,但容易受外界光源的影响。
虽然光电传感器受外界光源影响很大,但是它使用方便、安装简单,还有本设计要求的准确度不是很高,因此就选择了光耦测速传感器。
光耦测速传感器的原理图如图3所示。
图3 光耦测速传感器原理图2 主要性能参数计算当单片机的给一个20us的触发信号给超声波模块时,TRIG由低电平转换为高电平,TRIG=1,单片机开时计时,开启中断,并记录时间为T1,接收换能器等待接收回波,ECHO持续为高电平的时间为发射时间。
换能器接收回波将超声波转换为电信号,送至单片机,记录时间为T2。
超声波发射的时间为:T2-T1,C 为声速,计算发射距离为: L = (T2-T1)*C/2 。
速度的计算是通过小车轮胎的周长除以测码盘转过孔的个数,得出一个码盘孔对应的长度为1CM,通过定时器取1秒时间,1秒转过的码盘孔个数就是速度。
3程序流程图本设计系统软件由主程序﹑定时子程序、电机驱动子程序﹑中断子程序、显示子程序﹑算法子程序构成。
主程序流程图如图4所示。
图4主程序流程图四、电路制作及调试1 实物图通过以上步骤,制作出实物图。
正面图如图5所示,反面图如图6所示。
图5 实物图正面图6 实物图反面2 电路调试测试在小车的调试的过程中,碰到的最大的问题就是程序有时会跑飞,起初我觉得出现问题的原因是有以下三点,第一,程序的编写过于繁杂,数据处理和逻辑判断太多,芯片处理不过来,第二,数据经过处理后,传送出去未来得及经过处理就已经改变了值,导致芯片来不及处理而跑飞,第三,数据的类型没有定义好,导致数据的值超过定义的类型的极限。
经过几天的程序调试,我简化了程序的编写,在重要数据的传送过程中加入了延时函数,保证数据有充足的传送时间,并把各种参数定义的类型检查了几遍,结果并没有解决程序跑飞的问题。
最后我发现问题出在电源上,由于小车负载较多,电源带载能力有限,导致芯片受到干扰而跑飞,我将耗电能力较强的直流电机的电源断开,电源只给芯片和其他模块供电,程序能够良好的运行。
最后我通过在程序中加入“看门狗”的程序,判断程序是否跑飞,若程序跑飞,将软件复位。
能有效的解决程序跑飞的问题。
在做测速模块时,发现单片机的资源不够用,单片机只有两个定时器,我在做超声波测距时已经用了一个定时器的计数模式做测距,小车的PWM调速用了一个定时器。
而做测速还需要两个定时器,一个定时器做计数,计码盘转的圈数,一个定时器定1秒的时间,从而可以算出当前的小车速度。
我通过学习,了解了定时器复用,可以从PWM中的1MS定时做处理,取出1S的时间,用外部中断计码盘的圈数,再通过数据处理,可以得出小车的速度。
3 元件清单元件清单如表3所示。
表3 元件清单五参考文献[1]潘永雄.沙河.电子线路CAD实用教程(第四版)[M].西安电子科技大学出版社,2012.[2]高吉祥.电子技术基础实验与课程设计(第二版)[M].电子工业出版社,2005.[3]王港元.电子设计制作基础[M].江西科学技术出版社,2011.[4]彭介华.电子技术课程设计指导[M].高等教育出版社,2009.[5]陈伯时.电力拖动自动控制系统[M].机械工业出版社,2012.赣南师范学院科技学院2014-2015学年第二学期期末考试《单片机课程设计》成绩评定表专业:电子信息工程班级:121班学号: 1220085110 姓名:范东耀#include <AT89x51.H>#include <intrins.h>#define uchar8 unsigned char#define uint16 unsigned int#define pwm_left 70 //设置左右两边的PWM都为45sfr WDT_CONTR = 0xE1; //用sfr定义看门狗特殊功能寄存器#define RX P3_1 //收#define TX P3_0 //发#define LCM_RW P2_5 //定义LCD引脚#define LCM_RS P2_6#define LCM_E P2_7#define LCM_Data P0#define Busy 0x80 //0124用于检测LCM状态字中的Busy标识sbit tracking_right1 = P1 ^ 4; //右边电机sbit tracking_right2 = P1 ^ 5;sbit tracking_left1 = P1 ^ 2; //左边电机sbit tracking_left2 = P1 ^ 3;sbit pwm2 = P1 ^ 7;uint16 count1=0,count2=0,F=0;uint16 tmp=0;void LCMInit(void);void DisplayOneChar(unsigned char X, unsigned char Y, unsigned char DData);void DisplayListChar(unsigned char X, unsigned char Y, unsigned char code *DData);void Delay5Ms(void);void Delay400Ms(void);void Decode(unsigned char ScanCode);void WriteDataLCM(unsigned char WDLCM);void WriteCommandLCM(unsigned char WCLCM,BuysC);unsigned char ReadDataLCM(void);unsigned char ReadStatusLCM(void);unsigned char code email[] ={"juli"};unsigned char code ASCII[20] ={'0','1','2','3','4','5','6','7','8','9','.','-','M','m','/','s','S', '=','V','c'};unsigned char code A[] = {"sudu"};static unsigned char DisNum = 0; //显示用指针unsigned int time=0;unsigned long S=0;bit flag =0;unsigned char disbuff[4] ={ 0,0,0,0,}; //超声波距离值赋值进来 unsigned char disbuffsudu[4] ={ 1,2,3,4,};//速度值赋值进来void delayms(uint16 c){uint16 a,b;for(a=0;a<c;a++)for(b=0;b<113;b++);}void turn_left() //左转函数{tracking_right1 = 1;tracking_right2 = 0;tracking_left1 = 0;tracking_left2 = 0;}void big_left() //大左转函数{tracking_right1 = 1;tracking_right2 = 0;tracking_left1 = 0;tracking_left2 = 1;}void turn_right() //右转函数{tracking_right1 = 0;tracking_right2 = 0;tracking_left1 = 1;tracking_left2 = 0;}void go_straight() //直走函数{tracking_right1 = 1;tracking_right2 = 0;tracking_left1 = 1;tracking_left2 = 0;}void right_back()//右后退函数{tracking_right1 = 0;tracking_right2 = 1;tracking_left1 = 0;tracking_left2 = 0;}void left_back()//左后退函数{tracking_right1 = 0;tracking_right2 = 0;tracking_left1 = 0;tracking_left2 = 1;}void tracking(S) //避障函数{if(S<=15){right_back();delayms(10);}else if((S>15)&&(S<30)){turn_right();delayms(10);}else{go_straight();delayms(10);}}void Timer1Init(void) //pwm{TMOD &= 0x0F; //设置定时器模式TMOD |= 0x10; //设置定时器模式TL1 = 0x66; //设置定时初值TH1 = 0xFC; //设置定时初值,定时1MS TF1 = 0; //清除TF0标志TR1 = 1; //定时器0开始计时EA=1; //开总中断ET1=1; //开定时器1中断}void serve_T1() interrupt 3 //pwm{TL1 = 0x66; //设置定时初值TH1 = 0xFC; //设置定时初值count1++;if(++count2<=(pwm_left)){pwm2=1;}else if(count2<=100){pwm2=0;}else count2=0;if(1000==count1) //1s的定时{count1=0; //定时标志位清零,为下次做准备F=tmp; //F为每秒记录下来的脉冲,tmp为外部中断的个数,读取计数数据delayms(10);tmp=0;delayms(5);}}void counter(void) interrupt 0{EX0=0;tmp++; //外部中断计数delayms(10);EX0=1;}void cesu(F){disbuffsudu[1]=F/10%10; //取十位disbuffsudu[2]=F%10; //取个位DisplayOneChar(8, 1, ASCII[disbuffsudu[1]]);DisplayOneChar(9, 1, ASCII[disbuffsudu[2]]);DisplayOneChar(10, 1, ASCII[19]); //显示cDisplayOneChar(11, 1, ASCII[13]); //显示mDisplayOneChar(12, 1, ASCII[14]); //显示/DisplayOneChar(13, 1, ASCII[15]); //显示s}//写数据void WriteDataLCM(unsigned char WDLCM){ReadStatusLCM(); //检测忙LCM_Data = WDLCM;LCM_RS = 1;LCM_RW = 0;LCM_E = 0; //若晶振速度太高可以在这后加小的延时LCM_E = 0; //延时LCM_E = 1;}//写指令void WriteCommandLCM(unsigned char WCLCM,BuysC) //BuysC为0时忽略忙检测{if (BuysC) ReadStatusLCM(); //根据需要检测忙LCM_Data = WCLCM;LCM_RS = 0;LCM_RW = 0;LCM_E = 0;LCM_E = 0;LCM_E = 1;}//读数据unsigned char ReadDataLCM(void){LCM_RS = 1;LCM_RW = 1;LCM_E = 0;LCM_E = 0;LCM_E = 1;return(LCM_Data);}//读状态unsigned char ReadStatusLCM(void){LCM_Data = 0xFF;LCM_RS = 0;LCM_RW = 1;LCM_E = 0;LCM_E = 0;LCM_E = 1;while (LCM_Data & Busy); //检测忙信号return(LCM_Data);}void LCMInit(void) //LCM初始化{LCM_Data = 0;WriteCommandLCM(0x38,0); //三次显示模式设置,不检测忙信号Delay5Ms();WriteCommandLCM(0x38,0);Delay5Ms();WriteCommandLCM(0x38,0);Delay5Ms();WriteCommandLCM(0x38,1); //显示模式设置,开始要求每次检测忙信号WriteCommandLCM(0x08,1); //关闭显示WriteCommandLCM(0x01,1); //显示清屏WriteCommandLCM(0x06,1); // 显示光标移动设置WriteCommandLCM(0x0F,1); // 显示开及光标设置}//按指定位置显示一个字符void DisplayOneChar(unsigned char X, unsigned char Y, unsigned char DData){Y &= 0x1;X &= 0xF; //限制X不能大于15,Y不能大于1if (Y) X |= 0x40; //当要显示第二行时地址码+0x40;X |= 0x80; //算出指令码WriteCommandLCM(X, 1); //发命令字WriteDataLCM(DData); //发数据}//按指定位置显示一串字符void DisplayListChar(unsigned char X, unsigned char Y, unsigned char code *DData){unsigned char ListLength;ListLength = 0;Y &= 0x1;X &= 0xF; //限制X不能大于15,Y不能大于1while (DData[ListLength]>0x19) //若到达字串尾则退出{if (X <= 0xF) //X坐标应小于0xF{DisplayOneChar(X, Y, DData[ListLength]); //显示单个字符ListLength++;X++;}}}//5ms延时void Delay5Ms(void){unsigned int TempCyc = 5552;while(TempCyc--);//400ms延时void Delay400Ms(void){unsigned char TempCycA = 5;unsigned int TempCycB;while(TempCycA--){TempCycB=7269;while(TempCycB--);};}void Conut(void){time=TH0*256+TL0;TH0=0;TL0=0;S=(time*1.7)/100; //算出来是CMdelayms(5);if((S>=900)||flag==1) //超出测量范围显示“-”{flag=0;DisplayOneChar(9, 0, ASCII[11]);DisplayOneChar(10, 0, ASCII[10]); //显示点DisplayOneChar(11, 0, ASCII[11]);DisplayOneChar(12, 0, ASCII[11]);DisplayOneChar(13, 0, ASCII[12]); //显示M}else{disbuff[0]=S%1000/100;//先对1000取余,再对100取整disbuff[1]=S%1000%100/10;disbuff[2]=S%1000%10%10;DisplayOneChar(9, 0, ASCII[disbuff[0]]);DisplayOneChar(10, 0, ASCII[10]); //显示点DisplayOneChar(11, 0, ASCII[disbuff[1]]);DisplayOneChar(12, 0, ASCII[disbuff[2]]);DisplayOneChar(13, 0, ASCII[12]); //显示M}}void zd0() interrupt 1 //T0中断用来计数器溢出,超过测距范{flag=1; //中断溢出标志}void StartModule() //启动模块{TX=1; //启动一次模块 _nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();TX=0;}void main(void){WDT_CONTR = 0x34; //看门口启动,硬件清零后重新计数Timer1Init();IT0=1; //外部中断0设置为下降沿触发EA=1;EX0=1; //外部中断允许LCMInit(); //LCM初始化Delay5Ms(); //延时片刻(可不要)DisplayListChar(2, 0, email);DisplayListChar(2, 1, A);TMOD=0x01; //设T0为方式1,GATE=1;TH0=0;TL0=0;ET0=1; //允许T0中断EA=1; //开启总中断while(1){StartModule();while(!RX); //当RX为零时等待TR0=1; //开启计数while(RX); //当RX为1计数并等待TR0=0; //关闭计数Conut(); //计算delayms(80); //80MStracking(S);cesu(F);WDT_CONTR = 0x34; //看门狗启动,硬件清零后重新计数}}。