基于单片机的智能小车毕业论文_第1页
基于单片机的智能小车毕业论文_第2页
基于单片机的智能小车毕业论文_第3页
基于单片机的智能小车毕业论文_第4页
基于单片机的智能小车毕业论文_第5页
已阅读5页,还剩38页未读 继续免费阅读

下载本文档

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

文档简介

..本科毕业设计〔论文本科毕业设计〔论文基于单片机的智能小车控制专业:测控技术与仪器姓名:咸蛋小超人20XX6月..基于单片机的智能小车控制摘要:智能化作为现代电子产品的新趋势,是今后的电子产业的发展方向。智能化设计的电子产品可以按照预先设定的模式在一个环境里自动运作,不需要人为的管理,可应用于科学勘探、环境监测、智能家居等方面。基于单片机的智能小车控制就是其中的一个体现。本设计实现了一种基于51单片机的自动避障智能模型车系统,通过红外传感器采集路况信息,通过对检测信息的分析,自动控制转向电机转向,改变行驶路径,绕过障碍物,从而实现车稳定避障。本课题设计的智能小车,具有自动避障功能,超声波测距报警,无线电遥控等功能。关键词:智能车;51单片机;避障;红外线SmartcarbasedonSCMcontrolAbstract:Asanewtrendofmodernelectronicproducts,intelligentisthedevelopmentaldirectionofelectronicindustryafterthen.Electronicproducts,whichareintelligentlydesigned,canautomaticallyoperatefollowingthemodethatispre-set.Withoutthemanagementofhumanbeings,itcanbeusedforscientificexploring,environmentalmonitoring,intelligenthomefurnishing,etc.Oneoftheembodimentsistheintelligentcontrolcarwhichisbasedonsinglechipmicrocomputer.Inthedesign,anintelligentmodelcarsystembasedonMCU51hasbeenrealized.Itcancollecttrafficinformationwithinfraredsensors.Meanwhile,bytheanalysisofinformationexamined,itcantransferfromautomaticcontroltomotorsteeringinordertochangetherouteanddodgetheobstaclessothatthesteadyavoidanceofthebarriercancometrue.Inthispaper,acarwiththeabilityofintelligentjudgmenthasbeendesignedandmade.Itfunctionsasthedevicewhichcandodgeobstaclesautomatically,alarmwithultrasonicdistanceexamination,andremotecontrolbyradio.Keywords:SmartCart;Single-chip51;ObstacleAvoidance;InfraredTOC\o"1-3"\u目录TOC\o"1-3"\u序言3第1章总体设计方案41.1课题任务分析41.2方案论证41.2.1小车遥控部分51.2.2小车驱动部分6第2章系统硬件构成72.1系统设计原理72.2主要元器件简介72.2.1STC89C52RC简介72.2.2NRF24L01无线收发芯片简介82.2.3L298N芯片直流电机驱动模块92.2.4红外避障模块92.2.5HC-SR04超声波测距模块112.2.6蜂鸣器驱动电路132.2.7液晶显示电路132.2.8遥控部分独立按键电路14第3章软件的设计与说明153.1软件设计153.2软件的说明163.2.1遥控部分主程序流程163.2.224L01子程序流程图173.2.3小车部分主程序流程图18第4章调试与总结204.1硬件部分204.1.1硬件的焊接20..4.1.224L01无线电模块204.1.3外接电源模块204.2软件部分214.2.1超声波模块214.3小车联调214.4调试的总结23参考文献24致谢26附录27附件1L298N电机驱动模块27附件2小车侧视图28附件3小车俯视图29附件4小车的遥控部分30附件5小车最终硬件图31附件6程序清单321.遥控部分程序322.小车部分程序41附件7元器件清单50附件8英文资料及中文翻译51..序言随着我国科学技术的进步,智能化和自动化技术越来越普及,各种高科技也广泛应用于智能小车和机器人玩具制造领域,使智能机器人越来越多样化。智能小车是一个多种高新技术的集成体,它融合了机械、电子、传感器、计算机硬件、软件、人工智能等许多学科的知识,涉及到当今许多前沿领域的技术[1]。而智能电动车正是智能机器人的一种,具有不可估量的实际意义。智能车辆是一个运用计算机、传感、信息、通信、导航、人工智能及自动控制等技术来实现环境感知、规划决策和自动行驶为一体的高新技术综合体。它在军事、民用和科学研究等方面已获得了应用,对解决道路交通安全提供了一种新的途径。随着汽车工业的迅速发展,关于汽车的研究也就越来越受人关注。全国电子大赛和省内电子大赛几乎每次都有智能小车这方面的题目,全国各高校也都很重视该题目的研究,许多国家已经把电子设计比赛作为创新教育的战略性手段。电子设计涉及到多个学科,机械电子、传感器技术、自动控制技术、人工智能控制、计算机与通信技术等等,是众多领域的高科技[2]。电子设计技术,它是一个国家高科技实例的一个重要标准,可见其研究意义很大。第1章总体设计方案1.1课题任务分析当前的电动小汽车基本上采取的是基于纯硬件电路的一种开环控制方法,或者是直线行使,或者是在遥控下作出前进、后退、转弯、停车等基本功能。但是这不能满足某些特殊场合下的要求。基于此,本文设计了智能小车控制系统。智能小车是一个运用传感器、单片机、信号处理、电机驱动及自动控制等技术来实现环境感和自动行驶为一体的高新技术综合体,它在军事、民用和科学研究等方面已获得了应用。通过各种选题之后,我们发现制作智能小车非常有意思,它唤起我们对玩具的革新思想,智能小车制作的兴趣。自己遇到过的汽车的功能是怎样的,想通过自己的手创作出属于自己的智能汽车。也夹杂一种童年时对玩具智能化的假想。所以我选定制作单片机智能小车。通过这次设计,掌握51单片机的原理,了解简单传感器组成原理,初步掌握传感器的调整及测试方法,提高动手能力和排除故障的能力。同时通过本课题设计与装配、调试,提高自己的动手能力,巩固已学的理论知识,建立单片机理论和实践的结合,了解传感器各单元电路之间的关系及相互影响,从而能正确设计、计算定时计数的各个单元电路。初步掌握传感器的调整及测试方法。提高动手能力和排除故障的能力。本设计采用直流减速电机,电机专用驱动芯片L298N进行电机驱动控制,主控芯片为STC89C52,测距部分采用超声波模块,控制器采用24L01无线电通信模块,自动避障部分采用红外收发模块。 本次设计虽然只是一个演示模型,但是具有充分的科学性和实用性。首先我们根据交通路面的复杂情况,按照适当的比例制作出一个路况模型,包括弯道、直道以及路面上设置的障碍物等。在弯、直道上,小车沿着预定轨道自由行使,当小车遇到障碍物时,脉冲调制的红外线传感器将检测到的信号发送给单片机,单片机根据程序发出相应的控制信号控制小车自动避开障碍物。由无线模块控制小车进行倒车、前进、左转、右转等动作。1.2方案论证1.2.1小车遥控部分方案一:小车的无线通信模块采用红外遥控,红外收发遥控是目前大部份遥控小车采用的遥控手段,红外遥控具有代码简单,操作性强的特点。如图1-1为红外遥控模块实物图。图1-1红外遥控模块实物图方案二:小车的通信模块采用无线电NRF24L01模块,NRF24L01是一款工作在2.4~2.5GHz,世界通用ISM频段的单片无线收发器芯片。无线收发器包括:频率发生器、增强型SchockburstTM模式控制器、功率放大器、晶体振荡器、调制器、解调器。输出功率、频道选择和协议的设置可以通过SPI接口进行设置。如1-2为NRF24L01无线模块实物图。图1-2NRF24L01无线模块实物图方案论证:方案一中的红外遥控模块的信号传送距离有限,并且发送和接收的红外信号容易受到干扰。NRF20L01发射频率高,所受到的干扰影响较小,无线通信的距离比红外的要长许多。小车的遥控是小车的最主要的部分之一,所以选择NRF24L01无线通信模块,故选择方案一。1.2.2小车驱动部分方案一:小车的电机驱动部分采用自己搭建的9012三极管电路来实行小车的驱动,9012三极管电路具有电路简单,操作方便的等特点。方案二:小车的电机驱动部分采用L298N芯片直流电机驱动模块,该模块具有较大的驱动带载能力,驱动部分端子供电范围Vs:+5V~+35V,并且另外自带了5V、3V的输出端口。方案论证:本设计为4轮驱动的小车,对于小车驱动部分要求能够有较大的帯载能力,并且在小车的实际设计过程中,需要不同的输出电压来提供给小车的各个模块。因此综上所述采用方案二,小车的电机驱动部分使用L298N芯片直流电机驱动模块。第2章系统硬件构成2.1系统设计原理本设计主要分为两部分:遥控部分和小车部分。遥控部分主要由电源电路,单片机最小系统,无线电模块组成,遥控部分的系统框图如图2-1所示。图2-1遥控系统框图小车部分由电源电路,单片机最小系统,显示电路,无线电木块,报警电路,超声波电路等电路模块组成,小车部分的系统框图如图2-2所示。图2-2小车的系统框图2.2主要元器件简介2.2.1STC89C52RC简介常用的单片机有很多种:Intel8051系列、Motorola和M68HC系列、Atmel的AT89系列、XX华邦<Winbond>W78系列、荷兰PiliPs的PCF80C51系列、MicrochiP公司系列4位单片机、XX义隆的EM-78系列等[1]。本次设计最终选用了STC89C52单片机。本系统采用最常用的STC89C52单片机,它是一种带4K字节闪烁可编程可擦除只读存储器〔FPEROM—FalshProgrammableandErasableReadOnlyMemory的低电压,高性能CMOS8位微处理器。该器件采用ATMEL高密度非易失存储器制造技术制造,与工业标准的MCS-51指令集和输出管脚相兼容。由于将多功能8位CPU和闪烁存储器组合在单个芯片中,ATMEL的STC89C52是一种高效微控制器。STC89C52单片机为很多嵌入式系统提供了一种灵活性高且价廉的方案。[6]引脚排列如图2-3所示。图2-3STC89系列引脚排列2.2.2NRF24L01无线收发芯片简介NRF24L01是一款工作在2.4-2.5GHz,世界通用ISM频段的单片无线收发器芯片。无线收发器包括:频率发生器、增强型SchockburstTM模式控制器、功率放大器、晶体振荡器、调制器、解调器。输出功率、频道选择和协议的设置可通过SPI接口进行设置。极低的电流消耗:当工作在发射模式下发射功率为-6dBm时电流消耗为9mA,接收模式时为12.3mA。掉电模式和待机模式下电流消耗更低。NRF24L01引脚排列如图2-4所示。图2-4NRF24L01引脚排列2.2.3L298N芯片直流电机驱动模块该模块由L298N作为双H桥直流电机驱动芯片,驱动部分端子供电范围Vs:+5V~+35V。如果在模块上取电压供电,则模块供电范围为Vs:+7V~+35V。模块的驱动不封峰值电流Io为2A。其他相关参数见表2-1。模块的实物图见附录附件1〔注:红色线框部分为电源接口。表2-1L298N芯片直流电机驱动模块产品参数逻辑部分端子供电范围Vss+5V~+7V〔可板内取电+5V逻辑部分工作电流范围0~36mA控制信号输入电压范围低电平:-0.3V≤Vin≤1.5V高电平:2.3V≤Vin≤Vss使能信号输入电压范围低电平:-0.3≤Vin≤1.5V<控制信号无效>高电平:2.3V≤Vin≤Vss<控制信号有效>最大功耗20W〔温度T=75℃时存储温度-25℃~+130℃驱动板尺寸82mm*57mm*33mm<带固定铜柱,散热片高度>驱动板重量60g其他扩展控制方向指示灯、逻辑部分板内取电接口2.2.4红外避障模块红外避障的原理:用红外线传感器进行避障。红外线发射头与接收头于一体的检测开关,其工作原理是根据发射头发出的光束,被物体反射,接收头据此做出判断是否有障碍物。当有光线反射回来时,输出低电平。当没有光线反射回来时,输出高电平。单片机根据接收头电平的高低做出相应控制,避免小车碰到障碍物。由于接收管输出TTL电平,有利于单片机对信号的处理。红外接收二极管又叫红外光电二极管,也可称红外光敏二极管。它广泛用于各种家用电器的遥控接收器中,如音响、彩色电视机、空调器、VCD视盘机、DVD视盘机以及录像机等。红外接收二极管能很好地接收红外发光二极管发射的波长为94Onm的红外光信号,而对于其他波长的光线则不能接收。因而保证了接收的准确性和灵敏度。小车采用红外线传感器进行避障的电路原理图如下图2-5所示,实物图如图2-6所示。红外模块的功能指标如表2-2所示。表2-2红外模块的功能指标使用芯片NE555工作电压3.3V-5V输出模式数字信号测量距离1CM-200CM探测距离是否可以调节是检测信号探测到障碍物为高电平,无障碍物或超出探测范围输出低电平LED红色为Power指示灯,绿色为Status指示灯图2-5红外线传感器进行避障的电路原理图图2-6红外线传感器进行避障的实物图2.2.5HC-SR04超声波测距模块HC-SR04超声波测距模块可提供2cm-400cm的非接触式距离感测功能,测距精度可达高到3mm;模块包括超声波发射器、接收器与控制电路。基本工作原理:<1>采用IO口TRIG触发测距,给至少10us的高电平信号;<2>模块自动发送8个40khz的方波,自动检测是否有信号返回;<3>有信号返回,通过IO口ECHO输出一个高电平,高电平持续的时间就是超声波从发射到返回的时间。测试距离=<高电平时间*声速<340M/S>>/2。HC-SR04超声波测距模块的时序图如图2-7所示。图2-7超声波模块时序图以上时序图表明你只需要提供一个10uS以上脉冲触发信号,该模块内部将发出8个40kHz周期电平并检测回波。一旦检测到有回波信号则输出回响信号。回响信号的脉冲宽度与所测的距离成正比。由此通过发射信号到收到的回响信号时间间隔可以计算得到距离。公式:uS/58=厘米或者uS/148=英寸;或是:距离=高电平时间*声速〔340M/S/2;建议测量周期为60ms以上,以防止发射信号对回响信号的影响。HC-SR04超声波测距模块的电路图如图2-8所示,实物图如图2-9所示。图2-8超声波模块的电路图图2-9超声波模块实物图2.2.6蜂鸣器驱动电路蜂鸣器是一种一体化结构的电子讯响器,采用直流电压供电,广泛应用于计算机、打印机、复印机、报警器、电子玩具、汽车电子设备、电话机、定时器等电子产品中作发声器件。蜂鸣器主要分为压电式蜂鸣器和电磁式蜂鸣器两种类型。蜂鸣器在电路中用字母"H"或"HA"〔旧标准用"FM"、"LB"、"JD"等表示。由于自激蜂鸣器是直流电压驱动的,不需要利用交流信号进行驱动,只需对驱动口输出驱动电平并通过三极管放大驱动电流就能使蜂鸣器发出声音<其驱动电路如图2-10所示>,利用定时器来做定时,通过定时翻转电平产生符合蜂鸣器要求的频率的波形,这个波形就可以用来驱动蜂鸣器了。图2-10蜂鸣器驱动电路2.2.7液晶显示电路该设计的显示部分采用LCD1602来显示超声波测距模块测得的距离。对于现实电路我们可以采用数码管,也可以采用液晶显示。液晶显示相对于数码管显示电路更简洁,显示更明了,故我们采用液晶显示电路。液晶又分字符型和点阵型,我们使用的液晶是字符型液晶。LCD1602自带字符库,不需要查找代码,英文字符可直接使用。液晶电路使用时,如果发现液晶不亮可以调节连接液晶的电位器,调节液晶的亮度。液晶显示电路如图2-11所示。图2-11液晶显示电路2.2.8遥控部分独立按键电路遥控部分的独立按键与单片机的接口设置为P2.0、P2.1、P2.2、P2.3、P2.4,分别控制小车的前进、后退、左转弯、右转弯、以及功能切换。独立按键采用低电平触发,即当按下按键时给单片机一个低电平信号,单片机随后做出相应的处理,当按键松开时,单片机接收到一个高电平信号,单片机随后继续做出相应处理。遥控部分的独立按键电路如图2-12所示。图2-12遥控部分独立按键电路第3章软件的设计与说明3.1软件设计系统功能的实现依赖于软、硬件的协同工作。主控芯片为STC89C52RC单片机。单片机控制软件实现遥控和小车的各项功能。程序编译采用KeiluVision4编程软件,KeiluVision4程序编译界面如图3-1所示。程序部分采用目前单片机最通用的C语言进行编程。程序的烧录软件采用STC_ISP_V479软件烧写编译好的HEX文件,STC_ISP_V479软件程序烧写界面如图3-2所示。图3-1KeiluVision4编程软件界面图3-2STC_ISP_V479软件程序烧写界面3.2软件的说明3.2.1遥控部分主程序流程遥控部分主程序流程图如图3-3所示。程序从主函数开始执行,24L01无线模块初始化,同时在主函数中定义单片机口对应的按键按下时所发出的函数值。接下来判断是否有按键按下,如果有按键按下,则发送相应的按键对应的函数值,接着判断是否又有按键按下。如果未发现按键按下则在主函数中循环判断是否有按键按下。图3-3遥控主程序流程图3.2.224L01子程序流程图24L01子程序流程图如图3-4所示,本模块子程序采用收发一体的驱动程序,即使该模块既可以在需要时发送信号,又可以在需要时接收信号。24L01子程序模块先初始化,初始化的同时在设置的写入reg函数中写入本地地址,写入接收端地址,并且设置频道0自动ACK应答允许。设置24L01的允许接收地址只有频道0,并且是信道工作在2.4GHz,以及设置数据长度为32字节,发射速率为1MHz。图3-424L01子程序流程图3.2.3小车部分主程序流程图小车部分主程序流程图如图3-5所示。程序从主函数开始执行,24L01无线模块初始化,液晶显示模块初始化,24L01无线电模块初始化,超声波模块初始化。各个模块初始化完毕后,单片机判断是否接受到了信号,如果接收到信号,则判断相应的按键值,如果没有接收到按键值则返回继续判断是否接受到信号。接收到信号后,小车开始执行键值对应的相应的命令。而超声波测距,并在液晶上显示相应距离,危险距离报警都是贯穿在整个while〔1的语句中的。图3-5小车部分主程序流程图调试与总结基于单片机的智能小车控制有许多的模块,在做整体设计之前首先是对每个模块的调试。只有在确保每个模块都正常的情况下才能进行总体的设计和总体的调试。每个模块都需要软硬件的调试才能确保模块的正常。4.1硬件部分4.1.1硬件的焊接单片机的电路系统相对于简单一些,对于焊接只要多练习就不会出现问题,但是,单片机的电路系统中只要出于一处的错误,则会对检测造成很大的不便,而且电路的交叉线较多,对于各种锋利的引脚都要注意处理,否则会刺破带有包皮的导线,则会对电路造成短路现象。在本次单片机的设计调试中遇到了很多的问题。回想这些问题只要认真多思考都是可以避免的,主要问题在于单片机上的测试用灯不亮,原因出于焊接时间过长导致电路板上的金属片脱落,造成断路。解决方案:重新引线使电路重新导通。4.1.224L01无线电模块24L01模块是直接购买的模块,在调试的时候按照商家提供的时序图,编写程序后却一直无法通信,既不接受信号也不发送信号。首先排除了程序上的错误,然后对硬件各部分电压进行测量并无发现异常,最后详细的阅读了说明书,发现24L01是3.3V~3.6V电压供电,而自己设计的电源部分缺少了去耦电容导致了硬件的无法正常工作。解决方案:在3.3V电源处并入1个104瓷片电容,1个100uF电解电容,减少电源的波动对模块带来的影响。4.1.3外接电源模块在刚刚接触小车的时候,本设计的小车应为是4轮驱动的,所以比一般的小车更加吃电流,刚刚开始使用的普通的电池仅仅调试几次就没电了,而使用的两节3.7V的充电电池串联效果也不尽理想,该小车使用的减速电机对电流的要求非常大,故购买了SONY的电脑适配器,该适配器可以提供19.5V的输出电压,以及高达4.5A的直流电流。所以设计了采用7805,与7809并联的方式作为SONY适配器下级稳压输出,成为了小车的外部供电电源。由于小车的电流需求非常大,小车在该电源的供电下只能维持10s的行驶时间。在接下来的检查中发现,由于夏天天气热,7809散热比较慢,而单个7809的最高输出电流在1.5A。7809由于温度过高进入了掉电保护模式。解决方案:在7809旁边并入一个7809,相当于加大了7809的输出电流。在此同时,在7809的片子上加上散热片,使7809及时散热。该方案的实施使得小车的续航能力大大提高。4.2软件部分4.2.1超声波模块超声波模块是直接购买的模块,在调试的时候按照商家提供的时序图,编写程序。但是编写后超声波测量时值测量一次,不能一直保持测量状态。经检查后发现,电路焊接正常,接口正常,所以排除了硬件问题的可能性。在接下来程序的检查中发现了超声波中count<>计算函数放在了while<1>函数外面。解决方案:超声波中count<>计算函数放在while<1>函数的循环内,并且根据时序图加上1ms的延时。该方案的实施,使得小车能够一直保持测距的状态,并且在LCM1602上一直持续显示正确的数值。4.3小车联调小车的联调是一个非常复杂的过程,在此过程中,不仅仅是对平时的专业知识的考验,更是对自己的耐心的考验。小车联调的时候遇到了很多问题:在无线电模块调试的时候,小车执行的动作与发射的信号的所需要执行的动作不一致,要求小车往左的时候小车并没有往左转弯,要求小车前进的时候小车也并没有前进。解决方案:对小车的控制电机转动的IO口进行逐一排查,找出问题为小车的IO口与程序定义的有所不同。重新再程序中定义IO口后,小车就能按照无线信号发射的要求做出相应的动作。当无线电模块发射了相应的信号后,小车执行的动作正确,但是有时候并没有执行相应的动作,如同"聋哑"一般不接收信号。当按键多次按下后,小车才执行相应的动作。解决方案:小车的"聋哑"并不是真正的"聋哑",无线电模块在发射信号的时候并不是每次都能发射出去,发射出去的信号小车的接收部分的无线模块不一定能够接收。而且,按键的抖动也会对无线的发射信号产生影响。故在程序中有按键按下时,发射5次信号信号,提高无线模块的信号发射次数,并且在按键程序中加入10ms的去抖程序。实施该方案后小车对信号的接受灵敏度大幅度提高,能够准确快速的做出相应的信号所要求的动作。4.4调试的总结通过这次设计,掌握51单片机的原理,了解简单传感器组成原理,初步掌握传感器的调整及测试方法,提高动手能力和排除故障的能力。同时通过本课题设计与装配、调试,提高自己的动手能力,巩固已学的理论知识,建立单片机理论和实践的结合,了解传感器各单元电路之间的关系及相互影响,从而能正确设计、计算定时计数的各个单元电路。初步掌握传感器的调整及测试方法。提高动手能力和排除故障的能力。调试期间要多向同学老师请教,有问题就该虚心请教。经过多次的反复测试与分析,可以对电路的原理及功能更加熟悉,同时提高了设计能力与对电路的分析能力,同时在软件的编程方面得到更高的提高,对编程能力得到加强,同时对所学的知识得到很大的提高与巩固。参考文献[1]徐国华.移动机器人的发展现状及其趋势[J].机器人技术与应用,2001,<03>:1102-1103,1150.[2]彭宏业,段哲民编著.小型舞蹈机器人的驱动系统设计[J].国外电子元器件.2005,<04>:56-65.[3]陈南主编.定位控制器的设计与实现[J].XX科技大学学报.2003.[4]谭浩强.C语言程序设计[M].北京:清华大学出版社,1998.[5]苏卫东,任思聪等.温控箱数学模型的建立及其自适应PID控制[J].中国惯性技术学报,1995年,<3>:4.[6]万福君.MCS-51单片机原理、系统设计与应用[M].北京:清华大学出版社,2008.[7]彭宏业,段哲民编著.小型舞蹈机器人的驱动系统设计[J].国外电子元器件.2005,<4>.[8]刘甘娜等编著.IBM-PC微机原理及接口技术[J].XX:XX电子科技大学出版社,1998.[9]孙广清.便携式温度传感标定装置[D].西北工业大学硕士学位论文,2007.[10]鲍丽星,陈晓争.一种高精度信号源的设计[J].XX航空航天大学,2008,16<4>:588-590.[11]党宏社.智能车辆系统发展及其关键技术概述[J].公路交通科技,2002.<4>[12]林敏.简易数字化语音存储与回放系统[J].仪表技术,2008,28〔9:13-18.[13]余祖俊.微机监测与控制应用系统设计,北方交通大学出版社,2001.12[14]温志明.运动控制系统分析与应用[J],国防工业出版社,2008.2[15]WANGSHX,WUGN,JIANGW,etal.Theprincipleandilluminationappliesoflightemittingdiode[J].LightandLighting,2006,14〔5:21-23.[16]I.MFilanvsky,H.Baltes.CMOSSchmitTriggerDesign[J].IEEETransactiomsonCircuitsandSystem-FundamentalTheoryandApplications.1994,41<1>:46-49.致谢在作品完成之际,我们要特别感谢XXX老师的热情关怀和悉心指导。在我们作品制作的过程中,老师们给了我们很多耐心的指导和启发,不仅让我学到了专业知识,还让我学到了很多做人的道理。特别是他们广博的学识、深厚的学术素养、严谨的治学精神和一丝不苟的工作作风使我们终生受益,在此表示真诚地感谢。在作品的制作过程中,也得到了许多同学的宝贵建议,在此一并致以诚挚的谢意。感谢所有关心、支持、帮助过我们的朋友。最后,向在百忙中抽出时间对本文进行评审并提出宝贵意见的各位领导老师表示衷心地感谢!由于自身水平有限,设计中一定存在很多不足之处,敬请各位老师批评指正。附录附件1L298N电机驱动模块

附件2小车侧视图

附件3小车俯视图附件4小车的遥控部分附件5小车最终硬件图附件6程序清单1.遥控部分程序#include<reg52.h>#include<intrins.h>typedefunsignedcharuchar;typedefunsignedcharuint;//****************************************NRF24L01端口定义***************************************sbit MISO =P1^0;sbit MOSI =P1^1;sbit SCK =P1^2;sbit CE =P1^3;sbit CSN =P1^4;sbit IRQ =P1^5;//************************************按键***************************************************sbit KEY1=P2^0;sbit KEY2=P2^1;sbit KEY3=P2^2;sbit KEY4=P2^3;sbit KEY5=P2^4;//*********************************************NRF24L01*************************************#defineTX_ADR_WIDTH5 //5uintsTXaddresswidth#defineRX_ADR_WIDTH5 //5uintsRXaddresswidth#defineTX_PLOAD_WIDTH20 //20uintsTXpayload#defineRX_PLOAD_WIDTH20 //20uintsTXpayloaduintconstTX_ADDRESS[TX_ADR_WIDTH]={0x34,0x43,0x10,0x10,0x01}; //本地地址uintconstRX_ADDRESS[RX_ADR_WIDTH]={0x34,0x43,0x10,0x10,0x01}; //接收地址ucharTxBuf[20]; ////***************************************NRF24L01寄存器指令*******************************************************#defineREAD_REG0x00 //读寄存器指令#defineWRITE_REG0x20 //写寄存器指令#defineRD_RX_PLOAD0x61 //读取接收数据指令#defineWR_TX_PLOAD0xA0 //写待发数据指令#defineFLUSH_TX0xE1 //冲洗发送FIFO指令#defineFLUSH_RX0xE2 //冲洗接收FIFO指令#defineREUSE_TX_PL0xE3 //定义重复装载数据指令#defineNOP0xFF //保留//*************************************SPI<nRF24L01>寄存器地址****************************************************#defineCONFIG0x00//配置收发状态,CRC校验模式以及收发状态响应方式#defineEN_AA0x01//自动应答功能设置#defineEN_RXADDR0x02//可用信道设置#defineSETUP_AW0x03//收发地址宽度设置#defineSETUP_RETR0x04//自动重发功能设置#defineRF_CH0x05//工作频率设置#defineRF_SETUP0x06//发射速率、功耗功能设置#defineSTATUS0x07//状态寄存器#defineOBSERVE_TX0x08//发送监测功能#defineCD0x09//地址检测#defineRX_ADDR_P00x0A//频道0接收数据地址#defineRX_ADDR_P10x0B//频道1接收数据地址#defineRX_ADDR_P20x0C//频道2接收数据地址#defineRX_ADDR_P30x0D//频道3接收数据地址#defineRX_ADDR_P40x0E//频道4接收数据地址#defineRX_ADDR_P50x0F//频道5接收数据地址#defineTX_ADDR0x10//发送地址寄存器#defineRX_PW_P00x11//接收频道0接收数据长度#defineRX_PW_P10x12//接收频道0接收数据长度#defineRX_PW_P20x13//接收频道0接收数据长度#defineRX_PW_P30x14//接收频道0接收数据长度#defineRX_PW_P40x15//接收频道0接收数据长度#defineRX_PW_P50x16//接收频道0接收数据长度#defineFIFO_STATUS0x17//FIFO栈入栈出状态寄存器设置//**************************************************************************************voidDelay<unsignedints>;voidinerDelay_us<unsignedcharn>;voidinit_NRF24L01<void>;uintSPI_RW<uintuchar>;ucharSPI_Read<ucharreg>;voidSetRX_Mode<void>;uintSPI_RW_Reg<ucharreg,ucharvalue>;uintSPI_Read_Buf<ucharreg,uchar*pBuf,ucharuchars>;uintSPI_Write_Buf<ucharreg,uchar*pBuf,ucharuchars>;unsignedcharnRF24L01_RxPacket<unsignedchar*rx_buf>;voidnRF24L01_TxPacket<unsignedchar*tx_buf>;//*****************************************长延时*****************************************voidDelay<unsignedints>{ unsignedinti; for<i=0;i<s;i++>; for<i=0;i<s;i++>;}//******************************************************************************************uint bdatasta;//状态标志sbit RX_DR =sta^6;sbit TX_DS =sta^5;sbit MAX_RT =sta^4;/******************************************************************************************/*延时函数/******************************************************************************************/voidinerDelay_us<unsignedcharn>{ for<;n>0;n--> _nop_<>;}//****************************************************************************************/*NRF24L01初始化//***************************************************************************************/voidinit_NRF24L01<void>{inerDelay_us<100>; CE=0;//chipenable CSN=1;//Spidisable SCK=0;//Spiclocklineinithigh SPI_Write_Buf<WRITE_REG+TX_ADDR,TX_ADDRESS,TX_ADR_WIDTH>;//写本地地址 SPI_Write_Buf<WRITE_REG+RX_ADDR_P0,RX_ADDRESS,RX_ADR_WIDTH>;//写接收端地址 SPI_RW_Reg<WRITE_REG+EN_AA,0x01>;//频道0自动 ACK应答允许 SPI_RW_Reg<WRITE_REG+EN_RXADDR,0x01>;//允许接收地址只有频道0,如果需要多频道可以参考Page21 SPI_RW_Reg<WRITE_REG+RF_CH,0>;//设置信道工作为2.4GHZ,收发必须一致 SPI_RW_Reg<WRITE_REG+RX_PW_P0,RX_PLOAD_WIDTH>;//设置接收数据长度,本次设置为32字节 SPI_RW_Reg<WRITE_REG+RF_SETUP,0x07>; //设置发射速率为1MHZ,发射功率为最大值0dB}/****************************************************************************************************/*函数:uintSPI_RW<uintuchar>/*功能:NRF24L01的SPI写时序/****************************************************************************************************/uintSPI_RW<uintuchar>{ uintbit_ctr; for<bit_ctr=0;bit_ctr<8;bit_ctr++>//output8-bit { MOSI=<uchar&0x80>;//output'uchar',MSBtoMOSI uchar=<uchar<<1>;//shiftnextbitintoMSB.. SCK=1;//SetSCKhigh.. uchar|=MISO; //capturecurrentMISObit SCK=0; //..thensetSCKlowagain }return<uchar>; //returnreaduchar}/****************************************************************************************************/*函数:ucharSPI_Read<ucharreg>/*功能:NRF24L01的SPI时序/****************************************************************************************************/ucharSPI_Read<ucharreg>{ ucharreg_val; CSN=0;//CSNlow,initializeSPIcommunication... SPI_RW<reg>;//Selectregistertoreadfrom.. reg_val=SPI_RW<0>;//..thenreadregistervalue CSN=1;//CSNhigh,terminateSPIcommunication return<reg_val>;//returnregistervalue}/****************************************************************************************************//*功能:NRF24L01读写寄存器函数/****************************************************************************************************/uintSPI_RW_Reg<ucharreg,ucharvalue>{ uintstatus; CSN=0;//CSNlow,initSPItransaction status=SPI_RW<reg>;//selectregister SPI_RW<value>;//..andwritevaluetoit.. CSN=1;//CSNhighagain return<status>;//returnnRF24L01statusuchar}/****************************************************************************************************//*函数:uintSPI_Read_Buf<ucharreg,uchar*pBuf,ucharuchars>/*功能:用于读数据,reg:为寄存器地址,pBuf:为待读出数据地址,uchars:读出数据的个数/****************************************************************************************************/uintSPI_Read_Buf<ucharreg,uchar*pBuf,ucharuchars>{ uintstatus,uchar_ctr; CSN=0; //SetCSNlow,initSPItranaction status=SPI_RW<reg>; //Selectregistertowritetoandreadstatusuchar for<uchar_ctr=0;uchar_ctr<uchars;uchar_ctr++> pBuf[uchar_ctr]=SPI_RW<0>;// CSN=1; return<status>;//returnnRF24L01statusuchar}/*********************************************************************************************************/*函数:uintSPI_Write_Buf<ucharreg,uchar*pBuf,ucharuchars>/*功能:用于写数据:为寄存器地址,pBuf:为待写入数据地址,uchars:写入数据的个数/*********************************************************************************************************/uintSPI_Write_Buf<ucharreg,uchar*pBuf,ucharuchars>{ uintstatus,uchar_ctr; CSN=0;//SPI使能 status=SPI_RW<reg>; for<uchar_ctr=0;uchar_ctr<uchars;uchar_ctr++>// SPI_RW<*pBuf++>; CSN=1;//关闭SPI return<status>;//}/****************************************************************************************************//*函数:voidSetRX_Mode<void>/*功能:数据接收配置/****************************************************************************************************/voidSetRX_Mode<void>{ CE=0; SPI_RW_Reg<WRITE_REG+CONFIG,0x0f>; //IRQ收发完成中断响应,16位CRC ,主接收 CE=1; inerDelay_us<130>;}/******************************************************************************************************//*函数:unsignedcharnRF24L01_RxPacket<unsignedchar*rx_buf>/*功能:数据读取后放如rx_buf接收缓冲区中/******************************************************************************************************/unsignedcharnRF24L01_RxPacket<unsignedchar*rx_buf>{unsignedcharrevale=0; sta=SPI_Read<STATUS>; //读取状态寄存其来判断数据接收状况 if<RX_DR> //判断是否接收到数据 { CE=0; //SPI使能 SPI_Read_Buf<RD_RX_PLOAD,rx_buf,TX_PLOAD_WIDTH>;//readreceivepayloadfromRX_FIFObuffer revale=1; //读取数据完成标志 } SPI_RW_Reg<WRITE_REG+STATUS,sta>;//接收到数据后RX_DR,TX_DS,MAX_PT都置高为1,通过写1来清楚中断标志 returnrevale;}/***********************************************************************************************************/*函数:voidnRF24L01_TxPacket<unsignedchar*tx_buf>/*功能:发送tx_buf中数据/**********************************************************************************************************/voidnRF24L01_TxPacket<unsignedchar*tx_buf>{ CE=0; //StandByI模式 SPI_Write_Buf<WRITE_REG+RX_ADDR_P0,TX_ADDRESS,TX_ADR_WIDTH>;//装载接收端地址 SPI_Write_Buf<WR_TX_PLOAD,tx_buf,TX_PLOAD_WIDTH>; //装载数据 SPI_RW_Reg<WRITE_REG+CONFIG,0x0e>; //IRQ收发完成中断响应,16位CRC,主发送 SPI_RW_Reg<WRITE_REG+STATUS,0X7E>; CE=1; //置高CE,激发数据发送 inerDelay_us<10>;}//************************************主函数************************************************************voidmain<void>{ ucharbizhangflag=0;init_NRF24L01<>; while<1> { if<KEY1==0> { Delay<5>; if<KEY1==0> { TxBuf[1]=0x99; nRF24L01_TxPacket<TxBuf>; Delay<10>; nRF24L01_TxPacket<TxBuf>; Delay<10>; nRF24L01_TxPacket<TxBuf>; Delay<10>; nRF24L01_TxPacket<TxBuf>; Delay<10>; nRF24L01_TxPacket<TxBuf>; Delay<10>; while<KEY1==0>; Delay<5>; //发送释放按键 TxBuf[1]=0x00; nRF24L01_TxPacket<TxBuf>; Delay<10>; nRF24L01_TxPacket<TxBuf>; Delay<10>; nRF24L01_TxPacket<TxBuf>; Delay<10>; nRF24L01_TxPacket<TxBuf>; Delay<10>; nRF24L01_TxPacket<TxBuf>; Delay<10>; } } if<KEY2==0> { Delay<5>; if<KEY2==0> { TxBuf[1]=0x66; nRF24L01_TxPacket<TxBuf>; Delay<10>; nRF24L01_TxPacket<TxBuf>; Delay<10>; nRF24L01_TxPacket<TxBuf>; Delay<10>; nRF24L01_TxPacket<TxBuf>; Delay<10>; nRF24L01_TxPacket<TxBuf>; Delay<10>; while<KEY2==0>; Delay<5>; //发送释放按键 TxBuf[1]=0x00; nRF24L01_TxPacket<TxBuf>; Delay<10>; nRF24L01_TxPacket<TxBuf>; Delay<10>; nRF24L01_TxPacket<TxBuf>; Delay<10>; nRF24L01_TxPacket<TxBuf>; Delay<10>; nRF24L01_TxPacket<TxBuf>; Delay<10>; } } if<KEY3==0> { Delay<5>; if<KEY3==0> { TxBuf[1]=0x69; nRF24L01_TxPacket<TxBuf>; Delay<10>; nRF24L01_TxPacket<TxBuf>; Delay<10>; nRF24L01_TxPacket<TxBuf>; Delay<10>; nRF24L01_TxPacket<TxBuf>; Delay<10>; nRF24L01_TxPacket<TxBuf>; Delay<10>; while<KEY3==0>; Delay<5>; //发送释放按键 TxBuf[1]=0x00; nRF24L01_TxPacket<TxBuf>; Delay<10>; nRF24L01_TxPacket<TxBuf>; Delay<10>; nRF24L01_TxPacket<TxBuf>; Delay<10>; nRF24L01_TxPacket<TxBuf>; Delay<10>; nRF24L01_TxPacket<TxBuf>; Delay<10>; } } if<KEY4==0> { Delay<5>; if<KEY4==0> { TxBuf[1]=0x96; nRF24L01_TxPacket<TxBuf>; Delay<10>; nRF24L01_TxPacket<TxBuf>; Delay<10>; nRF24L01_TxPacket<TxBuf>; Delay<10>; nRF24L01_TxPacket<TxBuf>; Delay<10>; nRF24L01_TxPacket<TxBuf>; Delay<10>; while<KEY4==0>; Delay<5>; //发送释放按键 TxBuf[1]=0x00; nRF24L01_TxPacket<TxBuf>; Delay<10>; nRF24L01_TxPacket<TxBuf>; Delay<10>; nRF24L01_TxPacket<TxBuf>; Delay<10>; nRF24L01_TxPacket<TxBuf>; Delay<10>; nRF24L01_TxPacket<TxBuf>; Delay<10>; } } if<KEY5==0> { Delay<5>; if<KEY5==0> { if<bizhangflag==0> { bizhangflag=1; TxBuf[1]=0xAA; nRF24L01_TxPacket<TxBuf>; Delay<10>; nRF24L01_TxPacket<TxBuf>; Delay<10>; nRF24L01_TxPacket<TxBuf>; Delay<10>; nRF24L01_TxPacket<TxBuf>; Delay<10>; nRF24L01_TxPacket<TxBuf>; Delay<10>; while<KEY5==0>; } else { bizhangflag=0; TxBuf[1]=0x55; nRF24L01_TxPacket<TxBuf>; Delay<10>; nRF24L01_TxPacket<TxBuf>; Delay<10>; nRF24L01_TxPacket<TxBuf>; Delay<10>; nRF24L01_TxPacket<TxBuf>; Delay<10>; nRF24L01_TxPacket<TxBuf>; Delay<10>; while<KEY5==0>; } } }2.小车部分程序#include<reg52.h>#include<intrins.h>#include"1602.h"#include"delay.h"typedefunsignedcharuchar;typedefunsignedcharuint;//****************************************NRF24L01端口定义***************************************sbit MISO =P0^0;sbit MOSI =P0^1;sbit SCK =P0^2;sbit CE =P0^3;sbit CSN =P0^4;sbit IRQ =P0^5;#defineKeyPort1P0#defineDataPortP3//定义按键端口sbitRightSenser=P2^3; sbitLeftSenser=P2^2;sbitTX=P2^1;sbitRX=P2^0;//*********************************************NRF24L01*************************************#defineTX_ADR_WIDTH5 //5uintsTXaddresswidth#defineRX_ADR_WIDTH5 //5uintsRXaddresswidth#defineTX_PLOAD_WIDTH20 //20uintsTXpayload#defineRX_PLOAD_WIDTH20 //20uintsTXpayloaduintconstTX_ADDRESS[TX_ADR_WIDTH]={0x34,0x43,0x10,0x10,0x01}; //本地地址uintconstRX_ADDRESS[RX_ADR_WIDTH]={0x34,0x43,0x10,0x10,0x01}; //接收地址//***************************************NRF24L01寄存器指令*******************************************************#defineREAD_REG0x00 //读寄存器指令#defineWRITE_REG0x20 //写寄存器指令#defineRD_RX_PLOAD0x61 //读取接收数据指令#defineWR_TX_PLOAD0xA0 //写待发数据指令#defineFLUSH_TX0xE1 //冲洗发送FIFO指令#defineFLUSH_RX0xE2 //冲洗接收FIFO指令#defineREUSE_TX_PL0xE3 //定义重复装载数据指令#defineNOP0xFF //保留//*************************************SPI<nRF24L01>寄存器地址****************************************************#defineCONFIG0x00//配置收发状态,CRC校验模式以及收发状态响应方式#defineEN_AA0x01//自动应答功能设置#defineEN_RXADDR0x02//可用信道设置#defineSETUP_AW0x03//收发地址宽度设置#defineSETUP_RETR0x04//自动重发功能设置#defineRF_CH0x05//工作频率设置#defineRF_SETUP0x06//发射速率、功耗功能设置#defineSTATUS0x07//状态寄存器#defineOBSERVE_TX0x08//发送监测功能#defineCD0x09//地址检测#defineRX_ADDR_P00x0A//频道0接收数据地址#defineRX_ADDR_P10x0B//频道1接收数据地址#defineRX_ADDR_P20x0C//频道2接收数据地址#defineRX_ADDR_P3

温馨提示

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

最新文档

评论

0/150

提交评论