基于51的避障循迹重力感应遥控的智能小车设计(c语言)毕业设计论文_第1页
基于51的避障循迹重力感应遥控的智能小车设计(c语言)毕业设计论文_第2页
基于51的避障循迹重力感应遥控的智能小车设计(c语言)毕业设计论文_第3页
基于51的避障循迹重力感应遥控的智能小车设计(c语言)毕业设计论文_第4页
基于51的避障循迹重力感应遥控的智能小车设计(c语言)毕业设计论文_第5页
已阅读5页,还剩54页未读 继续免费阅读

下载本文档

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

文档简介

基于51的避障/循迹/重力感应遥控的智能小车设计1绪论1.1选题背景随着汽车工业的迅速发展,关于汽车的研究也就越来越受人关注。全国电子大赛和省内电子大赛几乎每次都有智能小车这方面的题目,全国各高校也都很重视该题目的研究。可见其研究意义很大。本设计就是在这样的背景下提出的,指导教师已经有充分的准备。本题目是结合科研项目而确定的设计类课题。设计的智能电动小车应该能够实现适应能力,能自动避障,可以智能规划路径。智能化作为现代社会的新产物,是以后的发展方向,他可以按照预先设定的模式在一个特定的环境里自动的运作,无需人为管理,便可以完成预期所要达到的或是更高的目标。同遥控小车不同,遥控小车需要人为控制转向、启停和进退,比较先进的遥控车还能控制器速度。常见的模型小车,都属于这类遥控车;智能小车,则可以通过计算机编程来实现其对行驶方向、启停以及速度的控制,无需人工干预。操作员可以通过修改智能小车的计算机程序来改变它的行驶方向。因此,智能小车具有再编程的特性,是机器人的一种。中国自1978年把“智能模拟”作为国家科学技术发展规划的主要研究课题,开始着力研究智能化。从概念的引进到实验室研究的实现,再到现在高端领域(航天航空、军事、勘探等)的应用,这一过程为智能化的全面发展奠定基石。智能化全面的发展是实现其对资源的合理充分利用,以尽可能少的投入得到最大的收益,大大提高工业生产的效率,实现现有工业生产水平从自动化向智能化升级,实现当今智能化发展由高端向大众普及。从先前的模拟电路设计,到数字电路设计,再到现在的集成芯片的应用,各种能实现同样功能的元件越来越小为智能化产物的生成奠定了良好的物质基础。智能小车,是一个集环境感知、规划决策,自动行驶等功能于一体的综合系统,它集中地运用了计算机、传感、信息、通信、导航、人工智能及自动控制等技术,是典型的高新技术综合体。1.2智能小车研究现状智能车辆作为智能交通系统的关键技术,是许多高新技术综合集成的载体。智能车辆驾驶是一种通用性术语,指全部或部分完成一项或多项驾驶任务的综合车辆技术。智能车辆的一个基本特征是在一定道路条件下实现全部或者部分的自动驾驶功能,下面简单介绍一下国内外智能小车研究的发展情况。1.2.1国外智能车辆研究现状国外智能车辆的研究历史较长,始于上世纪50年代。它的发展历程大体可以分成三个阶段:第一阶段20世纪50年代是智能车辆研究的初始阶段。1954年美国BarrettElectronics公司研究开发了世界上第一台自主引导车系统AGVS(AutomatedGuidedVehicleSystem)。该系统只是一个运行在固定线路上的拖车式运货平台,但它却具有了智能车辆最基本得特征即无人驾驶。早期研制AGVS的目的是为了提高仓库运输的自动化水平,应用领域仅局限于仓库内的物品运输。随着计算机的应用和传感技术的发展,智能车辆的研究不断得到新的发展。第二阶段从80年代中后期开始,世界主要发达国家对智能车辆开展了卓有成效的研究。在欧洲,普罗米修斯项目于1986年开始了在这个领域的探索。在美洲,美国于1995年成立了国家自动高速公路系统联盟(NAHSC),其目标之一就是研究发展智能车辆的可能性,并促进智能车辆技术进入实用化。在亚洲,日本于1996年成立了高速公路先进巡航/辅助驾驶研究会,主要目的是研究自动车辆导航的方法,促进日本智能车辆技术的整体进步。进入80年代中期,设计和制造智能车辆的浪潮席卷全世界,一大批世界著名的公司开始研制智能车辆平台。第三阶段从90年代开始,智能车辆进入了深入、系统、大规模研究阶段。最为突出的是,美国卡内基.梅隆大学(CarnegieMellonUniversity)机器人研究所一共完成了Navlab系列的10台自主车(Navlab1—Navlab10)的研究,取得了显著的成就。目前,智能车辆的发展正处于第三阶段。这一阶段的研究成果代表了当前国外智能车辆的主要发展方向。在世界科学界和工业设计界中,众多的研究机构研发的智能车辆具有代表性的有:德意志联邦大学的研究1985年,第一辆VaMoRs智能原型车辆在户外高速公路上以100km/h的速度进行了测试,它使用了机器视觉来保证横向和纵向的车辆控制。1988年,在都灵的PROMRTHEUS项目第一次委员会会议上,智能车辆维塔(VITA,7t)进行了展示,该车可以自动停车、行进,并可以向后车传送相关驾驶信息。这两种车辆都配备了UBM视觉系统。这是一个双目视觉系统,具有极高的稳定性。荷兰鹿特丹港口的研究智能车辆的研究主要体现在工厂货物的运输。荷兰的Combiroad系统,采用无人驾驶的车辆来往返运输货物,它行驶的路面上采用了磁性导航参照物,并利用一个光阵列传感器去探测障碍。荷兰南部目前正在讨论工业上利用这种系统的问题,政府正考虑已有的高速公路新建一条专用的车道,采用这种系统将货物从鹿特丹运往各地。日本大阪大学的研究大阪大学的Shirai实验室所研制的智能小车,采用了航位推测系统(DeadReckoningSystem),分别利用旋转编码器和电位计来获取智能小车的转向角,从而完成了智能小车的定位。另外,斯特拉斯堡实验中心、英国国防部门的研究、美国卡内基梅隆大学、奔驰公司、美国麻省理工学院、韩国理工大学对智能车辆也有较多的研究。1.2.2国内智能车辆研究现状相比于国外,我国开展智能车辆技术方面的研究起步较晚,开始于20世纪80年代。而且大多数研究处在于针对某个单项技术研究的阶段。虽然我国在智能车辆技术方面的研究总体上落后于发达国家,并且存在一定得技术差距,但是我们也取得了一系列的成果,主要有:(1)中国第一汽车集团公司和国防科技大学机电工程与自动化学院与2003年研制成功我国第一辆自主驾驶轿车。该自主驾驶轿车在正常交通情况下的高速公路上,行驶的最高稳定速度为13km/h,最高峰值速度达170km/h,并且具有超车功能,其总体技术性能和指标已经达到世界先进水平。(2)南京理工大学、北京理工大学、浙江大学、国防科技大学、清华大学等多所院校联合研制了7B.8军用室外自主车,该车装有彩色摄像机、激光雷达、陀螺惯导定位等传感器。计算机系统采用两台Sun10完成信息融合、路径规划,两台PC486完成路边抽取识别和激光信息处理,8098单片机完成定位计算和车辆自动驾驶。其体系结构以水平式结构为主,采用传统的“感知-建模-规划-执行”算法,其直线跟踪速度达到20km/h,避障速度达到5-10km/h。智能车辆研究也是智能交通系统ITS的关键技术。目前,国内的许多高校和科研院所都在进行ITS关键技术、设备的研究。随着ITS研究的兴起,我国已形成一支ITS技术研究开发的技术专业队伍。并且各交通、汽车企业越来越加大了对ITS及智能车辆技术研发的投入,整个社会的关注程度在不断提高。交通部已将ITS研究列入“十五”科技发展计划和2010年长期规划。相信经过相关领域的共同努力,我国ITS及智能车辆的技术水平一定会得到很大提高。可以预计,我国飞速发展的经济实力将为智能车辆的研究提供一个更加广阔的前景。我们要结合我国国情,在某一方面或某些方面,对智能车进行深入细致的研究,为它今后的发展及实际应用打下坚实的基础。1.3主要内容本课题要开发一个能自动循迹自动避障同时可以遥控的智能小车控制系统,系统分小车和遥控器两部分,主要以简易智能机器人为开发平台,选择通用、价廉的51单片机为控制平台,选择常见的电机模型车为机械平台,通过细化设计要求,结合传感器技术和电机控制技术相关知识实现小车的各种功能。设计完成以由红外线对管的自动寻迹、红外线自动避障、重力遥控组成的硬件模块结合软件设计组成多功能智能小车,共同实现小车的前进倒退、转向行驶,自动根据地面黑线寻迹导航,检测障碍物后停止等功能,实现智能控制,达到设计目标。2方案设计及论证2.1总体设计本课题设计主要是制作一款能进行智能判断并能做出正确反应的小车。小车具有以下几个功能:自动避障功能;寻迹功能(按路面的黑色轨道行驶);基于重力感应的遥控(通过倾斜方向和角度控制小车运动方向和速度)。小车端以两直流电动机为主驱动,通过各类传感器件来采集各类信息,送入主控单元89C52单片机处理数据后完成相应动作,以达到自身控制。电机驱动电路采用H桥驱动模块--双L298步进/直流电机驱动板,能同时驱动4个直流电机和2个步进电机;避障采用漫反射式光电开关来完成,自动寻迹采用红外发射管和接收管光电对管寻迹传感器完成,最后由控制单元处理数据后通过编程有序合理的将各模块信号整合在一起并完成相应动作,实现了智能控制,相当于简易机器人。遥控端由MPU0605陀螺仪和无线模块、按键模块、LCD显示模块组成,通过检测按键和陀螺仪数据送入89C52单片机处理后判断用户的指令,然后通过NRF24L01无线模块把指令发送到小车端,同时在LCD12864显示当前工作模式和小车的状态.2.2主控单元方案比较与选择按照题目要求,控制器主要用于控制电机,通过相关传感器对路面的轨迹信息进行处理,并将处理信号传输给控制器,然后控制器做出相应的处理,实现小车的自动循迹和自动避障。方案一:可以采用ARM为系统的控制器,优点是该系统功能强大,片上外设集成度搞密度高,提高了稳定性,系统的处理速度也很高,适合作为大规模实时系统的控制核心。方案二:采用AT89S52作为系统控制的方案。AT89S52单片机算术运算功能强,软件编程灵活、自由度大,功耗低、体积小、技术成熟,成本也比ARM低。考虑到性价比问题,本设计选择用AT89S52单片机做控制器。2.3电机单元方案比较与选择方案一:采用直流电机,配合LM293驱动芯片组合。优点在于硬件电路的设计简单。当外加额定直流电压时,转速几乎相等。这类电机用于录音机、录相机、唱机或激光唱机等固定转速的机器或设备中,也用于变速范围很宽的驱动装置,但容易受到外部因素干扰,影响稳定的转速和转矩输出。方案二:采用直流减速电机。直流减速电机转动力矩大,体积小,重量轻,装配简单,使用方便,小车电机内部装有减速齿轮组,所以并不需要考虑调速功能,很方便的就可以实现通过单片机对直流减速电机前进、后退、停止等操作。综合以上考虑我们选择方案二的直流减速电机作为智能小车的驱动电机。2.4电源单元方案比较与选择方案一:采用单电源供电,通过单电源同时对单片机和直流电机进行供电,此方案的优点是,减少机身的重量,操作简单,其缺点是,这样会使单片机的波动变大,影响单片机的性能,稳定性比较弱。方案二:采用双电源供电,通过两个独立的电源分别对单片机和直流减速电机进行供电,此方案的优点是,减少波动,稳定性比较好,可以让小车更好的运作起来,唯一的缺点就是会增加小车的重量。综合以上的优缺点,本设计决定采用第二种方案。2.5避障单元方案比较与选择方案一:用超声波传感器进行避障。超声波传感器的原理是:超声波由压电陶瓷超声波传感器发出后,遇到障碍物便反射回来,再被超声波传感器接收。但使用超声波模块的成本比较高。因此我们考虑其它的方案,超声波传感器实物图如下图2所示:图2超声波传感器方案二:用漫反射式光电开关进行避障。光电开关的工作原理是根据光线发射头发出的光束,被物体反射,其接收电路据此做出判断反应,物体对红外光由同步回路选通而检测物体的有无。当有光线反射回来时,输出低电平。当没有光线反射回来时,输出高电平。光电开关的是物图如下图3所示:图3光电开关考虑到超声波测量的范围宽,使用非常灵活,帮助智能小车顺利绕过障碍,可以适应十分复杂的环境,我们最终选择了方案一。2.6寻迹单元方案比较与选择方案一:利用寻迹来引导小车到达用户所指定的地点。采用红外发射管和接收管光电对管寻迹传感器。红外发射管发出红外线,当发出的红外线照射到白色的平面后反射,若红外接收管能接收到反射回的光线则检测出白线继而输出低电平,若接收不到发射管发出的光线则检测出黑线继而输出高电平。此方案存在的缺陷是对光线的亮度要求较高,在夜间难以正常工作。方案二:通过超声波定位模块来实时定位小车的位置。超声波定位的基本原理是通过接收几个固定位置的发射点的超声波接收器,在小车上加入一个发射器,通过无线模块计算各模块接收到超声波的时间差,通过集成模块的内部算法得出小车所在位置和原设定位置的偏差情况,从而得到主体到这几个发射点的距离,实现了超声波的定位,由于超声波在空气中的衰减较大,它只适用于较小的范围,而且使用此方案还将面临着在家中的超声波各通讯线的布局,使用很不方便。经实测发现方案一中的红外对管型寻迹模块只要给进行一定的改善,对环境的适应能力还是比较强的例如可以在晚上行进,这样就可以用低成本来实现我们你所需要的功能,所以就排除了方案二,以方案一作为小车在家庭中的行进方式。3硬件系统的设计3.1单片机控制模块STC89C52是一种低功耗、高性能CMOS8位微控制器,具有8K在系统可编程Flash存储器。在单芯片上,拥有灵巧的8位CPU和在线系统可编程Flash,使得STC89C52为众多嵌入式控制应用系统提供高灵活、超有效的解决方案。STC89C52具有以下标准功能:8k字节Flash,256字节RAM,32位I/O口线,看门狗定时器,2个数据指针,三个16位定时器/计数器,一个6向量2级中断结构,全双工串行口,片内晶振及时钟电路。另外,STC89C52可降至0Hz静态逻辑操作,支持2种软件可选择节电模式。空闲模式下,CPU停止工作,允许RAM、定时器/计数器、串口、中断继续工作。掉电保护方式下,RAM内容被保存,振荡器被冻结,单片机一切工作停止,直到下一个中断或硬件复位为止。如图4是较为常见的单片机最小系统图。图4单片机最小系统3.1.1时钟电路单片机的时钟产生有两种方法:内部时钟方式和外部时钟方式。系统的时钟电路设计是采用的内部方式,即利用芯片内部的振荡电路。AT89单片机内部有一个用于构成振荡器的高增益反相放大器。引脚XTAL1和XTAL2分别是此放大器的输入端和输出端。这个放大器与作为反馈元件的片外晶体谐振器一起构成一个自激振荡器。外接晶体谐振器以及电容C1和C2构成并联谐振电路,接在放大器的反馈回路中。对外接电容的值虽然没有严格的要求,但电容的大小会影响震荡器频率的高低、震荡器的稳定性、起振的快速性和温度的稳定性。因此,此系统电路的晶体振荡器的值为12MHz,电容应尽可能的选择陶瓷电容,电容值通常取30PF。在焊接刷电路板时,晶体振荡器和电容应尽可能安装得与单片机芯片靠近,以减少寄生电容,更好地保证震荡器稳定和可靠地工作。3.1.2复位电路位是由外部的复位电路来实现的。片内复位电路是复位引脚RST通过一个触发器与复位电路相连,触发器用来抑制噪声,它的输出在每个机器周期中由复位电路采样一次。复位电路通常采用上电自动复位和按钮复位两种方式。所谓上电复位,是指计算机加电瞬间,要在RST引脚出现大于10MS的正脉冲,使单片机进入复位状态。按钮复位是指用户按下“复位”按钮,使单片机进入复位状态。如上图3是按钮电平复位的一种实用电路。3.2电机驱动模块的设计电机驱动模块采用专用芯片L298N作为电机驱动芯片,L298N是一个具有高电压大电流的全桥驱动芯片,其响应频率高,一片L298N可以分别控制两个直流电机。图5电机驱动原理简图3.2.1L298N芯片的介绍L298N是ST公司生产的一种高电压、大电流电机驱动芯片。该芯片采用15脚封装。主要特点是:工作电压高,最高工作电压可达46V;输出电流大,瞬间峰值电流可达3A,持续工作电流为2A;额定功率25W。内含两个H桥的高电压大电流全桥式驱动器,可以用来驱动直流电动机和步进电动机、继电器线圈等感性负载;采用标准逻辑电平信号控制;具有两个使能控制端,在不受输入信号影响的情况下允许或禁止器件工作有一个逻辑电源输入端,使内部逻辑电路部分在低电压下工作;可以外接检测电阻,将变化量反馈给控制电路。使用L298N芯片驱动电机,该芯片可以驱动一台两相步进电机或四相步进电机,也可以驱动两台直流电机,实物图及外围电路如下图6、7所示。图6L298N芯片图7L298N外围电路接口说明如下示:+5V:芯片电压5V。VCC:电机电压,最大可接50V。GND:共地接法。A-~D-:输出端,接电机。A~D+:为步进电机公共端,模块上接了VCC。EN1、EN2:高电平有效,EN1、EN2分别为IN1和IN2、IN3和IN4的使能端。IN1~IN4:输入端,输入端电平和输出端电平是对应的。L298N的5、7、10、12四个引脚接到单片机上,通过对单片机的编程就可实现两个直流电机的PWM调速控制,图8是L298N功能逻辑图。图8L298N功能逻辑图L298N可接受标准TTL逻辑电平信号VSS,VSS可接4.5~7V电压。4脚VS接电源电压,VS电压范围VIH为+2.5~46V。输出电流可达2.5A,可驱动电感性负载。1脚和15脚下管的发射极分别单独引出以便接入电流采样电阻,形成电流传感信号。L298可驱动2个电动机,OUT1,OUT2和OUT3,OUT4之间可分别接电动机,本实验装置我们选用驱动一台电动机。5,7,10,12脚接输入控制电平,控制电机的正反转。EnA,EnB接控制使能端,控制电机的停转。In3,In4的逻辑图与上图相同。由上图可知EnA为低电平时,输入电平对电机控制起作用,当EnA为高电平,输入电平为一高一低,电机正或反转。同为低电平电机停止,同为高电平电机刹停。3.3红外避障电路的原理与设计用漫反射式光电开关进行避障。光电开关实际发射头与接收头于一体的检测开关,其工作原理是根据发射头发出的光束,被物体反射,接收头据此做出判断是否有障碍物。当有光线反射回来时,输出低电平。当没有光线反射回来时,输出高电平。单片机根据接收头电平的高低做出相应控制,避免小车碰到障碍物。由于接收管输出TTL电平,有利于单片机对信号的处理。小车采用漫反射式传感器进行避障的电路原理图如下图9所示:图9光电开关避障电路原理图3.3.1光电传感器简介光电传感器在机器人中有着广泛的应用,可以用来检测地面明暗和颜色的变化,也可以探测有无接近的物体。光电传感器是靠红外发射管和红外接收管组成的传感器,对于小车循迹场地的黑白两种颜色,发射管发出同样的光强,接收管接收到的光强不同,因此输出的电压值也不同;给定一个基准电压,通过对不同输出电压值进行比较,则电路的输出为高低电平。当检测到黑白线时分别输出为高低电平,这样不仅系统硬件电路简单,而且信号处理速度快。原理如下图10、图11所示。图10白色反射面下的红外反射图11黑色反射面下的红外吸收红外发射管发射的红外线具有一定得方向性,当红外线照射到白色表面上时会有较大的反射,如果距离D1取值合适,红外接收管可接收到反射回的红外线,再利用红外接收管的电气特性,在电路中处理红外线的接受信息;如果反射表面为黑色,红外光会被表面将其大部分吸收,红外接收管就难以收到红外线。这样,就可以利用红外收发管组成的光电传感器检测赛道黑线,实现智能车的循迹方案。3.3.2比较器LM324简介LM324为四运放集成电路,采用14脚双列直插塑料封装。内部有四个运算放大器,有相位补偿电路。电路功耗很小,工作电压范围宽,可用正电源3~30V,或正负双电源±1.5V~±15V工作。在黑线检测电路中用来确定红外接收信号电平的高低,以电平高低判定黑线有无。在电路中,LM324的一个输入端需接滑动变阻器,通过改变滑动变阻器的阻值来提供合适的比较电压,图12为LM324的管脚图。图12LM324的管教图3.4寻迹模块的硬件设计红外对管循迹模块,五路寻迹TCR5000的模块,采用红外发射管和接收管光电对管寻迹传感器。红外发射管发出红外线,当发出的红外线照射到白色的平面后反射,若红外接收管能接收到反射回的光线则检测出白线继而输出低电平,若接收不到发射管发出的光线则检测出黑线继而输出高电,图13为红外对管黑线检测电路。 图13红外对管黑线检测电路3.4.1红外传感器TCRT5000简介TCRT5000光电传感器模块是基于TCRT5000红外光电传感器设计的一款红外反射式光电开关。传感器采用高发射功率红外光电二极管和高灵敏度光电晶体管组成,输出信号经施密特电路整形,稳定可靠。传感器的红外发射二极管不断发射红外线,当发射出的红外线没有被反射回来或被反射回来但强度不够大时,光敏三极管一直处于关断状态,此时模块的输出端为低电平,指示二极管一直处于熄灭状态;被检测物体出现在检测范围内时,红外线被反射回来且强度足够大,光敏三极管饱和,此时模块的输出端为高电平,指示二极管被点亮。TCRT5000反射式光电传感器是经常使用的传感器,这个系列的传感器种类齐全、价格便宜、体积小、使用方便、质量可靠、用途广泛。此传感器含一个反射模块(发光二极管)和一个接收模块(光敏三极管)。通过发射红外信号,看接收信号变化判断检测物体状态的变化,图14为TCRT5000传感器模块电路原理图,图15为它的实物图。图14TCRT5000传感器模块电路原理图图15TCRT5000的实物图基本参数如下:外形尺寸:长32mm~37mm;宽7.5mm;厚2mm工作电压:DC3V~5.5V,推荐工作电压为5V检测距离:1mm~8mm适用,焦点距离为2.5mm3.5无线模块的硬件设计 无线模块的硬件设计采用两块NRF24L01模块实时接收遥控发送的新指令.重力感应模块的硬件设计重力感应模块采用MPU-6050模块(三轴陀螺仪

+三轴加速度)MPU-6000为全球首例整合性6轴运动处理组件,相较于多组件方案,免除了组合陀螺仪与加速器时之轴间差的问题,减少了大量的包装空间。MPU-6000整合了3轴陀螺仪、3轴加速器,并含可藉由第二个I2C端口连接其他厂牌之加速器、磁力传感器、或其他传感器的数位运动处理(DMP:DigitalMotionProcessor)硬件加速引擎,由主要I2C端口以单一数据流的形式,向应用端输出完整的9轴融合演算技术InvenSense的运动处理资料库,可处理运动感测的复杂数据,降低了运动处理运算对操作系统的负荷,并为应用开发提供架构化的API。MPU-6000的角速度全格感测范围为±250、±500、±1000与±2000°/sec(dps),可准确追緃快速与慢速动作,并且,用户可程式控制的加速器全格感测范围为±2g、±4g±8g与±16g。产品传输可透过最高至400kHz的I2C或最高达20MHz的SPI。MPU-6000可在不同电压下工作,VDD供电电压介为2.5V±5%、3.0V±5%或3.3V±5%,逻辑接口VVDIO供电为1.8V±5%。MPU-6000的包装尺寸4x4x0.9mm(QFN),在业界是革命性的尺寸。其他的特征包含内建的温度感测器、包含在运作环境中仅有±1%变动的振荡器。应用运动感测游戏现实增强电子稳像(EIS:ElectronicImageStabilization)光学稳像(OIS:OpticalImageStabilization)行人导航器“零触控”手势用户接口姿势快捷方式认证

市场智能型手机平板装置设备手持型游戏产品?蜗坊?3D遥控器可携式导航设备特征以数字输出6轴或9轴的旋转矩阵、四元数(quaternion)、欧拉角格式(EulerAngleforma)的融合演算数据。具有131LSBs/°/sec敏感度与全格感测范围为±250、±500、±1000与±2000°/sec的3轴角速度感测器(陀螺仪)。可程式控制,且程式控制范围为±2g、±4g、±8g和±16g的3轴加速器。移除加速器与陀螺仪轴间敏感度,降低设定给予的影响与感测器的飘移。数字运动处理(DMP:DigitalMotionProcessing)引擎可减少复杂的融合演算数据、感测器同步化、姿势感应等的负荷。运动处理数据库支持Android、Linux与Windows内建之运作时间偏差与磁力感测器校正演算技术,免除了客户须另外进行校正的需求。以数位输出的温度传感器以数位输入的同步引脚(Syncpin)支援视频电子影相稳定技术与GPS可程式控制的中断(interrupt)支援姿势识别、摇摄、画面放大缩小、滚动、快速下降中断、high-G中断、零动作感应、触击感应、摇动感应功能。VDD供电电压为2.5V±5%、3.0V±5%、3.3V±5%;VDDIO为1.8V±5%陀螺仪运作电流:5mA,陀螺仪待命电流:5μA;加速器运作电流:350μA,加速器省电模式电流:20μA@10Hz高达400kHz快速模式的I2C,或最高至20MHz的SPI串行主机接口(serialhostinterface)内建频率产生器在所有温度范围(fulltemperaturerange)仅有±1%频率变化。使用者亲自测试10,000g碰撞容忍度为可携式产品量身订作的最小最薄包装(4x4x0.9mmQFN)符合RoHS及环境标准6效果图 6软件设计4.1编译语言的选取目前,STC89C52单片机的开发多为支持两种语言,一种是汇编语言,另一种是C语言,而这两种语言各有其优缺点。汇编语言:效率高,对硬件的可操控性更强,体积小,但不易维护,可移植性很差。C语言:效率比较低,硬件可操控性比较差,目标代码体积大,但容易维护,可移植性很好。而在本设计里面,程序需要接近底层,但程序要解决的问题繁多,逻辑关系也比较复杂,代码量也比较大,又考虑到产品以后需要升级,各方面综合考虑,主要以C51语言来编写本设计的程序是最佳选择。4.2软件调试平台KeilforC51是美国KeilSoftware公司出品的C语言软件开发系统,与汇编相比,C语言在功能上、结构性、可读性、可维护性上有明显的优势,因而易学易用。KeilC51软件提供丰富的库函数和功能强大的集成开发调试工具,全Windows界面。另外重要的一点,只要看一下编译后生成的汇编代码,就能体会到KeilforC51生成的目标代码效率非常之高,多数语句生成的汇编代码很紧凑,容易理解。在开发大型软件时更能体现高级语言的优势。下面详细介绍KeilforC51开发系统各部分功能和使用。C51开发中除必要的硬件外,同样离不开软件,我们写的源程序要变为C51可以执行的机器码有两种方法,一种是手工汇编,另一种是机器汇编,目前已极少使用手工汇编的方法了。随着C51开发技术的不断发展,从普遍使用汇编语言到逐渐使用高级语言开发,单片机的开发软件也在不断发展,Keil软件除了致力于单片机的编程开发平台外,还针对目前最流行C51开发项目出品了Keilfor51软件平台以及支持在线调试的串口烧写。从近年来各仿真机厂商纷纷宣布全面支持Keil即可看出。Keil提供了包括C编译器、宏汇编、连接器、库管理和一个功能强大的仿真调试器等在内的完整开发方案,通过一个集成开发环境(uVision2)将这些部份组合在一起。小车端程序文件一main.c#include<reg52.h>#include<intrins.h>#include"..\header\init.h"#include"..\header\NRF24L01.h"voidR_S_Byte(ucharR_Byte){ SBUF=R_Byte;while(TI==0); //查询法 TI=0;}/**********定时器初始化程序***************/voidT0T1_init(){ EA=1; ET1=1; ET0=1;TMOD=0x11;//定时器0负责小车速度控制定时器1负责超声波测距和舵机控制 TH0=(65536-500)/256;TL0=(65536-500)%256; TH1=(65536-500)/256; TL1=(65536-500)%256; TL1=0; TH1=0; TR0=1; TR1=1; }voidStartModule(void)//超声波测距子函数{ 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; }voidConut(void)//通过超声波测量的数据计算距离{ if(csflag==0) { time=TH1*256+TL1; TH1=0; TL1=0; S=(time*1.7)/10;//算出来是mm //if(S>499); } else { csflag=0; S=600;//如果定时器溢出则距离S=600 } if(jd==3){middleS=S;}//测量正前方 elseif(jd==2) {leftS=S;}//测量左前方 elseif(jd==4){rightS=S;}//测量右前方}/**********************接收遥控器的状态标志**********************/voidRX_STATE(void){ ucharRxBuf[4]; ucharSIGN=0;if(nRF24L01_RxPacket(RxBuf))//如果收到遥控器的数据则进入 { led2=~led2; R_S_Byte(RxBuf[0]); SIGN=RxBuf[2];//判断倾斜的方向X_SIAN=0:前方X_SIAN=1:下方 STATE=RxBuf[3]; LED_FLAG=(SIGN&0x04)>>2;//判断小车灯光控制位 CONTROL_MODE_FLAG=(STATE&0xf0)>>4;//读取当前状态标志 if(LED_FLAG)LED1=1; elseif(LED_FLAG==0)LED1=0; }}voiddelay_RX(uintz)//避障模式下当出现while循环时用的延时函数,{ uintx,y; for(x=110;x>0;x--) { for(y=z;y>0;y--); RX_STATE();//扫描无线模块接收到的新指令 }}voidmeasured(unsignedcharfs)//测距函数jd=3测量正前方jd=2测量左前方jd=4测量右前方{ TH1=(65536-500)/256; TL1=(65536-500)%256;//12MZ晶振,0.5ms mode=0; jd=fs; count2=0; TR1=1; delay_RX(500); TR1=0; mode=1; TH1=0; TL1=0; StartModule(); while(!RX); //当RX为零时等待 TR1=1; //开启计数 while(RX); //当RX为1计数并等待 TR1=0; //关闭计数 Conut();}/********************避障模式子函数***********************/voidcsbmode(void){ unsignedchartemp; TR1=0; mode=1; TH1=0; TL1=0; StartModule(); while(!RX); //当RX为零时等待 TR1=1; //开启计数 while(RX); //当RX为1计数并等待 TR1=0; //关闭计数 Conut();//测量前方距离 delay_RX(80); speed1=16;speed2=16; while(middleS>500&&CONTROL_MODE_FLAG==3) //当前方空间大于300mm时保持 { IN1_1=0;IN1_2=1;IN2_1=0;IN2_2=1;//小车前进 TR1=0; mode=1; TH1=0; TL1=0; StartModule(); while(!RX); //当RX为零时等待 TR1=1; //开启计数 while(RX); //当RX为1计数并等待 TR1=0; //关闭计数 Conut(); delay_RX(2); } IN1_1=0;IN1_2=0;IN2_1=0;IN2_2=0;//小车停止 speed1=0;speed2=0; measured(2); measured(4); TH1=(65536-500)/256; //舵机复位 TL1=(65536-500)%256;//12MZ晶振,0.5ms mode=0; jd=3; count2=0; TR1=1; delay_RX(500); TR1=0; if(leftS<250||rightS<250) { temp=middleS; speed1=20;speed2=20; IN1_1=1;IN1_2=0;IN2_1=1;IN2_2=0;//小车后退 while((middleS-temp)<200&&CONTROL_MODE_FLAG==3) { speed1=20;speed2=20; delay_RX(2); TR1=0; mode=1; TH1=0; TL1=0; StartModule(); while(!RX); //当RX为零时等待 TR1=1; //开启计数 while(RX); //当RX为1计数并等待 TR1=0; //关闭计数 Conut(); } speed1=20;speed2=20; if(leftS<rightS) { IN1_1=1;IN1_2=0;IN2_1=0;IN2_2=1;} else { IN1_1=0;IN1_2=1;IN2_1=1;IN2_2=0;} delay_RX(500); speed1=0;speed2=0; IN1_1=0;IN1_2=0;IN2_1=0;IN2_2=0;//小车停止 measured(2); measured(4); TH1=(65536-500)/256; //舵机复位 TL1=(65536-500)%256;//12MZ晶振,0.5ms mode=0; jd=3; count2=0; TR1=1; delay_RX(500); TR1=0; } if(leftS<rightS) { speed1=0;speed2=0; IN1_1=1;IN1_2=0;IN2_1=0;IN2_2=1; while(middleS<600&&CONTROL_MODE_FLAG==3) { speed1=17;speed2=17; delay_RX(5); TR1=0; mode=1; TH1=0; TL1=0; StartModule(); while(!RX); //当RX为零时等待 TR1=1; //开启计数 while(RX); //当RX为1计数并等待 TR1=0; //关闭计数 Conut(); } } else { speed1=0;speed2=0; IN1_1=0;IN1_2=1;IN2_1=1;IN2_2=0;//小车左转 while(middleS<600&&CONTROL_MODE_FLAG==3) { speed1=17;speed2=17; delay_RX(5); TR1=0; mode=1; TH1=0; TL1=0; StartModule(); while(!RX); //当RX为零时等待 TR1=1; //开启计数 while(RX); //当RX为1计数并等待 TR1=0; //关闭计数 Conut(); } }}/*****************循迹模式子函数*********************/voidxunji(void){ IN1_1=0;IN1_2=1;IN2_1=0;IN2_2=1;speed1=20;speed2=20; //小车前进 while(irL2==0&&irR2==0&&CONTROL_MODE_FLAG==2) RX_STATE(); if(irL2==1) { IN1_1=0;IN1_2=1;IN2_1=1;IN2_2=0;speed1=18;speed2=18; //小车右转 while(irL1==0&&CONTROL_MODE_FLAG==2) RX_STATE(); } elseif(irR2==1) { IN1_1=1;IN1_2=0;IN2_1=0;IN2_2=1;speed1=18;speed2=18; //小车左转 while(irR1==0&&CONTROL_MODE_FLAG==2) RX_STATE(); }}/******************************************/voidmain(void){ ucharRxBuf[4];// ucharbb=0; intX_ANGLE; intY_ANGLE;// ucharX_SIGN; ucharY_SIGN; ucharSIGN=0; bitFLAG_ANGLE=0;init_RX(); delay(100); T0T1_init(); jd=3; count2=0; mode=0; while(1) { switch(CONTROL_MODE_FLAG) { case0: //按键模式 IN1_1=0;IN1_2=0;IN2_1=0;IN2_2=0; //小车停止 while(CONTROL_MODE_FLAG==0) { RX_STATE(); KEY_VALUE=STATE&0x0f;//读取键值 switch(KEY_VALUE) { case0x0e:IN1_1=1;IN1_2=0;IN2_1=1;IN2_2=0;speed1=20;speed2=20; break; case0x07:IN1_1=0;IN1_2=1;IN2_1=0;IN2_2=1;speed1=20;speed2=20; break; case0x0d:IN1_1=1;IN1_2=0;IN2_1=0;IN2_2=1;speed1=17;speed2=17; break; case0x0b:IN1_1=0;IN1_2=1;IN2_1=1;IN2_2=0;speed1=17;speed2=17; break; default:IN1_1=0;IN1_2=0;IN2_1=0;IN2_2=0;speed1=0;speed2=0; //小车停止 break; } } IN1_1=0;IN1_2=0;IN2_1=0;IN2_2=0; //小车停止 break; case1: //重力模式 jd=3; mode=0; delay(500); while(CONTROL_MODE_FLAG==1) { TR1=0; mode=1; TH1=0; TL1=0; StartModule(); while(!RX); //当RX为零时等待 TR1=1; //开启计数 while(RX); //当RX为1计数并等待 TR1=0; //关闭计数 Conut(); if(nRF24L01_RxPacket(RxBuf))//如果收到遥控器的数据则进入 { led2=~led2; R_S_Byte(RxBuf[0]); X_ANGLE=RxBuf[0];//读取纵向的倾斜度 Y_ANGLE=RxBuf[1];//读取横向的倾斜度 SIGN=RxBuf[2];//判断倾斜的方向X_SIAN=0:前方X_SIAN=1:下方 STATE=RxBuf[3];//判断倾斜的方向Y_SIAN=0:左方X_SIAN=1:右方 LED_FLAG=(SIGN&0x04)>>2;//判断小车灯光控制位 CONTROL_MODE_FLAG=(STATE&0xf0)>>4;//读取当前状态标志 KEY_VALUE=STATE&0x0f;//读取键值 if(LED_FLAG)LED1=1; elseif(LED_FLAG==0)LED1=0; X_SIGN=SIGN&0x01; Y_SIGN=(SIGN&0x02)>>1; if(X_ANGLE>110)X_ANGLE=105;//全速时:if(X_ANGLE>160)X_ANGLE=155; if(Y_ANGLE>110)Y_ANGLE=110;//全速时:if(X_ANGLE>160)X_ANGLE=160; if(Y_ANGLE-X_ANGLE<30)//如果主要是往纵向倾斜则进入 { FLAG_ANGLE=1; if(Y_SIGN)//同时也往左方倾斜 {speed1=40-X_ANGLE/4;speed2=40-(X_ANGLE/4-Y_ANGLE/4);}//左轮 elseif(Y_SIGN==0) {speed1=40-(X_ANGLE/4-Y_ANGLE/4);speed2=40-X_ANGLE/4;} } else { speed1=40-Y_ANGLE/4;speed2=40-Y_ANGLE/4; } if(X_SIGN)X_ANGLE=-X_ANGLE; if(Y_SIGN)Y_ANGLE=-Y_ANGLE; if(FLAG_ANGLE) { FLAG_ANGLE=0; if(X_ANGLE>20){IN1_1=1;IN1_2=0;IN2_1=1;IN2_2=0;} //小车前进 elseif(X_ANGLE<-20&&middleS>200){IN1_1=0;IN1_2=1;IN2_1=0;IN2_2=1;} //小车后退 else { IN1_1=0;IN1_2=0;IN2_1=0;IN2_2=0; //小车停止 } } else { if(Y_ANGLE>20){IN1_1=1;IN1_2=0;IN2_1=0;IN2_2=1;} //小车左转 elseif(Y_ANGLE<-20){IN1_1=0;IN1_2=1;IN2_1=1;IN2_2=0;} //小车右转 else { IN1_1=0;IN1_2=0;IN2_1=0;IN2_2=0;; //小车停止 } } } } break; case2: // speed1=15; // speed2=15; while(CONTROL_MODE_FLAG==2) { xunji(); } IN1_1=0;IN1_2=0;IN2_1=0;IN2_2=0; //小车停止 break; case3: // TR0=0; while(CONTROL_MODE_FLAG==3) { csbmode(); } // TR0=1; IN1_1=0;IN1_2=0;IN2_1=0;IN2_2=0; //小车停止 break; } } }//定时器中断voidzhongduan(void)interrupt1{ TH0=(65536-500)/256; TL0=(65536-500)%256; aa++; if(aa==100) { led0=~led0; aa=0;t0++; }/******************************************///大于则输出低电平/******************************************/ if(count<speed1)// EN1=0;//确实小于,PWM输出高电平 else EN1=1;//大于则输出低电平 if(count<speed2)// EN2=0;//确实小于,PWM输出高电平 else EN2=1;//大于则输出低电平/*******************************************/ count=(count+1);//0.5ms次数加1 count=count%40;//次数始终保持为40即保持周期为20ms }voidzhongduan_0(void)interrupt3//定时器工作在舵机控制模式{ if(mode==0) { TH1=(65536-500)/256; TL1=(65536-500)%256; if(count2<jd)//判断0.5ms次数是否小于角度标识 pwm=0;//确实小于,PWM输出高电平 else pwm=1;//大于则输出低电平 count2=(count2+1);//0.5ms次数加1 count2=count2%40;//次数始终保持为40即保持周期为20ms } elseif(mode==1)//定时器工作在超声波测距模式 { //flag=1; //中断溢出标志 csflag=1; StartModule(); }}文件二<init.h>typedefunsignedcharuchar;typedefunsignedcharuint;uchart0;ucharaa;unsignedcharcount;//0.5ms次数标识unsignedcharcount2;//0.5ms次数标识unsignedcharspeed1;unsignedcharspeed2;unsignedintGS;//脉冲个数unsignedcharGS_H;//脉冲个数高8位unsignedcharGS_L;//脉冲个数低8位//#defineL15//#defineS20sbitled0=P2^6;sbitled2=P2^7;//sbitled3=P2^5;//sbitled4=P2^4;ucharSTATE=0;//小车状态ucharKEY_VALUE=0;//键值sbitLED1=P1^0;//小车灯光控制位ucharLED_FLAG=0;//小车灯光标志0:关闭1:开启ucharCONTROL_MODE_FLAG=0;//控制模式标志0:按键模式1:重力模式2:循迹模式3:避障模式 ucharSFLAG=1;bitmode=0;//定时器工作状态标志。0:舵机控制1:超声波测距sbitIN1_1=P2^1;sbitIN1_2=P2^0;sbitEN1=P2^2;sbitIN2_1=P2^4;sbitIN2_2=P2^3;sbitEN2=P2^5;//sbitMP1=P2^6;//sbitMP2=P2^7;sbitirL1=P1^1;sbitirL2=P1^2;sbitirR1=P3^2;sbitirR2=P3^3;sbit CE =P3^6;sbit CSN =P1^7;sbit SCK =P1^6;sbit MOSI =P3^4;sbit MISO =P3^5;sbit IRQ =P3^7;sbitpwm=P1^5;//P舵机WM信号输出sbitTX=P1^4;sbitRX=P1^3;unsignedcharjd; //角度标识unsignedintS;unsignedinttime;unsignedintleftS,middleS,rightS;bitcsflag=0;//超声波测距接收超时标志1:表示没有接收到超声返回信号//*********************************************NRF24L01*************************************ucharTxBuf2[4]={0,0,0,0};//ucharRxBuf[5];#defineTX_ADR_WIDTH5 //5uintsTXaddresswidth#defineRX_ADR_WIDTH5 //5uintsRXaddresswidth#defineTX_PLOAD_WIDTH10 //20uintsTXpayload#defineRX_PLOAD_WIDTH10 //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_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);uintSPI_RW_Reg(ucharreg,ucharvalue);uintSPI_Read_Buf(ucharreg,uchar*pBuf,ucharuchars);uintSPI_Write_Buf(ucharreg,uchar*pBuf,ucharuchars);unsignedcharnRF24L01_RxPacket(unsignedchar*rx_buf);voiddelay(uintz){ uintx,y; for(x=110;x>0;x--) for(y=z;y>0;y--);} 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.h>voidinit_RX(void){inerDelay_us(100); CE=0;//chipenable CSN=1;//Spidisable SCK=0; SPI_RW_Reg(WRITE_REG+CONFIG,0x0f);//SetPWR_UPbit,enableCRC(2bytes)& SPI_RW_Reg(WRITE_REG+EN_AA,0x01); SPI_RW_Reg(WRITE_REG+EN_RXADDR,0x01);//EnablePipe0 SPI_RW_Reg(WRITE_REG+SETUP_AW,0x02);//Setupaddresswidth=5bytes SPI_RW_Reg(WRITE_REG+SETUP_RETR,0x1a);//500us+86us,10retrans... SPI_RW_Reg(WRITE_REG+RF_CH,0); SPI_RW_Reg(WRITE_REG+RF_SETUP,0x07);//TX_PWR:0dBm,Datarate:1Mbps, SPI_RW_Reg(WRITE_REG+RX_PW_P0,RX_PLOAD_WIDTH); SPI_Write_Buf(WRITE_REG+TX_ADDR,TX_ADDRESS,TX_ADR_WIDTH); SPI_Write_Buf(WRITE_REG+RX_ADDR_P0,TX_ADDRESS,TX_ADR_WIDTH);//CE=1;//}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){ ucharreg_val; CSN=0;//CSNlow,initializeSPIcommunication... SPI_RW(reg);//Selectregistertoreadfrom.. reg_val=SPI_RW(0);//..thenreadregistervalue CSN=1;//CSNhigh,terminateSPIcommunication return(reg_val);//returnregistervalue}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){ 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){ 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);

温馨提示

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

评论

0/150

提交评论