我想下载-个能指明了方向和路径方向的罗盘图案该么么操作。

 上传我的文档
 下载
 收藏
该文档贡献者很忙,什么也没留下。
 下载此文档
正在努力加载中...
人教版选修(1-1)《指南针与远洋航海》word教案【word版教案,下载可编辑】
下载积分:600
内容提示:人教版选修(1-1)《指南针与远洋航海》word教案【word版教案,下载可编辑】
文档格式:DOC|
浏览次数:0|
上传日期: 10:04:22|
文档星级:
该用户还上传了这些文档
人教版选修(1-1)《指南针与远洋航海》word教案【word版
官方公共微信/>随着科技发展,现代人愈发追求高效、快捷。传统的指南针所采用的是磁化 指针和方位盘的组合方式,整个指南针系统从现实使用的角度上看,在指示灵敏 度、便携性上都存在着一定的不足。而本次的设计采用专用的磁场传感器结合高 速微控制器(MCU)的电子指南针能有效解决这些问题。 本文所设计的系统, 通过采用磁阻 (GMR) 传感器采集某一方向磁场强度后, 传送至 MCU 控制器对其数据进行处理并判断对应角度的结果,最后通过 LCD 显示屏显示出来。该系统通过实际测试,指南针模块精度达到 1°,能够在 LCD 上显示当前方位角度。 关键词: 电子指南针 单片机 磁场传感器I ABSTRACTWith the development of science and technology, modern people are chasing the convenience and efficiency. The traditional compass is the combination of the magnetized pointer and orientation, in terms of the practical use of the compass system, there are certain disadvantages in the instructions sensitivity and convenience. And this decide can solve these problems by the using the special design magnetic field sensor combined with high speed micro controller (MCU) electronic compass. The design of the system, will collect a certain direction of the magnetic intensity by using the magnetic resistance (GMR) sensors, transmit to the MCU controller which can deal with the data processing and judge the results of the corresponding Angle, and finally display it through the LCD screen. After the practical test, a compass module accuracy can reach 1 ° and display on the current position of the , LCD screen. Keywords: Electronic compass MCU Magnetic sensorsII 目BACK PLACE录1. 课题绪论 .............................................................................................................. 11.1. 1.2. 1.3. 1.4. 课题背景 ........................................................................................................ 1 课题目的 ........................................................................................................ 1 课题的意义 .................................................................................................... 2 设计内容 ........................................................................................................ 22. 模块方案的选择 ................................................................................................ 42.1. 方案一:PLC 控制........................................................................................ 4 2.2. 方案二:51 系列单片机 ............................................................................... 43. 系统硬件设计..................................................................................................... 63.1. 系统设计原理 ................................................................................................ 6 3.2. 系统总体结构 ................................................................................................ 6 3.3. 模块电路设计 ................................................................................................ 74. 系统软件设计................................................................................................... 164.1. 4.2. 4.3. 4.4. 系统主程序 .................................................................................................. 16 信号采集程序 .............................................................................................. 16 信号显示程序 .............................................................................................. 18 越境提示程序 .............................................................................................. 195. 数据测试与结果分析..................................................................................... 20 6. 总结 ..................................................................................................................... 21致谢.............................................................................................................................. 23 参考文献...................................................................................................................... 24附录 ............................................................................................................................ 25系统总电路........................................................................................................... 25 系统程序............................................................................................................. 256 实物图................................................................................................................. 377 电子指南针设计1. 课题绪论1.1. 课题背景作为我国四大发明之一的指南针,古称“司南” 。它代表着我国劳动人民在 长期生活实践中对物体磁性认识的结果,更象征着我国劳动人民的智慧。由于生 产劳动,人们发现了磁矿石,并开始了对磁性质的了解。人们首先发现了磁石引 铁的性质。后来又发现了磁石的指向性。经过多方的实验和研究,终于发明了可 以实用的指南针[1]。 追溯指南针的始祖,它大约出现在战国时期。其样子像只水勺,用天然磁石 磨制面成, 勺底为球面体, 勺呈椭圆状, 勺柄通体渐渐缩成柱状。 为了确定方向, 还配有一个“地盘”, 它是铜质或涂漆木制盘, 中央是平滑圆槽。 当它静止的时候, 勺柄就会指向南方,故古人称它为“司南”。司南,整个系统由青铜盘和天然磁体 制成的磁勺组成,青铜盘上刻有二十四向。 指南针作为四大发明之一,无疑让我们国人引以为傲,但随社会的发展与进 步,司南的许多缺陷也越来越明显,如,天然磁体资源有限并不易找到,在后期 加工时又容易因为打击、 受热等工序而失磁。 也是因为这样, 司南的磁性比较弱, 而通过接触旋转而指明方向,需要它与地盘接触处要非常光滑,否则会因转动摩 擦阻力过大,而难于旋转,影响指南效果。再者,司南有一定的体积和重量,携 带很不方便,使得司南长期未得到广泛应用。 到近代,因工艺技术的发展,指南针体积逐渐减小,使得指南针的应用范围 更是越来越广,军事、生产、日常生活、地形测量等方面,特别是航海上。但是, 磁石式的指南针仍存在不足, 如, 易失磁性、 制作工程繁琐、 精确度不高等问题。1.2. 课题目的随着人们对指南针原理认识的不断深入,指南针也由先前笨重的“司南”发 展到现在的便携式的指南针。但其基本构造是没有改变的,都是属于机械的指针 式,其指示的机械结构基本上没有改变,都是利用某种支撑使得磁针能够受到地 磁场的影响而自由的旋转。由于机械的先天因素导致了指针式指南针在便携性、1 灵敏度、 精度以及使用寿命上都有一定的限制。 由于国内外电子技术的飞速发展, 特别是在磁传感器和专用芯片上的发展使能指南针的基本实现机理有了质的改 变, 不再是机械结构而采用了磁场传感器和专用处理器对磁场进行测量和处理后 指示方向,这就是当前应用较为广泛的电子式指南针。 电子指南针将替代旧的针式指南针或罗盘指南针, 因为电子指南针全采用固 态的元件,还可以简单地和其他电子系统接口。 本次课题的电子指南针大部分功能是由单片机处理实现的。 由于单片机具有 体积小,控制功能灵活,造价低等优点,因此,迎合当今时代对指南针的迫切应 用需求,设计出基于单片机的电子指南针系统就具有很强的实用性。1.3. 课题的意义本次毕业设计选择“基于单片机的电子指南针的设计”是为了更好地学习和 研究 51 系列单片机电路系统设计的相关知识,掌握基本应用电路设计的方法和 技巧。如今,电子指南针已经受到普及运用,其功能也越来越多。而本设计针对 电子指南针的各个功能部件对电子指南针的关键部分做了详细的研究。 电子指南 针系统是一个典型的单片机系统, 了解其工作原理及其信号处理流程有利于研究 更加复杂的嵌入式系统, 特别是系统中来自国外的磁传感器及其信号的采集芯片 更是有利于研究磁场传感器的实现机理,以便将此技术应用于其他领域。 同时为能将课堂与书本中学习到的理论知识运用到实践中, 设计出以系统简 洁为目标的电子指南针系统方案, 并能深入了解各种电子元器件的使用方法和基 本用途,能够灵活迅速地判断电路中出现的故障;学会独立设计电路,积累更多 的设计经验,并加强训练焊接的能力和技巧,同时在实践过程中锻炼查阅、归纳 和整理各种参考资料的能力,提高理论联系实际的能力。 通过亲自设计课题来训练我们大学生应用所学专业知识解决实际工程和实 践问题的技能,巩固所学专业知识,拓宽知识面;激发我们大学生的创新意识, 培养大学生实践动手能力和综合科研开发能力。1.4. 设计内容本文(设计)是“基于单片机的电子指南针的设计” ,系统以 STC89C52 单 片机为控制核心,操纵磁场传感器检测所处环境的磁场。系统核心技术是由单片 机通过 HMC5883 磁场传感器(3 轴罗盘)检测环境中得磁场强度的数据对身处2 磁场进行判断,与程序设定的数据进行角度换算,通过磁场变化来测量所处方向 的偏差,实现对指南针的判别方向功能,达到简化电子指南针系统的目的。3 2. 模块方案的选择2.1. 方案一:PLC 控制采用可编程逻辑系统 PLC 控制。PLC 是一种数字式运算操作的电子系统,集 成度高,工作稳定可靠,且外围接口多,编程方便,用户在硬件方面的设计工作 只是确定 PLC 的硬件配置和 I/O 的外部接线即可, 是专为工业环境下的系统应用 而设计的。它采用可编程序的存储器,用来在其内部存贮执行逻辑运算、顺序控 制、定时、计数和算术等操作指令,并通过数字式、模拟式的输入输出,控制各 种类型的机械或生产过程 。但其造价昂贵,大批量生产费用很高,不适用于本 设计电子指南针。故不选用此方案。[2]2.2. 方案二:51 系列单片机51 系列单片机的优点之一是它从内部的硬件到软件有一套完整的按位操作 系统,称作位处理器,或布尔处理器,它能进行位操作。它不仅能对片内某些特 殊功能寄存器的某位进行处理,如传送、置位、清零、测试等,还能进行位的逻 辑运算,其功能十分完备,使用起来得心应手。虽然其他种类的单片机也具有位 处理功能,但能进行位逻辑运算的实属少见。51 系列在片内 RAM 区间还特别开 辟了一个双重功能的地址区间,十六个字节,单元地址 20H~2FH,它既可作字 节处理,也可作位处理,使用极为灵活。这一功能无疑给使用者提供了极大的方 便,因为一个较复杂的程序在运行过程中会遇到很多分支,因而需建立很多标志 位,在运行过程中,需要对有关的标志位进行置位、清零或检测,以确定程序的 运行方向。而实施这一处理,只需用一条位操作指令即可。51 系列的 I/O 脚的 设置和使用也非常简单,当引脚为低电平时,吸入电流可达 20mA,具有一定的 驱动能力。 BACK本次设计的电子指南针,出于实用角度,设计目的在于要求体积小,并且功 能完备,因此要求控制器体积小,以便能够在运用过程中实现便携性。51 系列 单片机具有体积小、编程灵活、外设多样、易于扩展等优点,可以实现多种控制 功能,广泛地应用于各种电路控制系统中。由于 51 系列单片机技术成熟,加上 其多功能,低功耗等特点,能满足不同系统的应用需要。相比之下,51 系列单 片机最大的优点就是生产成本低,市售价格便宜,操作简单,适用于小型电路产4 品开发,方便大批量生产以其为核心的设备,且都能满足电路系统的要求[3]。 综上所述,本次设计采用 51 系列的 STC89C52 单片机作为主控芯片。5 3. 系统硬件设计3.1. 系统设计原理地球的磁场强度大约为 0.5-0.6 高斯, 并且具有一个平行于地球表面的成份, 它始终指向磁北。这是信号采集模块的基础,地球磁场可用图 3.1 中所示的双极 模型来模拟表示。图 3.1 地球磁场与真北模拟图北半球中地球磁场向下指向北方,在赤道处它水平指向北方,并且在南半球 中向上指向北方。在任何情况下,地球磁场的方向始终指向磁北。而我们要应用 的,正是这磁场中平行于地球表面的分量[4]。在本设计的信号采集中,我们关键 完成两个步骤:1)确定地球磁场的水平分量;2)纠正磁偏角。在本设计中,我 们采用磁阻传感器来完成设计系统。 磁罗盘通过测量地磁场水平方向分量确定磁北极方向并推算出其他方向。当 罗盘水平放置时,传感器坐标系的 X、Y 轴在水平面内,X 轴为前进方向,Y 轴垂 直于 X 轴向右,Z 轴沿重力方向向下,从磁北方向顺时针到 X 轴的夹角即为方位 角a。地球磁场分量见下图 3.2。图 3.2 X、Y、Z 坐标中的地球磁场分量3.2. 系统总体结构本系统为电子指南针的控制设计。电子指南针系统由主控制器、按键、磁场6 传感器、方位显示等几大模块组成,由程序控制实现方位测量的磁场感应与角度 换算。系统组成结构如图 3.3 所示。开关控制 越境提示 三轴 磁阻 输入 控制 图 3.3 电子指南针系统组成BACKMCULCD 显示屏本系统实现了对身处方位的方向的测量。系统可分为四个模块:电源模块、 主控芯片模块、信号采集模块、数据输出模块。整个系统中前端的磁阻传感器负 责测量地磁场的大小并将磁场的变化转化为微弱的电流的变化, 专用的磁场测量 芯片负责把磁阻传感器变化的电流(模拟量)转换成微控制器可以识别的数字量 然后通过芯片内部的 I2C 总线上传给微控制器。 微控制器将表征当前磁场大小的 数字量按照方位进行归一化等处理后通过直观的 LCD 进行方位显示[5]。 整个系统中只使用小部分 I/O 口,预留了部分 I/O 接口,使整个系统功能得 到进一步的扩展(如,添置 GPS 全球定位功能等) 。3.3. 模块电路设计3.3.1.电源设计方案一: 电源模块是为整个电路系统提供能源和动力的重要保证。 一般的直流稳压电 源由整流电路,滤波电路和稳压电路等几部分组成。整流电路采用 4007 二极管 整流桥对正弦波进行全波整流。 滤波电路为滤除高次谐波, 让电流波形基本平稳。 稳压电路采用 78 系列的三端稳压管以保证输出更加稳定的直流波形。稳压电源 工作原理图如图 3.4 所示。图 3.4 稳压电源工作原理示意图 7 用 78/79 系列三端稳压 IC 来组成稳压电源所需的外围元件极少,电路内部 还有过流、过热及调整管的保护电路,使用起来可靠、方便,而且价格便宜[6]。 该系列集成稳压 IC 型号中的 78 或 79 后面的数字代表该三端集成稳压电路的输 出电压,如 7806 表示输出电压为正 6V,7909 表示输出电压为负 9V。而本设计 所使用的 7805 即输出电压为正 5V。图 3.5 7805 引脚图本机电源采用输出+5V 和+3.3V,分别用于提供电子电路工作电源和磁感电 阻芯片驱动电源。先使用交流变压器将 220V 市电降压至 15V,经过二极管整流 桥整流、电容滤波和稳压管稳压,能输出稳定的直流 5V 和 3.3V 电压。驱动单 相交流电机的电源是从 220V 电源线引入控制电机的电磁继电器结点,以实现电 机动作的控制。电源模块的电路原理图如图 3.6 所示。图 3.6 稳压电源模块方案二: 鉴于本设计电子指南针主要应用于户外,故补充设计携带性较强的电源系 统,基于携带方便,方案二电源选用干电池,生活中最为常见的 1.5V 干电池, 通过串联 4 节干电池获得 6V 直流电源,然后使用电阻串联分压,分别产生 5V 及 3.3V 电源。 电源控制:8 本设计系统基于实际实用考虑,电子指南针工作不为 24 小时,故加入电源 控制系统,使用开关串联在 5V 电压输入与系统 VCC 线路中,在开关闭合时, 系统正常工作并有发光二极管 LED 点亮提示。图 3.7 电源控制电路3.3.2.主控芯片电路设计本设计使用 STC89C52 作为主控芯片,它是一种带 8K 字节闪烁可编程可檫 除只读存储器的低电压,高性能 COMOS8 的微处理器,俗称单片机。该器件采 用 ATMEL 搞密度非易失存储器制造技术制造,与工业标准的 MCS-51 指令集和 输出管脚相兼容。 STC89C52 单片机有 4 组 8 位的可编程 I/O 口, 分别位 P0、 P1、 P2、P3 口,每个口为 8 位(8 根引脚) ,共 32 根。芯片的封装与引脚排列如图 3.8 所示。STC89C52 主要功能如表 3.1 所示。表 3.1 STC89C52 主要功能兼容 MCS51 指令系统 32 个双向 I/O 口 3 个 16 位可编程定时/计数器中断 2 个串行中断 2 个外部中断源 2 个读写中断口线 低功耗空闲和掉电模式8K 可反复擦写 Flash ROM 256x8bit 内部 RAM 时钟频率 0-24MHz 可编程 UART 串行通道 共 6 个中断源 3 级加密位 软件设置睡眠和唤醒功能9 图 3.8 STC89C52 引脚排列与引脚功能系统控制使用的 STC89C52 单片机,时钟晶振使用 12MHz,并设计有上电 自动复位和按键手动复位电路。 RST 引脚是复位信号的输入端。 复位信号是高电 平有效,其有效时间应持续 24 个振荡周期,即二个机器周期以上。若使用频率 为 12MHz 的晶振,则复位信号持续时间应超过 2us 才能完成复位操作。上电自 动复位是通过外部复位电路的电容充电来实现的。 这佯, 只要电源 Vcc 的上升时 间不超过 1ms,就可以实现自动上电复位,即单片机接通电源就成了系统的复位 初始化[7]。STC89C52 在系统中的工作电路如图 3.9 所示。图 3.9 STC89C52 电路原理图10 单片机的按键手动复位有电平方式和脉冲方式两种。其中,按键电平复位是 通过使复位端经电阻与 Vcc 电源接通而实现的; 而按键脉冲复位则是利用 RC 微 分电路产生的正脉冲来实现的。 由于电平复位电路简单易于实现且能满足系统工 作要求,本次设计采用按键电平复位电路。 单片机的 P0 口用于 LCD 数据的输出;P1.0,P1.1 口为控制磁场采集模块的 SCL(IIC 时钟) 、SDA(IIC 数据)的控制信号;P2.0、P2.1、P2.2 口作为 LCD 显示屏的读写使能控制;P3 口以及其余搁置,用于补充设计系统的功能拓展。3.3.3.信号采集模块磁场感应模块,根据查阅书籍与网络,目前应用最为广泛的有 KMZ52 以及 HMC5833L 两款磁感。根据对两款模块的学习,发现 KMZ52 实际应用外围应用 电路比较复杂, 不利于本次设计目的, 故放弃。 信号采集模块采用 HMC5883 (三 轴数字罗盘) ,能够为整个设计系统节省体积,有效提高系统的便携性[8]。 霍尼韦尔 HMC5883L 是一种表面贴装的高集成模块,并带有数字接口的弱 磁场传感器芯片,应用于低成本罗盘和磁场检测领域。HMC5883L 包括最先进 的高分辨率 HMC118X 系列磁阻传感器, 并附带霍尼韦尔专利的集成电路包括放 大器、自动消磁驱动器、偏差校准、能使罗盘精度控制在 1°~2°的 12 位模数 转换器,简易的 IIC 系列总线接口[9]。其内部原理如下:图 3.10 STC89C52 电路原理图通过三个磁阻(AMR)分别测得环境磁场 X、Y、Z 轴数据后,经过多路复11 用器(MUX)及模拟信号处理(ANALOG 模块)进行 AD 转换,最后将数据较 由 CONTROL 模块结合 OFF SET(补偿电路)进行数据处理并最后使用 IIC 协 议输出测量数据[9]。 HMC5883L 采用霍尼韦尔各向异性磁阻(AMR)技术,具有在轴向高灵敏 度的线性高精度的特点。 传感器带有的对于正交轴低敏感行得固相结构能用于测 量地球磁场的方向和大小,起测量范围从毫高斯到 8 高斯。 带有 16 引脚,功能和特性均合适用于本次设计并有利于设计目的的达成。 其引脚图及功能如下表 3.2。表 3.2 HMC5883L 引脚功能图 3.10HMC5883L 引脚图及实物图信号采集模块 HMC5883 的电路电路图如图 3.11 所示。R1、R2 为 IIC 总线12 上拉电阻,DRDY 为数据准备好中断,可接控制器中断输入口。电容 C3、C4 加 上传感器片上 ASIC 电路中得 H-电桥驱动电路可以产生电流脉冲, 使偏上的置位 /复位电流带产生磁场给传感器去磁和极性翻转。图 3.11 信号采集模块 HMC5883 电路图3.3.4. LCD 显示模块LCD 液晶显示器是 Liquid Crystal Display 的简称。 本次设计是用 1602LCD, 16*2,即可以显示两行,每行 16 个字符液晶模块(显示字符和数字) 。该 LCD 体积小、工作电压低,非常适合于电池供电的便携式设备。 1602 液晶也叫 1602 字符型液晶它是一种专门用来显示字母、数字、符号等 的点阵型液晶模块它有若干个 5X7 或者 5X11 等点阵字符位组成, 每个点阵字符 位都可以显示一个字符。 每位之间有一个点距的间隔每行之间也有间隔起到了字 符间距和行间距的作用,正因为如此所以他不能显示图形。 目前市面上字符液晶绝大多数是基于 HD44780 液晶芯片的,控制原理是完 全相同的,因此基于 HD44780 写的控制程序可以很方便地应用于市面上大部分 的字符型液晶[10]。其引脚功能如下表 3.3:表 3.3 LCD1602 引脚功能 引脚 1 2 3 4 名称 VSS VDD V0 RS 描述 为电源地 接 5V 电源正极 液晶显示器对比度调整端 寄存器选择,高电平选择数据寄存器、低电平选择指令寄存器13 5 6 7~14 15 16RW E(或 EN) D0~D7 A K为读写信号线,高电平进行读操作,低电平进行写操作 使能(enable)端 8 位双向数据端 脚背光正极 脚背光负极图 3.12 LCD1602 实物图(引脚由左至右为 1-16)RS 为寄存器选择,高电平 1 时选择数据寄存器、低电平 0 时选择指令寄存 器,与 P2.0 对接。 RW 为读写信号线,高电平(1)时进行读操作,低电平(0)时进 行写操作,与 P2.1 对接。E(或 EN)端为使能(enable)端,与 P2.2 对接。V0 为液 晶显示器对比度调整端,接正电源时对比度最弱,接地电源时对比度最高(通过 一个 10K 的电位器调整对比度) D0~D7 为 8 位双向数据端,与 P0 口对接。 。图 3.13 LCD 显示模块电路3.3.5. 越境提示模块本设计预留 I/O 口较多,可用于不同功能的设计,如,GPS 全球定位、前进 方向锁定等。本设计加入前进方向锁定功能(越境提示) ,其用途在于户外实用14 指南针时,能够定位锁定前进方向,对当下前进方向与设定方向进行比较,出现 一定偏差(本系统采用±10°)时,通过蜂鸣器及显示屏提醒。 该功能模块主要由两大部分组成:一、按键输入,共计 2 个按键,分别作为 模式转换按钮及方向设置按钮。二、蜂鸣器输出,用于提示前进方向超过设定范 围。 本模块主要使用元件为蜂鸣器。蜂鸣器是一种一体化结构的电子讯响器,采 用直流电压供电,广泛应用于计算机、打印机、复印机、报警器、电子玩具、汽 车电子设备、电话机、定时器等电子产品中作发声器件。图 3.14 蜂鸣器(右端为正、左端为负)蜂鸣器的驱动需要较大的电流,本系统使用的 51 单片机 STC89C52 的 I/O 口高电平时,电流不足驱动蜂鸣器,故需要用到三极管进行信号放大,进而正常 驱动蜂鸣器。其设计电路如下图 3.15。图 3.15 功能拓展模块电路15 4. 系统软件设计4.1. 系统主程序根据硬件设计要求,控制主程序流程如图 4.1 所示。系统开始运作后,单片 机上电进行程序的初始化操作, 对输入设备 (HMC5883L) 及输出设备 (LCD1602) 进行数据初始化。初始化完成后,启动磁场检测模块,并开始读取数据,通过主 芯片进行数据计算,计算出当前方位的角度并发送角度到 LCD1602 显示,然后 判别工作模式,分别对不同工作模式,执行对应动作。模式一,计算后输出身处 方位方向;模式二,实时读取身处角度与设定范围的是否出现偏差,并发送警告 信号。最后实现本系统“指南针”的功能。开始初始化发送读取信号角度换算发送显示信号模式一判别模式模式二读取角度数据设置前进角度计算角度方位计算角度范围发送显示信号发送警号变量发送显示信号 图 4.1 主程序流程图4.2. 信号采集程序信号采集模块由HMC5883L负责,模块通过初始化后,进入待命状态,当获 取读取信号后,调用HMC5883_SendByte(SlaveAddress)(发送设备地址+写信号)16 以及HMC5883_SendByte(0x03)(发送存储单元地址,从0x32开始)两个函数, 开始对磁阻所采集的信号对应的地址进行采集并存储到BUF上, 进而发送到主控 芯片上。具体流程及核心程序如下:HMC5883_SendByte(SlaveAddress); HMC5883_SendByte(0x03); HMC5883_Start(); HMC5883_SendByte(SlaveAddress+1); for (i=0; i&6; i++) { BUF[i] = HMC5883_RecvByte(); if (i == 5) { HMC5883_SendACK(1); } else { HMC5883_SendACK(0); } } HMC5883_Stop(); //发送设备地址+写信号 // 发 送 存 储 单 元 地 址 , 从 0x32 开 始 //起始信号 //发送设备地址+读信号 //连续读取6个地址数据,存储中BUF //BUF[0]存储0x32地址中的数据//最后一个数据需要回NOACK//回应ACK//停止信号开始 初始化等待读取信号发送地址与读信号读取地址数据存储地址数据至 BUF图 4.2 信号采集流程图17 4.3. 信号显示程序信号显示程序由 LCD1602 负责,模块通过初始化后,进入待命状态,当获 取显示信号后,根据内设驱动程序开始对主控芯片所发送的数据进行判别,进而 显示我们需要的数据到屏幕上。显示屏驱动及核心程序,如下:void WriteCommandLCM(uchar CMD,uchar Attribc) { if(Attribc) WaitForEnable(); LCM_RS=0;LCM_RW=0;_nop_(); DataPort=CMD;_nop_(); LCM_EN=1;_nop_();_nop_();LCM_EN=0; } void WriteDataLCM(uchar dataW) { WaitForEnable(); LCM_RS=1;LCM_RW=0;_nop_(); DataPort=dataW;_nop_(); LCM_EN=1;_nop_();_nop_();LCM_EN=0; } void DisplayOneChar(uchar X,uchar Y,uchar DData) { Y&=1; X&=15; if(Y)X|=0x40; X|=0x80; WriteCommandLCM(X,0); WriteDataLCM(DData); } 开始 初始化等待显示信号辨别显示命令显示数据图 4.3 数据显示流程图 18 4.4. 越境提示程序越境提示模块, 主要用于判别前进方向是否在设定范围之内。 本功能的运作, 设计 3 个变量,2 个控制量(工作模式选取及设置前进范围) 个输出量(蜂鸣 ,1 器驱动信号) 该功能主要由主控芯片完成。 。 系统在获取设定值后, 将在 LCD1602 上显示,并将对目前身处角度与设定值对比,当超出设定值±10°时,驱动蜂鸣 器,作出警告,并在屏幕右下方提示‘!。 ’开始初始化等待工作信号设置判断角度发送显示信号否是否超范围是警告变量置高警告变量置低发送显示信号驱动蜂鸣电路发送显示信号 图 4.3 功能拓展(前进方向锁定)流程图19 5. 数据测试与结果分析本设计为测量方位工具, 为验证本设计系统的测量精度, 在设计调试完成后, 对本设计进行了精度测试。具体方法为:使用另一指南针测得角度作为参照值。 记录如下数据:表 5.1 测量数据表测量角度 0.4 30.2 60.7 90.8 119.2 150.5参照角度 0 30 60 90 120 150误差 0.4 0.2 0.7 0.8 -0.8 0.5测量角度 179.9 210.1 240.7 270.6 300.3 330.8参照角度 180 210 240 270 300 330误差 -0.1 0.1 0.7 0.6 0.3 0.8通过以上数据记录,我们可以获得,本设计系统在实际运用中,仍会出现测 量角度误差, 但是误差数据明显较小, 计算得: 平均误差为 0.5, 最大误差为 0.8, 故本系统测量精度在 1°内。 误差的存在主要因为本系统设计中未能成功设计抗干扰功能,系统工作中, 因为磁阻周边的器件在工作过程中难免产生一些磁场干扰, 而误差主要就是由此 产生的。 测量方法截图如下:图 5.1 数据测量过程(左为设计系统读数、右为 Iphone 指南针软件示数)20 6. 总结本课题采用 STC89C52 单片机对电子指南针的设计系统进行整体统筹, 基于 电子指南针的实际应用,本系统并不存在过多的控制功能以及人机对话功能,本 系统顺利完成测量角度功能,在使用者正面北方时,系统角度显示为 0 并能够本 显示身处方位,如 0 度对应“north” ,本设计系统的特点有: 1.整体系统结构简洁,模块精简,本次系统设计不考虑电源系统的情况下, 使用的模块仅有 3 块, HMC5883L 的磁场信号采集、 STC89C52 的数据处理、 LCD1602 的信息显示。这使得电子指南针能在户外使用,达到本次设计目的的要求。 2.功能完善,测量准确度高,本次系统所采用的磁阻为 HMC118X 系列磁阻传 感器,具有较高水平的测量精度并自带有自动消磁、偏差校准等功能,提高精确 度的同时,也大幅度减少设计系统的外围电路与整体体积。 3.系统开放性强,信号采集模块因使用 IIC 协议的缘故,只使用 STC89C52 的 2 个 I/O 口与显示系统 7 个数据 I/O 与 3 个功能 I/O, 使得系统有较充足的 I/O 用于功能的拓展, 使用者可根据自身使用需要加入功能 (如, GPS, 时间显示等) 。 4.功能拓展实用性强,本系统所拓展的功能为前进方向锁定功能。能够为使 用者使用时,提供大大的便捷性,减少旧时指南针在使用时,不能兼顾前进视野 的弊端。 5.系统硬件采用单片机 STC89C52 进行控制,工作模块只需添加 HM5833L 与 LCD1602 模块,使系统的搭建既经济又实用。 在本课题的设计过程中,也出现了不少问题。如刚开始确定题目后,在查阅 电子指南针资料时,逐渐了解到指南针的原理,开拓了自身不少课外知识。联系 到课程上学习过的传感器,我确定了要使用磁阻感应器来搭建系统。但是目前市 场上存在的 AMR 款式实在有限,我第一个选取的方案是采用 KMZ52,但是其 外围电路需要比较庞大,这样一来,就让精简系统,提高设计实用性的意义变得 难以实现,同时磁阻感应器应受磁场变化的影响,学习过物理的我们都知道电会 生磁,我们必须要考虑消磁如何实现。种种的问题,让设计一度停滞不前。 功夫不负有心人,在四方求教的时候,获知一种新型芯片,也就是本设计所 采用的 HMC5883L 非常适用于本次设计,价格也比较低廉。但是伴随问题还是 存在的,该芯片使用的是 IIC 协议传输数据,对于陌生的我,实在是一种考验, 经过理论分析与学习,终于摸索出使用思路,并成功编程让芯片工作起来, HMC5883L 的使用给设计和实物调试带来极大方便。 理论上,我们制作设计系统实物前,应使用软件仿真,但是鉴于信号采集模 块是使用 IIC 协议传输,让我的软件仿真无法实现。所以致使我只能通过实物来 调试。跳过软件仿真,进而直接制作实物需要非常大的勇气,所以我购买了许多21 元件回来,只为保证硬件所产生的问题,能够及时发现,避免重复用功。 接着是在焊接第一块通用板时, 由于太久没有接触焊接工作, 误接线的同时, 烧坏了一块电容。除了焊接的硬功夫外,硬件也给我们带来了不少的问题,如 HMC5883L 不能承受高温,否则容易损坏,一开始本着速焊速决,可以避免高 温损坏的思想去焊接电路,结果报废了 2 块 HMC5883L。最后在同学的启发下, 使用插排来替代 HMC5883L 的电路位置,然后在焊接完成后,再将 HMC5883L 插入插排中使用,进而完美的解决了这个问题。 单片机的核心,除了外围电路,系统模块的搭建要无误之外,系统程序的编 写更是一个重要步骤。它体现了我们对电路原理的了解,更直接决定了我们的系 统能否正常运作, 达到预期效果。 整个设计过程, 编程无疑消耗了我最多的时间, 从算法的设置,到程序的推敲,每一步都考验着我们的耐心。中间出现过一个比 较大失误的问题,LCD1602 不能显示中文符号,所以最后只能将中文字符转为 英文字符输出。这也是本次设计中,比较遗憾的地方。22 致谢本次毕业设计课题经历了两个月的时间,通过自身的努力与坚持,在在指导 老师张黎红老师的亲切关怀和悉心指导下,终于要步入尾声了。 作为一名本科生,我们所能在书本上学习到的专业知识确实不多,能接触到 的现代技术更是少之又少,而毕业设计的开展,无疑帮助我们将要步入社会的同 学们开拓自身视野,发掘自身兴趣与潜力,令我们明白到,一个课题或者一个事 情,从零开始,我们应该如何去部署、如何去完成。而作为一个本科生的毕业论 文,由于我们经验的匮乏,避免不了有许多地方考虑不全,也是因为这点我们在 进步着,在导师的督促指导、在同学们的支持和帮助下,我们共同进步着。 回忆起毕业设计的每个阶段,从一开始懵懂地选题到鉴定地查阅资料,以至 中期的论文提纲确立、硬件电路设计以及后期论文格式的调整等各个环节里面, 张黎红老师都给予了悉心指导与帮助。她为我们制定了进度时间表,让我们明确 什么时候该做什么,她总是谦逊地说许多知识她也掌握不够全面,却能在我们需 要帮助的时候及时给予引导,尽管有时候那是一本书、有时候那只是一句话。我 们承受着毕业设计带来的巨大压力,而她却总笑着对我们说“其实那个很简单 的” 。在此,我谨向张黎红老师致以诚挚的谢意。 本次毕业设计,在老师的指导下,我不仅更深入地学习了有关 51 单片机的 知识,还对地球磁场、指南针有了更深入的了解。更重要的是我还学会了一种系 统学习与工作的方法,学会了如何发现问题,解决问题,如何统筹安排、项目细 化,我会将此收获运用以后的学习生活中。 同时,我还要感谢计算机与信息科学系电子教研组的各位老师,是他们在我 遇到困难时付出的耐心和给予的指导使我从解决问题的过程中学到更多的知识, 以及同学们在这期间给我的各方面帮助。 最后,我要感谢院系的老师们,感谢学院四年来的栽培,让我们每一个学生 获取专业知识的同时,学会了如何立足社会。感谢学院图书馆及其网络丰富的资 源,使我们能查阅一些非常重要的参考资料,让我们的毕业设计能更好地进展。 我要再次感谢辅导我的张黎红老师,老师您辛苦了。谢谢!23 参考文献[1]关增建,指南针理论在中国历史上的演变,自然科学史研究,, 24(2),10-15,2005 [2]郭艳萍,电气控制与 PLC 应用,人民邮电出版社,2010。 [3]魏伟,胡玮,王永清,51 单片机 C 语言开发与应用技术,化学工业出版社,2010。 [4]管志宁,地磁场与磁力勘探,地质出版社,2005。 [5]郭检梗诖抛栊酒 MPS430 的单片机的电子罗盘设计[J],信息与电子工程,8(1), 12-14,2010。 [6]江世明,基于 Prouteus 的单片机应用技术,电子工业出版社,2009。 [7]兰吉昌,51 单片机应用设计百例,化学工业出版社,2009。 [8]胡修林,杨奇,用磁场传感器 KMZ52 设计的电子指南针,国外电子元器件,8(3),44-46, 2004。 [9]胡宁博,李剑,赵榉云,基于 HMC5883L 的电子罗盘设计,传感器世界,11(6),35-38, 2011。 [10]余华芳,刘健,单片机与液晶显示模块的软硬件接口技术,液晶与显示,4(2),125-129, 2003。24 附录系统总电路25 系统程序#include &REG51.H& #include &math.h& #include &stdio.h& #include &INTRINS.H& #define uchar unsigned char #define uint unsigned int #define DataPort P0 //LCD1602数据端口 sbit SCL=P1^0; //IIC时钟引脚定义 sbit SDA=P1^1; //IIC数据引脚定义 sbit LCM_RS=P2^0; //LCD1602命令端口 sbit LCM_RW=P2^1; //LCD1602命令端口 sbit LCM_EN=P2^2; //LCD1602命令端口 sbit Mol=P1^2; //工作模式选定端口 sbit Mol2set=P1^3; //设置前进角度命令端口 sbit Speak=P2^3; //蜂鸣器控制端口 #define SlaveAddress 0x3C //定义器件在IIC总线中的从地址 typedef unsigned char BYTE; typedef unsigned short WORD; BYTE BUF[8]; uchar ge,shi,bai,qian, uchar ge1,shi1,bai1,qian1,wan1; int dis_ void delay(unsigned int k); void InitLcd(); void Init_HMC5883(void); void void void void void //接收数据缓存区 //显示变量 //变量//初始化5883WriteDataLCM(uchar dataW); WriteCommandLCM(uchar CMD,uchar Attribc); DisplayOneChar(uchar X,uchar Y,uchar DData); conversion(uint temp_data); conversionset(uint temp_data); //单个写入数据 //单个读取内部寄 //连续的读取内void Single_Write_HMC5883(uchar REG_Address,uchar REG_data); uchar Single_Read_HMC5883(uchar REG_Address); 存器数据 void Multiple_Read_HMC5883(); 部寄存器数据 //以下是模拟iic使用函数------------void Delay5us(); void Delay5ms(); 26 void HMC5883_Start(); void HMC5883_Stop(); void HMC5883_SendACK(bit ack); bit HMC5883_RecvACK(); void HMC5883_SendByte(BYTE dat); BYTE HMC5883_RecvByte(); void HMC5883_ReadPage(); void HMC5883_WritePage(); //----------------------------------//********************************************************* void conversion(uint temp_data) { wan=temp_data/ ; temp_data=temp_data%10000; //取余运算 qian=temp_data/ ; temp_data=temp_data%1000; //取余运算 bai=temp_data/100+0x30 ; temp_data=temp_data%100; //取余运算 shi=temp_data/10+0x30 ; temp_data=temp_data%10; //取余运算 ge=temp_data+0x30; } void conversionset(uint temp_data) { wan1=temp_data/ ; temp_data=temp_data%10000; //取余运算 qian1=temp_data/ ; temp_data=temp_data%1000; //取余运算 bai1=temp_data/100+0x30 ; temp_data=temp_data%100; //取余运算 shi1=temp_data/10+0x30 ; temp_data=temp_data%10; //取余运算 ge1=temp_data+0x30; } /*******************************/ void delay(unsigned int k) { unsigned int i,j; for(i=0;i&k;i++) { for(j=0;j&121;j++) {;}} 27 } /*******************************/ void WaitForEnable(void) { DataPort=0 LCM_RS=0;LCM_RW=1;_nop_(); LCM_EN=1;_nop_();_nop_(); while(DataPort&0x80); LCM_EN=0; } /*******************************/ void WriteCommandLCM(uchar CMD,uchar Attribc) { if(Attribc)WaitForEnable(); LCM_RS=0;LCM_RW=0;_nop_(); DataPort=CMD;_nop_(); LCM_EN=1;_nop_();_nop_();LCM_EN=0; } /*******************************/ void WriteDataLCM(uchar dataW) { WaitForEnable(); LCM_RS=1;LCM_RW=0;_nop_(); DataPort=dataW;_nop_(); LCM_EN=1;_nop_();_nop_();LCM_EN=0; } /***********************************/ void InitLcd() { WriteCommandLCM(0x38,1); WriteCommandLCM(0x08,1); WriteCommandLCM(0x01,1); WriteCommandLCM(0x06,1); WriteCommandLCM(0x0c,1); } /***********************************/ void DisplayOneChar(uchar X,uchar Y,uchar DData) { Y&=1; X&=15; if(Y)X|=0x40; X|=0x80; WriteCommandLCM(X,0); WriteDataLCM(DData); 28 } void Delay5us() { _nop_();_nop_();_nop_();_nop_(); _nop_();_nop_();_nop_();_nop_(); _nop_();_nop_();_nop_();_nop_(); _nop_();_nop_();_nop_();_nop_(); _nop_();_nop_();_nop_();_nop_(); _nop_();_nop_();_nop_();_nop_(); _nop_();_nop_();_nop_();_nop_(); _nop_();_nop_();_nop_();_nop_(); _nop_();_nop_();_nop_();_nop_(); _nop_();_nop_();_nop_();_nop_(); _nop_();_nop_();_nop_();_nop_(); _nop_();_nop_();_nop_();_nop_(); _nop_();_nop_();_nop_();_nop_(); _nop_();_nop_();_nop_();_nop_(); _nop_();_nop_();_nop_();_nop_(); _nop_();_nop_();_nop_();_nop_(); _nop_();_nop_();_nop_();_nop_(); _nop_();_nop_();_nop_();_nop_(); } void Delay5ms() { WORD n = 560; while (n--); } /************************************** 起始信号 **************************************/ void HMC5883_Start() { SDA = 1; //拉高数据线 SCL = 1; //拉高时钟线 Delay5us(); //延时 SDA = 0; //产生下降沿 Delay5us(); //延时 SCL = 0; //拉低时钟线 } /************************************** 29 停止信号 **************************************/ void HMC5883_Stop() { SDA = 0; //拉低数据线 SCL = 1; //拉高时钟线 Delay5us(); //延时 SDA = 1; //产生上升沿 Delay5us(); //延时 } /************************************** 发送应答信号 入口参数:ack (0:ACK 1:NAK) **************************************/ void HMC5883_SendACK(bit ack) { SDA = //写应答信号 SCL = 1; //拉高时钟线 Delay5us(); //延时 SCL = 0; //拉低时钟线 Delay5us(); //延时 } /************************************** 接收应答信号 **************************************/ bit HMC5883_RecvACK() { SCL = 1; //拉高时钟线 Delay5us(); //延时 CY = SDA; //读应答信号 SCL = 0; //拉低时钟线 Delay5us(); //延时 return CY; } /************************************** 向IIC总线发送一个字节数据 **************************************/ void HMC5883_SendByte(BYTE dat) { BYTE 30 for (i=0; i&8; i++) { dat &&= 1; SDA = CY; SCL = 1; Delay5us(); SCL = 0; Delay5us(); } HMC5883_RecvACK(); }//8位计数器 //移出数据的最高位 //送数据口 //拉高时钟线 //延时 //拉低时钟线 //延时/************************************** 从IIC总线接收一个字节数据 **************************************/ BYTE HMC5883_RecvByte() { BYTE BYTE dat = 0; SDA = 1; for (i=0; i&8; i++) { dat &&= 1; SCL = 1; Delay5us(); dat |= SDA; SCL = 0; Delay5us(); } } //*************************************************** void Single_Write_HMC5883(uchar REG_Address,uchar REG_data) { HMC5883_Start(); //起始信号 HMC5883_SendByte(SlaveAddress); //发送设备地址+写信号 HMC5883_SendByte(REG_Address); //内部寄存器地址 HMC5883_SendByte(REG_data); //内部寄存器数据 HMC5883_Stop(); //发送停止信号 } 31 //使能内部上拉,准备读取数据, //8位计数器//拉高时钟线 //延时 //读数据 //拉低时钟线 //延时 //********单字节读取内部寄存器************************* uchar Single_Read_HMC5883(uchar REG_Address) { uchar REG_ HMC5883_Start(); //起始信号 HMC5883_SendByte(SlaveAddress); //发送设备地址+写信号 HMC5883_SendByte(REG_Address); //发送存储单元地址, 从0开始 HMC5883_Start(); HMC5883_SendByte(SlaveAddress+1); REG_data=HMC5883_RecvByte(); HMC5883_SendACK(1); HMC5883_Stop(); return REG_ //起始信号 //发送设备地址+读信号 //读出寄存器数据 //停止信号} //****************************************************** // //连续读出HMC5883内部角度数据,地址范围0x3~0x5 // //****************************************************** void Multiple_read_HMC5883(void) { HMC5883_Start(); //起始信号 HMC5883_SendByte(SlaveAddress); //发送设备地址+写信号 HMC5883_SendByte(0x03); //发送存储单元地址,从0x32开始 HMC5883_Start(); HMC5883_SendByte(SlaveAddress+1); for (i=0; i&6; i++) { BUF[i] = HMC5883_RecvByte(); if (i == 5) { HMC5883_SendACK(1); } else { HMC5883_SendACK(0); } } HMC5883_Stop(); Delay5ms(); } //起始信号 //发送设备地址+读信号 //连续读取6个地址数据,存储中BUF //BUF[0]存储0x32地址中的数据//最后一个数据需要回NOACK//回应ACK//停止信号32 void Init_HMC5883() { Single_Write_HMC,0x00); // } //********************************************************* //主程序******** //********************************************************* void main() { int x,y,z; double angleset=0; delay(500); InitLcd(); Init_HMC5883(); while(1) //循环 { Multiple_Read_HMC5883(); //连续读出数据,存储在BUF中 x=BUF[0] && 8 | BUF[1]; z=BUF[2] && 8 | BUF[3]; y=BUF[4] && 8 | BUF[5]; angle= atan2((double)y,(double)x) * (180 / 3.) + 180; angle*=10; conversion(angle); //计算数据和显示 DisplayOneChar(2,0,'A'); DisplayOneChar(3,0,':'); DisplayOneChar(4,0,qian); DisplayOneChar(5,0,bai); DisplayOneChar(6,0,shi); DisplayOneChar(7,0,'.'); DisplayOneChar(8,0,ge); if(Mol==0) //判别模式,模式1 { DisplayOneChar(2,1,' '); DisplayOneChar(7,1,' '); DisplayOneChar(8,1,' '); DisplayOneChar(9,1,' '); DisplayOneChar(10,1,' '); DisplayOneChar(11,1,' '); DisplayOneChar(15,1,' '); DisplayOneChar(14,0,'m'); DisplayOneChar(15,0,'1'); 33 if(angle&=225 && angle&675) { DisplayOneChar(3,1,'n'); DisplayOneChar(4,1,'o'); DisplayOneChar(5,1,'r'); DisplayOneChar(6,1,'t'); DisplayOneChar(7,1,'h'); DisplayOneChar(8,1,'e'); DisplayOneChar(9,1,'a'); DisplayOneChar(10,1,'s'); DisplayOneChar(11,1,'t'); } else if(angle&=675 && angle&1125) { DisplayOneChar(3,1,'e'); DisplayOneChar(4,1,'a'); DisplayOneChar(5,1,'s'); DisplayOneChar(6,1,'t'); } else if(angle&=1125 && angle&1575) { DisplayOneChar(3,1,'s'); DisplayOneChar(4,1,'o'); DisplayOneChar(5,1,'u'); DisplayOneChar(6,1,'t'); DisplayOneChar(7,1,'h'); DisplayOneChar(8,1,'e'); DisplayOneChar(9,1,'a'); DisplayOneChar(10,1,'s'); DisplayOneChar(11,1,'t'); } else if(angle&=1575 && angle&2025) { DisplayOneChar(3,1,'s'); DisplayOneChar(4,1,'o'); DisplayOneChar(5,1,'u'); DisplayOneChar(6,1,'t'); DisplayOneChar(7,1,'h'); } else if(angle&=2025 && angle&2475) { DisplayOneChar(3,1,'s'); DisplayOneChar(4,1,'o'); DisplayOneChar(5,1,'u'); 34 DisplayOneChar(6,1,'t'); DisplayOneChar(7,1,'h'); DisplayOneChar(8,1,'w'); DisplayOneChar(9,1,'e'); DisplayOneChar(10,1,'s'); DisplayOneChar(11,1,'t'); } else if(angle&=2475 && angle&2925) { DisplayOneChar(3,1,'w'); DisplayOneChar(4,1,'e'); DisplayOneChar(5,1,'s'); DisplayOneChar(6,1,'t'); } else if(angle&=2925 && angle&3375) { DisplayOneChar(3,1,'n'); DisplayOneChar(4,1,'o'); DisplayOneChar(5,1,'r'); DisplayOneChar(6,1,'t'); DisplayOneChar(7,1,'h'); DisplayOneChar(8,1,'w'); DisplayOneChar(9,1,'e'); DisplayOneChar(10,1,'s'); DisplayOneChar(11,1,'t'); } else { DisplayOneChar(3,1,'n'); DisplayOneChar(4,1,'o'); DisplayOneChar(5,1,'r'); DisplayOneChar(6,1,'t'); DisplayOneChar(7,1,'h'); } } if(Mol==1) //判别模式,模式2 { DisplayOneChar(11,1,' '); DisplayOneChar(15,1,' '); DisplayOneChar(14,0,'m'); DisplayOneChar(15,0,'2'); if(Mol2set==0) angleset= if( angle&(angleset-100) || angle&(angleset+100) ) 35 { Speak=0; DisplayOneChar(15,1,'!'); } else { Speak=1; DisplayOneChar(15,1,' '); } conversionset(angleset); DisplayOneChar(2,1,'s'); DisplayOneChar(3,1,'e'); DisplayOneChar(4,1,'t'); DisplayOneChar(5,1,':'); DisplayOneChar(6,1,qian1); DisplayOneChar(7,1,bai1); DisplayOneChar(8,1,shi1); DisplayOneChar(9,1,'.'); DisplayOneChar(10,1,ge1); } delay(800); } }//计算定位数据和显示36 实物图图6.1 电源正面图图6.2 电源反面图37 图6.3 电子指南针正面图图6.4 电子指南针反面图38 图6.5 设计系统完整图图 6.6 电子指南针模式 1 工作图39 图 6.7 电子指南针模式 2(警告状态)工作图图 6.8 电子指南针模式 2(非警告状态)工作图40
电子指南针设计―汇集和整理大量word文档,专业文献,应用文书,考试资料,教学教材,办公文档,教程攻略,文档搜索下载下载,拥有海量中文文档库,关注高价值的实用信息,我们一直在努力,争取提供更多下载资源。}

我要回帖

更多关于 指明了方向和路径 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信