电动智能小车_第1页
电动智能小车_第2页
电动智能小车_第3页
电动智能小车_第4页
电动智能小车_第5页
已阅读5页,还剩44页未读, 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

摘要STC89C51单片机是一款八位单片机,他的易用性和多功能性受到了广大使用者的好评。这里介绍的是如何用STC89C51单片机来实现简易智能电动车设计,该设计是结合科研项目而确定的设计类课题。本系统以设计题目的要求为目的,采用STC89C51单片机为控制核心,利用避障传感器检测道路上的障碍,控制电动小汽车的自动避障,快慢速行驶,以及自动停车,并可以自动记录时间、里程和速度,自动寻迹和寻光功能。整个系统的电路结构简单,可靠性能高。实验测试结果满足要求,本文着重介绍了该系统的硬件设计方法及测试结果分析。采用的技术主要有:通过编程来控制小车的速度;传感器的有效应用;新型显示芯片的采用.关键词STC89C51单片机、光电检测器、PWM调速、电动小车DesignandcreateanintelligenceelectricitymotivesmallcarAbstract89C51isa8bitsinglechipcomputer.Itseasilyusingandmulti-functionsufferlargeusers.ThisarticleintroducestheCCUTgraduationdesignwiththe89C51singlechipcomputer.Thisdesigncombineswithscientificresearchobject.Thissystemregardstherequestofthetopic,adopting89C51forcontrollingcore,supersonicsensorfortestthehinder.Itcanruninahighandalowspeedorstopautomatically.Italsocanrecordthetime,distanceandthespeedorsearchinglightandmarkautomaticallytheelectriccircuitconstructionofwholesystemissimple,thefunctionisdependable.Experimenttestresultsatisfytherequest,thistextemphasizesintroducedthehardwaresystemdesignsandtheresultanalyze.Theadoptionoftechniqueas:Reducethespeedbyprogramtheengine;Efficientapplicationofthesensor;Theadoptionofthenewdisplaychip.Keywords89C51singlechipcomputer,lightelectricitydetector,PWMspeedadjusting,Electricitymotivesmallcar目录TOC\o"1-3"\h\z第一章前言 3第二章系统功能描述及设计思路 4一系统功能描述 4二设计思路 5第三章硬件设计电路 6一80C51单片机硬件结构 6二最小应用系统设计 7三主控器 9四电机驱动控制 10五寻迹传感器电路 11六避障传感器电路 11七显示电路 12八PWM输出控制电路 12九声光提示电路 13十电源电路 14第四章软件设计 15一软件流程 15二代码分析 16第五章小结 31致谢 31参考文献 32附录A程序清单 33附录B硬件原理图 45第一章前言随着汽车工业的迅速发展,关于汽车的研究也就越来越受人关注。全国电子大赛和省内电子大赛几乎每次都有智能小车这方面的题目,全国各高校也都很重视该题目的研究。可见其研究意义很大。本设计就是在这样的背景下提出的,指导教师已经有充分的准备。本题目是结合科研项目而确定的设计类课题。设计的智能电动小车应该能够实时显示时间,具有自动寻迹、寻光、避障功能,可程控行驶速度、准确定位停车。根据题目的要求,确定如下方案:在现有玩具电动车的基础上,加装光电、红外线、避障传感器等电路,实现对电动车的速度、位置、运行状况的实时测量,并将测量数据传送至单片机进行处理,然后由单片机根据所检测的各种数据实现对电动车的智能控制。这种方案能实现对电动车的运动状态进行实时控制,控制灵活、可靠,精度高,可满足对系统的各项要求。本设计采用MCS-51系列中的STC89C51单片机。以STC89C51为控制核心,利用超声波传感器检测道路上的障碍,控制电动小汽车的自动避障,快慢速行驶,以及自动停车,并可以自动记录时间,自动寻迹和寻光功能。STC89C51是一款八位单片机,它的易用性和多功能性受到了广大使用者的好评。它是第四代单片机的代表。第四代单片机包括了Intel公司发展MCS-51系列的新一代产品。新一代的单片机的最主要的技术特点是向外部接口电路扩展,以实现Microcomputer完善的控制功能为己任,将一些外部接口功能单元如A/D﹑PWM﹑PCA(可编程计数器阵列)﹑WDT(监视定时器)﹑高速I/O口﹑计数器的捕获/比较逻辑等。这一代单片机中,在总线方面最重要的进展是为单片机配置了芯片间的串行总线,为单片机应用系统设计提供了更加灵活的方式。Philips公司还为这一代单片机STC89C51系列8xC592单片机引入了具有较强功能的设备间网络系统总线CAN(ControllerAreaNetworkBUS).新一代单片机为外部提供了相当完善的总线结构,为系统的扩展与配置打下了良好的基础。本设计就采用了比较先进的80C51为控制核心,80C51采用CHOMS工艺,功耗很低。该设计具有实际意义,可以应用于考古、机器人、医疗器械等许多方面。尤其是在足球机器人研究方面具有很好的发展前景;在考古方面也应用到了超声波传感器进行检测。所以本设计与实际相结合,现实意义很强。第二章系统功能描述及设计思路由于机械结构的不同,智能车有两种控制转向的方式,一种是采用四轮双电机结构,前面两个轮子用于控制转向,后面两个控制速度;另一种是采用三轮双电机结构,前面采用一个万向轮,后面采用两台电动机分别控制两个轮子,利用两个轮子速度不同来实现转向。这里设计的简单智能小车采用的是第二种机械结构。这种方案能实现对电动车的运动状态进行实时控制,控制灵活、可靠,精度高,可满足对系统的各项要求。一系统功能描述如图1-1所示,设计制作一个智能小车,该小车能按照要求自行运动,按照虚线路径通过一个建筑物中曲折的道路,并完成规划的动作。设矩形建筑物有两个门A,B,门宽24cm,建筑物的墙壁是10cm高,2cm厚的矮墙,建筑物内无引导轨迹。具体功能如下:.要求智能小车从A门进入并开始自动计时,从B门出来,在行进过程中,能自动选择适当的路径,避开墙壁,找到通路,三分钟之内到达B门;.到达B门,停5s,小车自动计时并数字显示AB段所用的时间,并声光报警;.自B门外,循环形引导轨迹BC前进(引导轨迹为2cm宽);.到达C点后,小车停止前进并停止计时,显示BC段所用的时间;BC图1-1小车小车A二设计思路在本次设计中,小车底盘选取的是三轮双电机结构,通过后轮电动机转速和转向的不同实现对小车方向的控制。左右两侧电动机控制采用电动机驱动芯片L298实现驱动,转速调节是通过单片机输出的PWM脉冲宽度方式进行调节。为了保证小车在建筑物内行进过程中不碰壁,因此选用一组光电开关实现障碍物的检测,当传感器检测到障碍物时进行及时避让和调整。另外,在小车离开建筑物时,可以通过安装在小车底部的光电开关检测黑色循迹线,使得小车沿线运行。第三章硬件电路设计一个单片机应用系统的硬件电路设计包含有两部分内容:一是系统扩展,即单片机内部的功能单元,如ROM﹑RAM﹑I/O口﹑定时/记数器﹑中断系统等能量不能满足应用系统的要求时,必须在片外进行扩展,选择适当的芯片,设计相应的电路。二是系统配置,既按照系统功能要求配置外围设备,如键盘显示器﹑打印机﹑A/D﹑D/A转换器等,要设计合适的接口电路。一STC89C51单片机硬件结构STC89C51单片机是把那些作为控制应用所必需的基本内容都集成在一个尺寸有限的集成电路芯片上[2]。如果按功能划分,它由如下功能部件组成,即微处理器、数据存储器、程序存储器、并行I/O口、串行口、定时器/计数器、中断系统及特殊功能寄存器。它们都是通过片内单一总线连接而成,其基本结构依旧是CPU加上外围芯片的传统结构模式。但对各种功能部件的控制是采用特殊功能寄存器的集中控制方式。1微处理器该单片机中有一个8位的微处理器,与通用的微处理器基本相同,同样包括了运算器和控制器两大部分,只是增加了面向控制的处理功能,不仅可处理数据,还可以进行位变量的处理。2数据存储器片内为128个字节,片外最多可外扩至64k字节,用来存储程序在运行期间的工作变量、运算的中间结果、数据暂存和缓冲、标志位等,所以称为数据存储器。3程序存储器由于受集成度限制,片内只读存储器一般容量较小,如果片内的只读存储器的容量不够,则需用扩展片外的只读存储器,片外最多可外扩至64k字节。4中断系统具有5个中断源,2级中断优先权。5定时器/计数器片内有2个16位的定时器/计数器,具有四种工作方式。6串行口1个全双工的串行口,具有四种工作方式。可用来进行串行通讯,扩展并行I/O口,甚至与多个单片机相连构成多机系统,从而使单片机的功能更强且应用更广。7P1口、P2口、P3口、P4口为4个并行8位I/O口。8特殊功能寄存器共有21个,用于对片内的个功能的部件进行管理、控制、监视。实际上是一些控制寄存器和状态寄存器,是一个具有特殊功能的RAM区。由上可见,80C51单片机的硬件结构具有功能部件种类全,功能强等特点。特别值得一提的是该单片机CPU中的位处理器,它实际上是一个完整的1位微计算机,这个一位微计算机有自己的CPU、位寄存器、I/O口和指令集。1位机在开关决策、逻辑电路仿真、过程控制方面非常有效;而8位机在数据采集,运算处理方面有明显的长处。MCS-51单片机中8位机和1位机的硬件资源复合在一起,二者相辅相承,它是单片机技术上的一个突破,这也是MCS-51单片机在设计的精美之处。二最小应用系统设计STC89C51是片内有ROM/EPROM的单片机,因此,这种芯片构成的最小系统简单﹑可靠。用80C51单片机构成最小应用系统时,只要将单片机接上时钟电路和复位电路即可,如图3.1STC89C51单片机最小系统所示。由于集成度的限制,最小应用系统只能用作一些小型的控制单元。其应用特点:有可供用户使用的大量I/O口线。内部存储器容量有限。应用系统开发具有特殊性。图1-2STC89C51单片机最小系统1、时钟电路STC89C51虽然有内部振荡电路,但要形成时钟,必须外部附加电路。STC89C51单片机的时钟产生方法有两种。内部时钟方式和外部时钟方式。本设计采用内部时钟方式,利用芯片内部的振荡电路,在XTAL1、XTAL2引脚上外接定时元件,内部的振荡电路便产生自激振荡。本设计采用最常用的内部时钟方式,即用外接晶体和电容组成的并联谐振回路。振荡晶体可在1.2MHZ到12MHZ之间选择。电容值无严格要求,但电容取值对振荡频率输出的稳定性、大小、振荡电路起振速度有少许影响,CX1、CX2可在20pF到100pF之间取值,但在60pF到70pF时振荡器有较高的频率稳定性。所以本设计中,振荡晶体选择6MHZ,电容选择65pF。在设计印刷电路板时,晶体和电容应尽可能靠近单片机芯片安装,以减少寄生电容,更好的保证振荡器稳定和可靠地工作。为了提高温度稳定性,应采用NPO电容。2、复位电路STC89C51的复位是由外部的复位电路来实现的。复位引脚RST通过一个斯密特触发器用来抑制噪声,在每个机器周期的S5P2,斯密特触发器的输出电平由复位电路采样一次,然后才能得到内部复位操作所需要的信号。复位电路通常采用上电自动复位和按钮复位两种方式。最简单的上电自动复位电路中上电自动复位是通过外部复位电路的电容充电来实现的。只要Vcc的上升时间不超过1ms,就可以实现自动上电复位。时钟频率用6MHZ时C取22uF,R取1KΩ。除了上电复位外,有时还需要按键手动复位。本设计就是用的按键手动复位。按键手动复位有电平方式和脉冲方式两种。其中电平复位是通过RST端经电阻与电源Vcc接通而实现的。按键手动复位电路见图3.2。时钟频率选用6MHZ时,C取22uF,Rs取200Ω,RK取1KΩ。图1-3STC89C51复位电路如图1-4所示,智能电动车的系统原理框图主要包括主控器,电动机驱动控制电路,避障红外传感器电路,寻线红外传感器电路,显示电路,时钟电路,报警电路和电源电路等部分构成。电动机驱动控制电动机驱动控制显示电路避障红外传感器主控器显示电路避障红外传感器主控器时钟电路寻线红外传感器时钟电路寻线红外传感器报警电路报警电路电源电路 电源电路图1-4智能电动车的系统原理框图三主控器本系统中主控器需要对双电机进行控制,因此需要使用PWM脉冲信号输出。AT89S51是一种低功耗,高性能CMOS8位微控制器,三个定时器/计数器,具有8KB在系统可编程Flash存储器。主控器外围电路如图1-5所示。图1-5主控器外围电路图四电动机驱动控制L298是SGS公司(意法半导体公司)的一款H桥电动机驱动芯片。该芯片内部有4通道逻辑驱动电路,具有两套H桥电路,可以方便地驱动两个直流电动机。电动机驱动控制电路如图1-6所示。图1-6电动机驱动控制电路图五寻迹传感器电路寻迹传感器电路采用TCRC5000L型红外对管进行设计。该型号的传感器内部由一个高发射功率红外光电二极管和高灵敏度光电晶体管组成,具有体积小,结构紧猝,灵敏度高,工作性能稳定等特点,能够满足本次设计的要求。传感器的工作原理如下:红外发射管发出红外线,若红外光照射到白色的平面将存在反射光线,传感器会输出一个低电平信号:反之,若红外光照射到黑色的平面将无反射光线,传感器侧输出一个高电平信号。寻迹传感器电路如图1-7所示,通过一个电压比较器可以获取每个传感器的检测状态。如果传感器末检测到黑线,比较器LM324会输出一个低电平;如果检测到黑线,LM324则输出一个高电平。为了节省单片机的I/O接口,这里通过74LS165将8个传感器输出信号转为串行信号送入单片机中。图1-7寻迹传感器电路六避障传感器电路避障传感器电路采用红外光电开关E3F-DS10C4进行避障。该型号的传感器具有操作简单,使用方便等特点。传感器内部将集发射器和接收器于一体,当有被检测物体经过时,物体将光电开关发射器发射的足够量的光线反射到接收器,于是光电开关就产生了开关信号。当有光线反射回来时,传感器输出低电平信号;当没有光线反射回来时,输出高电平信号。避障传感器电路如图1-8所以,同样为了节省单片机的I/O接口,这里也通过74LS165将6个传感器输出信号转为串行信号送入单片机中。图1-8寻迹传感器电路七显示电路本系统需要显示的内容较少,主要是计时时间的显示,因此选用一个LCD1602即可实现该项功能。LCD1602液晶也称1602字符型液晶,是一种专门用来显示字母,数字,符号等的点阵型液晶模块,可以显示两行,每行16个字符液晶模块(显示字符和数字)。该显示模块具有微功耗,体积小,显示内容丰富,超薄轻巧等特点,常用在袖珍式仪表和低功耗应用系统中。本系统显示电路如图1-9所示。图1-9显示电路八PWM输出控制电路PWM信号的产生电路如图1-10所示。8254所需的基准频率是由有源晶振Y2产生的。晶振Y2的震荡频率为1MHz,因此产生周期为1us的时钟信号。图1-10PWM输出控制电路九声光提示电路声光提示电路如图1-11所示,发光二极管的驱动采用灌电流的方式,当单片机驱动引脚LED为低电平时,发光二极管点亮。蜂鸣器使用一个PNP三极管进行驱动,当单片机BEEP引脚输出低电平时,蜂鸣器发出声音进行提示。图1-11声光提示电路十电源电路智能小车的驱动电机需要9V直流电,采用充电电池供电。因此,需要通过一个电源变换电源实现DC9V到DC5V的转换。这里选用一个开关电源芯片LM2576进行设计,该芯片是美国国家半导体公司生产的3A集成稳压电路,它内部集成了一个固定的振荡器,只需极少外围器件便可构成一种高效的稳压电路,可大大减小散热片的体积,而在大多数情况下不需散热片,内部有完整的保护电路,包括电流限制及热关断电路等。电源电路如图1-12所示。图1-12电源电路第四章软件设计一软件流程简易智能电动车的主程序流程如图1-13所以。系统上电后,首先完成对定时器T0,T1和液晶的初始化,然后启动智能车前进,进入避障和循迹程序的检测。开始开始初始化初始化定时器T0初始化初始化定时器T1初始化液晶初始化液晶小车前进小车前进 避障,循迹检测避障,循迹检测 图1-13主程序流程图避障程序流程如图1-14所示,在该程序中,系统实时读取避障传感器的状态,更加各传感器的输入信号来判断智能车的行进位置及状态,并根据位置和状态信息及时调整车的走向。图1-14避障程序流程图在单片机控制系统中,大体上可分为数据处理、过程控制两个基本类型。数据处理包括:数据的采集、数字滤波、标度变换等。过程控制程序主要是使单片机按一定的方法进行计算,然后再输出,以便控制生产。为了完成上述任务,在进行软件设计时,通常把整个过程分成若干个部分,每一部分叫做一个模块。所谓“模块”,实质上就是所完成一定功能,相对独立的程序段,。二代码分析 智能车控制软件分为主程序,避障传感器检测程序,循迹传感器检测程序,电动机控制程序,显示程序,定时器T0,T1有关子程序,延时程序等,各部分程序功能如下: 主程序通过调用各个子程序,实现系统功能。 避障传感器检测程序用于检测智能车在迷宫中的行进状态,并及时调整小车的位置避免与迷宫内的墙壁发生碰撞。 循迹传感器检测程序用于检测智能车在迷宫外的进行状态,通过这些传感器可以实现车沿着黑线进行,防止跑偏。 电动机控制子程序是实现对智能车实现前进,制动,左转,右转等控制。 显示程序主要是显示智能车的行进状态,并对行进过程进行计时。 定时器T0有关子程序包括完成对T0的初始化设置,以及在T0的中断服务程序中对定时器T0和8254的初值设置等功能。 定时器T1有关子程序包括完成对T1的初始化设置,以及在T1的中断服务程序中对定时器实现计时时间的计算。 延时函数用于在智能车行进过程中行走状态的保持。系统具体的程序代码如下。1.函数声明及变量定义 为方便程序的编写,这里把部分常用的变量进行定义。由于本实列中显示器件选用的是LCD1602,该器件在前面的章节中已经进行了详细的介绍,这里就不在重述了。修改LCD1602.C文件中引脚定义,然后直接引用该头文件。#include<reg52.h>#include<intrins.h>#include<absacc.h>#include<LCD1602.h>#defineucharunsignedchar#defineuintunsignedint#defineCount0XBYTE[0x1fff] //8254计数器0#defineCount1XBYTE[0x3fff] //8254计数器1#defineCon_wordXBYTE[0x7fff] //8254控制字/*********************引脚声明**********************///避障传感器输出sbit sen1dat=P3^1; //74165数据引脚sbit sen1clk=P3^0; //74165时钟引脚sbit sen1ld=P3^4; //74165锁存引脚//循迹传感器输出sbit sen2dat=P3^2; //74165数据引脚sbit sen2clk=P3^3; //74165时钟引脚sbit sen2ld=P3^5; //74165锁存引脚//左侧电机sbit IN1=P1^2;sbit IN2=P1^3;sbit PWM0=P1^6;//右侧电机sbit IN3=P1^4;sbit IN4=P1^5;sbit PWM1=P1^7;//声光提示sbit beep=P1^7; //声音提示sbit led=P1^6; //发光提示/*********************变量定义**********************/bit OutFlag=0;bit h0,h1,h2,h3,h4,h5; //障碍物检测标志位uchar hped,xped;uchar MeaTime=0;uchar MeaMs=0;uchar disbuffer[2];uint time1=20000,time2=20000; //8254计数器0、计数器1初值uchar codeDispTAB[]={"0123456789ABCDEF"}; //显示代码uchar codeTab1[]={"Position:"};uchar codeTab2[]={"Time:"};uchar codeTab3[]={"A>B"};uchar codeTab4[]={"B>C"};/*********************函数声明**********************/uchar Sen1In(void); //避障传感器信号uchar Sen2In(void); //循迹传感器信号void initPWM(void); //初始化PWM占空比void Delay1ms(uinti); //延时程序void Leftself(void); //原地左转void Rightself(void); //原地右转void Left(void); //左转void Right(void); //右转void Forward(void); //前进void Brake(void); //停车void Track(void); //循迹程序void Avoidance(void); //避障程序void init_T0(void); //初始化T0void init_T1(void); //初始化T1void initdisp(void);2.主程序 进入系统主程序后,首先对定时器T0,T1进行初始化设置,然后初始化LCD1602并显示初始信息,启动智能车前进,在循环程序中将调用传感器检测程序调整小车运行状态。voidmain(void){init_T0();init_T1();Inlt_LCD1602();initdisp();Forward();Delay1ms(5000);while(1){Avoidance();Delay1ms(200);}}智能车运动控制智能车运动控制程序主要实现控制小车原地右转,左转,右转,前进,停止等动作。该部分程序由以下程序构成,如表1-15所示。表1-15智能车运动控制程序及功能表序号函数名功能序号函数名功能1Leftself()原地左转程序4Right()右转程序2Rightself()原地右转程序5Forward()前进程序3Left()左转程序6Brake()停止程序下面对这几个程序加以详细介绍。(1)Leftself():原地左转程序通过调用Leftself()程序控制智能车实现原地左转,该过程中智能车的左右两侧电动机会实现同转速反向运动。voidLeftself(void){IN1=1;IN2=0;IN3=0;IN4=1;}(2)Rightself():原地右转程序通过调用Rightself()程序控制智能车实现原地右转,本过程中智能车的左右两侧电动机也会实现同转速反向运动。voidRightself(void){IN1=0;IN2=1;IN3=1;IN4=0;}(3)Left():左转程序通过调用Left()程序控制智能车实现左转,本过程中智能车的右侧电动机转动,而左侧电动机停转。voidLeft(void){IN1=0;IN2=0;IN3=1;IN4=0;}(4)Right():右转程序通过调用Right()程序控制智能车实现右转,本过程中智能车的左侧电动机转动,而右侧电动机停转。voidLeft(void){IN1=0;IN2=0;IN3=1;IN4=0;}(5)Forward():前进程序通过调用Forward()程序控制智能车前进,两侧电动机以同速度运行。voidForward(void){IN1=1;IN2=0;IN3=1;IN4=0;}(5)Brake():停止程序通过调用Brake()程序控制智能车停止,两侧电动机停止运行。voidBrake(void){IN1=1;IN2=1;IN3=1;IN4=1;}4.传感器检测子程序智能车传感器检测程序主要实现避障传感器的检测,循迹传感器的检测,避障调整程序,循迹调整程序等动作。该部分程序由以下程序构成,如表1-16所示表1-16传感器检测子程序及功能序号函数名功能序号函数名功能1Sen1In():避障传感器检测程序3Track():循迹调整程序2Sen2In():循迹传感器检测程序4Avoidance():避障调整程序下面对这几个程序加以详细介绍。(1)Sen1In():避障传感器检测程序通过74LS165将6个避障传感器的状态转为串行输出信号送入51单片机,再由单片机程序屏蔽没用到的前两位,返回检测状态值。ucharSen1In(void){ uchari,temp; //载入数据 sen1ld=0; _nop_(); _nop_(); sen1ld=1; //移出数据 for(i=0;i<8;i++) { temp<<=1; sen1clk=0; if(sen1dat)temp=temp|0x01; sen1clk=1; } sen2clk=0; temp=temp&0x3f; return(temp);}(2)Sen2In():循迹传感器检测程序通过74LS165将8个避障传感器的状态转为串行输出信号送入51单片机,该函数返回检测状态值。ucharSen2In(void){ uchari,temp; //载入数据 sen2ld=0; _nop_(); _nop_(); sen2ld=1; //移出数据 for(i=0;i<8;i++) { temp<<=1; sen2clk=0; if(sen2dat)temp=temp|0x01; sen2clk=1; } sen2clk=0; return(temp);}(3)Track():循迹调整程序读取循迹传感器状态,然后根据该状态判断车体相对于黑线循迹线的位置,判断并调整智能车,使得车体中线沿着轨迹线前进。voidTrack(void){ xped=Sen2In(); switch(~xped) { case0x80: Leftself(); for(;0x18!=~Sen2In();); Forward(); break; case0xc0: Right(); for(;xped==Sen2In();); Forward(); break; case0x60: Right(); for(;xped==Sen2In();); Forward(); break; case0x40: Right(); for(;xped==Sen2In();); Forward(); break; case0x30: Right(); for(;xped==Sen2In();); Forward(); break; case0x20: Right(); for(;xped==Sen2In();); Forward(); break; case0x18: Forward(); break; case0x0c: Left(); for(;xped==Sen2In();); Forward(); break; case0x08: Left(); for(;xped==Sen2In();); Forward(); break; case0x06: Left(); for(;xped==Sen2In();); Forward(); break; case0x04: Left(); for(;xped==Sen2In();); Forward(); break; case0x02: Left(); for(;xped==Sen2In();); Forward(); break; case0x03: Left(); for(;xped==Sen2In();); Forward(); break; case0x01: Rightself(); for(;0x18!=~Sen2In();); Forward(); break; case0x00: Delay1ms(100); if(Sen2In()==0xff) { Brake(); } break; }}(3)Avoidance():循迹调整程序读取避障传感器状态,然后根据该状态判断车体在迷宫内的位置,判断并调整智能车,使得车体在迷宫内前进。voidAvoidance(void){ hped=Sen1In(); h0=hped&0x01; h1=hped&0x02; h2=hped&0x04;//右侧标志位测不到物体时,向右转90度 h3=hped&0x08;//左侧标志位测不到物体时向左转90度 h4=hped&0x10; h5=hped&0x20;//替代H3 //如果左右两边都有障碍 if((h2==0)&&(h5==0)) { Forward(); // if((h1==0)&&(h0==1)) { Forward(); Right(); while(hped==Sen1In()); Forward(); }//左侧有障碍 elseif((h0==0)&&(h1==1)) { Forward(); Left(); while(hped==Sen1In()); Forward(); }//右边有障碍 elseif((h0==0)&&(h1==0)) Brake();//同时检测到障碍 } //如果左侧无障碍 if((h2==0)&&(h5==1)) { Forward(); Left(); Delay1ms(2000); hped=Sen1In(); h0=hped&0x01; h1=hped&0x02; h2=hped&0x04; h3=hped&0x08; h4=hped&0x10; h5=hped&0x20; if((h1==0)&&(h0==1)) { Forward(); Right(); while(hped==Sen1In()); Forward(); } } //如果右侧无障碍 if((h5==0)&&(h2==1)) { Forward(); Right(); Delay1ms(2000); hped=Sen1In(); h0=hped&0x01; h1=hped&0x02; h2=hped&0x04; h3=hped&0x08; h4=hped&0x10; h5=hped&0x20; if((h0==0)&&(h1==1)) { Forward(); Left(); while(hped==Sen1In()); Forward(); } } //如果左右都无障碍 if((h2==1)&&(h5==1)) { hped=Sen1In(); h0=hped&0x01; h1=hped&0x02; h2=hped&0x04; h3=hped&0x08; h4=hped&0x10; h5=hped&0x20; if((h4==0)&&(h3==0))//若前方有障碍,说明仍在迷宫 { Forward(); Left(); Delay1ms(2000); Forward(); } else//若前方没有障碍,说明已经出迷宫 { Forward(); if(Sen2In()!=0xff) { OutFlag=1; MeaTime=0; LcdStartPos(0x40); Print(Tab4); } if(OutFlag) { Brake(); beep=0; led=0; Delay1ms(2000); beep=1; led=1; Forward(); Left(); while(1) { Track(); } } Delay1ms(2000); Forward(); } }}定时器有关子程序本系统用到了定时器T0和T1,其中定时器T0用于产生PWM脉冲调制函数,定时器T1用于定时基准信号的产生,这部分是由以下几个程序构成,如表1-17所示。表1-17定时器相关子程序及功能序号函数名功能序号函数名功能1init_T0():定时器T0初始化程序3timer0()定时器TO中断服务程序2init_T1():定时器T1初始化程序4Timer1()定时器T1中断服务程序下面对这几个程序进行详细介绍。init_T0():定时器T0初始化程序init_T0()用于实现对定时器T0初始化设置,其中定时器工作为方式1,定时时间为50ms。voidinit_T0(void){TMOD=0x01; //工作方式1TH0=0x3c; //定时50msTL0=0xb0;ET0=1; //允许定时器T0中断EA=1; //开总中断TR0=1; //启动定时器T0}init_T1():定时器T1初始化程序init_T1()用于实现对定时器T1初始化设置,其中定时器工作为方式1,定时时间为50ms。voidinit_T1(void){TMOD=TMOD|0x10;TH1=0x3C;TL1=0x0B0;ET1=1;TR1=1;}(3)timer0():定时器T0中断服务程序timer0()用于定时向8254芯片写入计数初值,以实现8254芯片能够输出PWM控制信号对电动机速度进行控制。voidtimer0(void)interrupt1{TR0=0;TH0=0x3c; //重载定时器T0初值TL0=0xb0; TR0=1;Con_word=0x30; //写8254计数器0初值Count0=(uchar)(time1%256);Count0=(uchar)(time1/256);Con_word=0x70; //写8254计数器1初值Count0=(uchar)(time2%256); Count0=(uchar)(time2/256);}(4)timer1():定时器T1中断服务程序timer1()用于50ms基准时钟信号的产生,每1s更新一次计时数值并显示。voidtimer1(void)interrupt3{TH1=0x3C;TL1=0x0B0; if(++MeaMs==20) { MeaTime++; disbuffer[0]=DispTAB[MeaTime/10]; disbuffer[1]=DispTAB[MeaTime%10]; LcdStartPos(0x49); Print(disbuffer); } }其他有关子程序除了以上几个子程序块以外,本系统还包括显示内容初始化和延时函数等,这部分是由以下几个程序构成。.initdisp():显示初始化函数;.Delay1ms():延时程序。下面就对这两个程序进行详细介绍。initdisp():显示初始化函数Delay1ms()用于显示上电时显示内容的初始化。voidinitdisp(void){ LcdStartPos(0x00); Print(Tab1); LcdStartPos(0x09); Print(Tab3); LcdStartPos(0x40); Print(Tab2);}Delay1ms():延时程序Delay1ms延时程序用于在调整智能车运动时保证调整动作能够到位。voidDelay1ms(uinti){uintj;while(i--){for(j=0;j<125;j++);}}第五章小结致谢历时三个月的毕业设计已经告一段落。经过自己不断的搜索努力以及老师的耐心指导和热情帮助,本设计已经基本完成。在这段时间里,老师严谨的治学态度和热忱的工作作风令我十分钦佩,他的指导使我受益非浅。同时本系205实验室的开放也为我的设计提供了实习场地。在此对老师和牛晓升老师表示深深的感谢。通过这次毕业设计,使我深刻地认识到学好专业知识的重要性,也理解了理论联系实际的含义,并且检验了大学三年的学习成果。虽然在这次设计中对于知识的运用和衔接还不够熟练。但是我将在以后的工作和学习中继续努力、不断完善。这三个月的设计是对过去所学知识的系统提高和扩充的过程,为今后的发展打下了良好的基础。由于自身水平有限,设计中一定存在很多不足之处,敬请各位老师批评指正。参考文献1何立民,单片机应用系统设计,北京:航天航空大学出版社,2~5,46~502李广弟,单片机基础,北京:北京航空航天大学出版社,2001,56~643何希才,新型实用电子电路400例,电子工业出版社,2000年,60~654赵负图,传感器集成电路手册,第一版,化学工业出版社,2004,590~5915陈伯时,电力拖动自动控制系统,第二版,北京:机械工业出版社,2000年6月,127~1306张毅刚,彭喜元,新编MCS-51单片机应用设计,第一版,哈尔滨工业大学出版社,2003,25~27,411~417附录A程序清单#include<reg52.h>#include<intrins.h>#include<absacc.h>#include<LCD1602.h>#defineucharunsignedchar#defineuintunsignedint#defineCount0XBYTE[0x1fff] //8254计数器0#defineCount1XBYTE[0x3fff] //8254计数器1#defineCon_wordXBYTE[0x7fff] //8254控制字/*********************引脚声明**********************///避障传感器输出sbit sen1dat=P3^1; //74165数据引脚sbit sen1clk=P3^0; //74165时钟引脚sbit sen1ld=P3^4; //74165锁存引脚//循迹传感器输出sbit sen2dat=P3^2; //74165数据引脚sbit sen2clk=P3^3; //74165时钟引脚sbit sen2ld=P3^5; //74165锁存引脚//左侧电机sbit IN1=P1^2; sbit IN2=P1^3; sbit PWM0=P1^6; //右侧电机sbit IN3=P1^4; sbit IN4=P1^5; sbit PWM1=P1^7; //声光提示sbit beep=P1^7; //声音提示sbit led=P1^6; //发光提示/*********************变量定义**********************/bit OutFlag=0;bit h0,h1,h2,h3,h4,h5; //障碍物检测标志位uchar hped,xped;uchar MeaTime=0;uchar MeaMs=0;uchar disbuffer[2];uint time1=20000,time2=20000; //8254计数器0、计数器1初值uchar codeDispTAB[]={"0123456789ABCDEF"}; //显示代码uchar codeTab1[]={"Position:"};uchar codeTab2[]={"Time:"};uchar codeTab3[]={"A>B"};uchar codeTab4[]={"B>C"};/*********************函数声明**********************/uchar Sen1In(void); //避障传感器信号uchar Sen2In(void); //循迹传感器信号void initPWM(void); //初始化PWM占空比void Delay1ms(uinti); //延时程序void Leftself(void); //原地左转void Rightself(void); //原地右转 void Left(void); //左转void Right(void); //右转 void Forward(void); //前进void Brake(void); //停车void Track(void); //循迹程序void Avoidance(void); //避障程序void init_T0(void); //初始化T0void init_T1(void); //初始化T1void initdisp(void); //显示程序/*********************延时函数**********************/voidDelay1ms(uinti){uintj;while(i--){for(j=0;j<125;j++);}}/*********************左转控制**********************/voidLeftself(void){IN1=1;IN2=0;IN3=0;IN4=1;}/*********************右转控制**********************/voidRightself(void){IN1=0;IN2=1;IN3=1;IN4=0;}/*********************右转控制**********************/voidLeft(void){IN1=0;IN2=0;}/*********************右转控制**********************/voidRight(void){ IN3=0; IN4=0;}/*********************前进控制**********************/voidForward(void){IN1=1;IN2=0;IN3=1;IN4=0;}/*********************刹车控制**********************/voidBrake(void){IN1=1;IN2=1;IN3=1;IN4=1;}/********************避障传感器*********************/ucharSen1In(void){ uchari,temp; //载入数据 sen1ld=0; _nop_(); _nop_(); sen1ld=1; //移出数据 for(i=0;i<8;i++) { temp<<=1; sen1clk=0; if(sen1dat)temp=temp|0x01; sen1clk=1; } sen2clk=0; temp=temp&0x3f; return(temp);}/********************循迹传感器*********************/ucharSen2In(void){ uchari,temp; //载入数据 sen2ld=0; _nop_(); _nop_(); sen2ld=1; //移出数据 for(i=0;i<8;i++) { temp<<=1; sen2clk=0; if(sen2dat)temp=temp|0x01; sen2clk=1; } sen2clk=0; return(temp);}/*********************循迹程序**********************/voidTrack(void){ xped=Sen2In(); switch(~xped) { case0x80: Leftself(); for(;0x18!=~Sen2In();); Forward(); break; case0xc0: Right(); for(;xped==Sen2In();); Forward(); break; case0x60: Right(); for(;xped==Sen2In();); Forward(); break; case0x40: Right(); for(;xped==Sen2In();); Forward(); break; case0x30: Right(); for(;xped==Sen2In();); Forward(); break; case0x20: Right(); for(;xped==Sen2In();); Forward(); break; case0x18: Forward(); break; case0x0c: Left(); for(;xped==Sen2In();); Forward(); break; case0x08: Left(); for(;xped==Sen2In();); Forward(); break; case0x06: Left(); for(;xped==Sen2In();); Forward(); break; case0x04: Left(); for(;xped==Sen2In();); Forward(); break; case0x02: Left(); for(;xped==Sen2In();); Forward(); break; case0x03: Left(); for(;xped==Sen2In();); Forward(); break; case0x01: Rightself(); for(;0x18!=~Sen2In();); Forward(); break; case0x00: Delay1ms(100); if(Sen2In()==0xff) { Brake(); } break; }}voidAvoidance(void){ hped=Sen1In(); h0=hped&0x01; h1=hped&0x02; h2=hped&0x04; //右侧标志位测不到物体时,向右转90度 h3=hped&0x08; //左侧标志位测不到物体时向左转90度 h4=hped&0x10; h5=hped&0x20; //替代H3 //如果左右两边都有障碍 if((h2==0)&&(h5==0)) { Forward(); // if((h1==0)&&(h0==1)) { Forward(); Right(); while(hped==Sen1In()); Forward(); } //左侧有障碍 elseif((h0==0)&&(h1==1)) { Forward(); Left(); while(hped==Sen1In()); Forward(); } //右边有障碍 elseif((h0==0)&&(h1==0)) Brake(); //同时检测到障碍 } //如果左侧无障碍 if((h2==0)&&(h5==1)) { Forward(); Left(); Delay1ms(2000); hped=Sen1In(); h0=hped&0x01; h1=hped&0x02; h2=hped&0x04; h3=hped&0x08; h4=hped&0x10; h5=hped&0x20; if((h1==0)&&(h0==1)) { Forward(); Right(); while(hped==Sen1In()); Forward(); } } //如果右侧无障碍 if((h5==0)&&(h2==1)) { Forward(); Right(); Delay1ms(2000); hped=Sen1In(); h0=hped&0x01; h1=hped&0x02; h2=hped&0x04; h3=hped&0x08; h4=hped&0x10; h5=hped&0x20; if((h0==0)&&(h1==1)) { Forward(); Left(); while(hped==Sen1In()); Forward(); } } //如果左右都无障碍 if((h2==1)&&(h5==1)) { hped=Sen1In(); h0=hped&0x01; h1=hped&0x02; h2=hped&0x04; h3=hped&0x08; h4=hped&0x10; h5=hped&0x20; if((h4==0)&&(h3==0)) //若前方有障碍,说明仍在迷宫 { Forward(); Left(); Delay1ms(2000); Forward(); } else //若前方没有障碍,说明已经出迷宫 { Forward(); if(Sen2In()!=0xff) { OutFlag=1; MeaTime=0; LcdStartPos(0x40); Print(Tab4); } if(OutFlag) { Brake(); beep=0; led=0; Delay1ms(2000); beep=1; led=1; Forward(); Left(); while(1) { Track(); } } Delay1ms(2000); Forward(); } }}/**********************定时器T0初始化*********************/voidinit_T0(void){TMOD=0x01; //工作方式1TH0=0x3c; //定时50msTL0=0xb0;ET0=1; //允许定时器T0中断EA=1; //开总中断TR0=1; //启动定时器T0}/**********************定时器T0初始化*********************/voidinit_T1(void){TMOD=TMOD|0x10;TH1=0x3C;TL1=0x0B0;ET1=1;TR1=1;}/********************定时器TO中断服务程序****************/voidtimer0(void)interrupt1{TR0=0;TH0=0x3c; //重载定时器T0初值TL0=0xb0; TR0=1;Con_word=0x30; //写8254计数器0初值Count0=(uchar)(time1%256);Count0=(uchar)(time1/256);Con_word=0x70; //写8254计数器1初值Count0=(uchar)(time2%256); Count0=(uchar)(time2/256);}/********************定时器TO中断服务程序****************/voidtimer1(void)interrupt3{TH1=0x3C;TL1=0x0B0; if(++MeaMs==20) { MeaTime++; disbuffer[0]=DispTAB[MeaTime/10]; disbuffer[1]=DispTAB[MeaTime%10]; LcdStartPos(0x49); Print(disbuffer); } }voidinitdisp(void){ LcdStartPos(0x00); Print(Tab1); LcdStartPos(0x09); Print(Tab3); LcdStartPos(0x40); Print(Tab2);}voidmain(void){ init_T0(); init_T1(); Inlt_LCD1602(); initdisp(); Forward(); Dela

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论