为了正常的体验网站,请在浏览器设置里面开启Javascript功能!

基于单片机的行车记录仪的设计

2017-09-02 50页 doc 344KB 25阅读

用户头像

is_531654

暂无简介

举报
基于单片机的行车记录仪的设计基于单片机的行车记录仪的设计 基于单片机的行车记录仪的设计 DESIGN OF DRIVING RECORDER BASED ON MICROCOMPUTER 专 业:电子信息工程 姓 名:*** 指 导 教 师: 申请学位级别:学 士 论文提交日期: 学位授予单位:****大学 摘 要 行车记录仪是安装在汽车上的一种装置,他就像飞机上的黑匣子,可以随时记录车辆的行驶状态和在道路情况,也可以时时的提醒开车人的交通状况,让开车人小心驾驶,避免交通事故,在发生一些交通事故时,还可以调取记录仪记录的信息做为交通事...
基于单片机的行车记录仪的设计
基于单片机的行车仪的设计 基于单片机的行车记录仪的设计 DESIGN OF DRIVING RECORDER BASED ON MICROCOMPUTER 专 业:电子信息工程 姓 名:*** 指 导 教 师: 申请学位级别:学 士 论文提交日期: 学位授予单位:****大学 摘 要 行车记录仪是安装在汽车上的一种装置,他就像飞机上的黑匣子,可以随时记录车辆的行驶状态和在道路情况,也可以时时的提醒开车人的交通状况,让开车人小心驾驶,避免交通事故,在发生一些交通事故时,还可以调取记录仪记录的信息做为交通事故发生时的证据,保障受害人的权益。随着社会经济的快速发展,汽车已经成为人们出行必不可少的交通工具,与之而来的交通事故也逐年呈现出上升趋势,如果使用行车记录仪的话,就可以有效的遏止疲劳驾驶、车辆超速等交通违章行为,避免一些不必要的灾难。因此,行车记录仪的出现极大的降低了交通事故的发生率。 就目前来说,无论是国内还是国外,对记录仪的研究还都没有达到一个很成熟的地步,或者是技术水平不够,不能够得到让人满意的效果,或者是费用过高,不能有一个让大众可以接受的产品价格,因此现在记录仪还没有普及到每一辆汽车中,只是在一些长途客车上少量的使用,因此对记录仪的研发还有很长的一段路要走。本毕业设计所设计的行车记录仪不追求市场上那种强大的功能,它基于单片机进行设计。通过GPS模块的天线接收数据,将数据通过GPS模块处理后传入单片机中,在单片机中将GPS数据解析为可识别的数据,然后连接液晶显示将信息显示出来。可以实时的显示车辆的位置信息与车辆的行驶状态。本文中详细介绍了单片机的各个引脚功能以及如何实现和其他设备之间的通信。对于GPS模块,详细的介绍了GPS模块的工作原理以及如何对接收到的信号进行解析,最后详细的介绍了如何借助软件对解析完的数据进行处理并在液晶屏中显示,以及如何通过键盘切换液晶屏显示的内容,最终实现记录仪所要完成的功能,即实时记录车辆的位置与行驶状态。 关键字:行车记录仪; GPS模块; 黑匣子 ABSTRACT Car driving recorder is a device which is mounted in the car, just like the black box in the airplane, not only can which record the car‘s running state and the problem coming from the road, but also can constantly remind the driver noticing the traffic condition, let the driver to drive carefully, in order to avoid the traffic accident. in the event of traffic accidents, It can also get recording information obtaining from the recorder for traffic accident‘s evidence, safeguard the rights of the victims. With the rapid development of social economy, the automobile has become the people's travel indispensable communication tool, with the traffic accident also showed a rising trend year by year, if the use of the recorder, you can curb fatigue driving, speeding and other traffic violations effectively avoid some unnecessary disaster, therefore, vehicle traveling data recorder has greatly reduced the incidence of traffic accidents. At present, whether domestic or foreign, study of the recorder are still not reached a very mature stage, whether technical level is not enough, can not obtain satisfactory results or the cost is too high, can not let the public to accept the price of the product, so now recorder has not spread to every car, just in the use of a small amount of long-distance bus, so the study towards the recorder has a long way to go.In this article, mainly introduces the design of vehicle traveling data recorder based on MCU. Data is received by the antenna of the GPS module and then it through the GPS module was introduced into the MCU. In the micro-controller, the GPS data is translated for the identifiable data, then display information in the LCD.It can display the position information and the vehicle driving state of vehicle in real-time. This paper introduces in detail the communication between MCU each pin function and how to achieve the communication with other equipments. For the GPS module, describing in detail the working principle of GPS module and how to translate the received signal to the identifiable data.Finally a detailed description of how to use the software to process the data parsed and displayed on the LCD screen, and how to use keyboard switching liquid crystal display screen content, finally realizes the recorder to complete the functions, real-time record the position of the vehicle and driving state. Keywords:Car driving recorder; GPS module; the black box 目 录 第一章 绪论 ......................................................................................... 1 第一节 行车记录仪的简介及研究的目的和意义 ............................... 1 第二节 国内外在该方向的研究现状 .................................................. 2 第二章 行车记录仪系统的总体设计........................................... 4 第一节 行车记录仪的主要功能与系统组成 ....................................... 4 第二节 主要控制芯片的选择 .............................................................. 4 第三章 行车记录仪系统的硬件设计 .................................................. 7 第一节 单片机模块.............................................................................. 7 第二节 GPS模块 ............................................................................... 11 第三节 存储模块 ............................................................................... 18 第四节 液晶显示模块的硬件设计 .................................................... 19 第五节 键盘模块 ................................................................................. 20 第四章 行车记录仪系统的软件设计 ................................................ 22 第一节 编程语言的选择 ...................................................................... 22 第二节 主程序的设计 ........................................................................ 23 第三节 GPS接收模块的软件设计 .................................................... 24 第四节 数据存储模块的软件设计 .................................................... 25 第五节 键盘和液晶显示模块的软件设计......................................... 26 结 论 ................................................................................................... 27 致 谢 ................................................................................................... 29 参考文献: ........................................................................................... 30 附 录 ................................................................................................... 31 天津科技大学2013届本科生毕业设计 第一章 绪论 近年来随着我国科技的发展以及国民经济的快速提高,道路交通事故逐年呈现出上升趋势,尤其是长途客运车辆的重、特大道路交通事故频频发生,给国家和人民生命财产带来了巨大损失。如果使用记录仪的话, 就可以有效遏止疲劳驾驶以及车辆超速等交通违章行为,避免一些不必要的灾难。除此之外,汽车行驶记录仪在保障车辆行驶安全以及对道路交通事故的分析鉴定等方面都具有重要的作用。 第一节 行车记录仪的简介及研究的目的和意义 在百度百科中,行车记录仪的定义是这样的一个东西,它可以说是使用在汽车上的黑匣子,它由汽车发动机提供能源,通过高清摄像镜头摄影,可以随时实现录像录影的功能,记录车辆行驶过程中的影像及声音,当意外发生时,可以提取记录仪记录的信息做为交通事故的证据,保障驾驶人自我权利。汽车在安装行车记录仪后,就能够用它来记录汽车行驶全过程中的视频图像和声音,记录仪内部还配置有冲击传感器,我们可以设置冲击力敏感度的值,当外界对汽车造成的冲击力大于所设置的值时,导致该冲击力的现场数据就会被记录下来,调取这些数据就可以为交通事故提供证据。那些喜欢自己驾车旅游的朋友,还可以用它来记录旅游路上的所见所闻。一边开车一边录像,同时把时间、速度、所在位置都记录在录像里,相当于飞机上的―黑匣子‖。此外记录仪也可以被用作家庭DV来拍摄我们生活中的点点滴滴,也可以做为家用监控使用。平时也还可以做停车监控。 近年来随着我国国民经济的快速发展,人民都过上了好的生活,都拥有了属于自己的汽车,随之而来的也就导致了道路拥堵,交通事故频繁发生等交通问,并且事故发生率呈现出逐年递增的趋势,这其中以大型长途客运汽车为甚。频繁发生的重大交通事故给国家和人民生命财产带来了巨大损失。如果使用记录仪的话,就可以有效的遏止疲劳驾驶、车辆超速等交通违章行为,避免那些不必要的灾难。随着科学技术的发展,现在的行驶记录仪的功能已远远超过单纯事故记录功能,目前国内外使用的记录仪一般都兼有多种功能,例如事故记录功能和行驶记录仪的功能。从目前的发展来看,他一定会与汽车的其他电子系统(如GPS定位系统、GSM数字移动通信系统、图像监控识别系统等)相结合,向着大容 [1]量、模块化、系统化、数据无线传输和数据集成处理的方向发展。借助强大的信息网络,最终使它成为一种对车辆运行状况进行实时的信息记录、监控并且为车辆提供科学、合理调度的管理系统,在确保现代道路交通安全运输和高效物流 1 天津科技大学2013届本科生毕业设计 动态营运管理上起到了不可或缺的重要作用。 虽然行车记录仪以后有很大的发展前景,但是就目前来看,行车记录仪的发展还存在很多的问题。例如产品的质量问题,售后服务问题以及功能不统一问题等。目前安装的记录仪大多都是为运输企业的内部管理服务,完全无法满足交警执法的需要。而且一些汽车司机们对安装行驶记录仪抱有很大的抵触情绪,认为安装记录仪会对自己产生很大的约束,抵触心理特别的强烈,并没有意识到记录仪对行车安全的重要性。从执行标准上来讲,现有《汽车行驶记录仪》国家标准只是推荐性使用标准,关于记录仪的生产标准、产品质量认证、安装使用范 [1]围、违规处罚等都没有明确的、具有法律约束力的规定。在价格上,现在市场上出售的行车记录仪价格普遍较高,从15000元到50000元不等,大部分用户都无法承受。 因此对汽车行驶记录仪的研究还有很长的路要走,如何制造出符合大众要求,可以满足各行业的人需要的好的产品,还需要我们很多人的努力。 第二节 国内外在该方向的研究现状 1.国外有关 在国外,由于汽车普及的比较早,大量的交通事故问题也就更早的被意识到。为了能够降低汽车发生交通事故的频率、驾驶人的危险系数与国家承受的损失,人们想出了各种办法。在这样的情况下,行车记录仪的概念诞生了。最先推出记录仪产品的地方是欧洲,那时的记录仪主要采用机电模拟的方式实现,即机械式汽车行驶记录仪。采用这种技术生产的记录仪使用了很长一段时间,直到2000年欧盟推广使用的汽车行驶记录仪仍然大多采用这种技术。这种记录仪使用起来特别不方便,以纸盘机械式汽车行驶记录仪为例,要想使用这种记录仪必须要人工填写姓名、行驶里程等,非常繁琐。除此之外,这种产品价格还特别昂贵,维护费用也很高。随着科技的发展和社会的进步,欧盟开始制订数字式记录仪的技术标准和法规,并规定从2004年8月起,那些新注册的机动车必须安装这种数字式的汽车行驶记录仪,从那时起,传统的纸盘试记录仪就慢慢的退出了人们的生活。目前较为常见的电子式记录仪包含记录仪、显示器、数据采集处理卡、传感器以及PC机处理软件等几个部分,其中传感器用来采集数据,显示器用来显示实时的道路信息与车辆信息,数据采集处理卡用来存储行驶记录仪采集到的数据,PC处理软件用来对收集到的数据进行图像处理和事故分析。 2001年8月,日本某科研小组研制出一种极其先进的汽车行驶记录仪,它可以记录交通事故发生时的驾驶数据。它通过传感器记录速度、方向角度、刹车或急转弯使汽车达到的加速度等信息,当这些数据超过一定的界限时,便判断为 2 天津科技大学2013届本科生毕业设计 ―事故‖,并将―事故‖发生前十秒和后五秒间的各种数据自动记录入磁盘中。同时采用图像处理技术,利用相机自动记录―事故‖发生前十秒和后五秒这段时间内从驾驶席上能看到的事故场面。但是这种基于传感器和图像处理技术的汽车行驶记录仪价格特别昂贵,因此这种产品还在萌芽中就被扼杀了。 2.国内相关 我国对行车记录仪的研究和实践相对较晚,是从20世纪80年代末期才开始的。最初设计的产品,使用磁带来作为存储介质,实时的记录车辆走过的路线。但这项发明在当时不是很成功。随着社会的进步,汽车在我们社会越来越普及,交通网也就变得原来越复杂,以前的行车记录仪根本无法满足大众以及交警执法的要求。为了适应交通管理和行车安全的需要,行车记录仪的功能在其发展过程中也随着需要进行着功能上的扩展,使它并不仅仅只局限于事故分析,在车辆监控、车辆状态记录及报警、交通宏观控制、车辆管理等方面都也能起到很大的作用。 相比国外的机械式行车记录仪,我国的产品均为数字式的产品,能够实时监测记录车辆行驶的各种状态信息并且还可以有效准确地鉴别驾驶员身份,同时还具备超速报警功能,串口通信功能以及打印输出功能。并且都具备体积小巧、价格合理、无需专人维护且使用方便等特点。作为智能交通系统的一个组成部分,行车记录仪发展迅速,目前已经在物流、车辆出租和长途运输等领域开始应用。我国公安部门已经明令要求所有长途运输客车必须安装行车记录仪。 到目前为止,虽然国内记录仪的市场已经初具规模,但是还没有统一的标准来对记录仪的生产进行管理,比如各种记录仪产品在数据结构、数据格式、数据传输方式等方面还是有较大差异的,这些都不利于实现对记录仪的大面积推广和规范管理。而且现在的记录仪产品大多都采用的8位或者16位单片机做为主处理器,这也将极大地限制记录仪系统的接口扩展,功能的完善以及实时性能的提高。因此在我国对于记录仪的研发道路还有很长的路要走。 3 天津科技大学2013届本科生毕业设计 第二章 行车记录仪系统的总体方案设计 行车记录仪的主要功能与系统组成 第一节 本文设计的行车记录仪所具有的主要功能是利用GPS模块接收数据,通过具有处理功能的芯片的处理,可以把数据显示到液晶屏上,做到实时记录车辆的位置信息和车辆行驶的状态信息。并且可以将数据记录到存储器中保存起来,当用到时可以随时的调用出来。根据系统的主要功能大致可以将这个系统分为以下几个部分: 1.GPS模块,整个行车记录仪最重要的模块之一,用来接收来自GPS卫星的数据,并可以将数据进行处理变成处理器可以识别的数据。 2.中央处理模块,整个行车记录仪的核心部件,用来处理来自GPS模块信号的模块,并将数据进行进一步的处理,使之在液晶屏中显示出来,并且将数据转存到存储模块中保存起来,是最重要的模块 3.液晶显示模块,可已将接收到的数据以文字的格式在屏幕上显示出来 4.键盘模块,用来控制液晶屏翻页,显示收到的不同的信息 5.供电模块,用来提供整个设备正常工作的电源 根据所要用到的模块,可以得到整个设备的大致框图: 图2.1 系统整体框图 第二节 主要控制芯片的选择 控制芯片是整个行车记录仪系统的核心,是最重要的部分,本次设计的要求是基于单片机的行车记录仪的设计,所以控制芯片必须是单片机。虽然选定了控 4 天津科技大学2013届本科生毕业设计 制芯片为单片机,但是单片机的种类多种多样,迄今为止,市场上出售的单片机产品的种类有60多类,每一类都包含十多个品种。如果按照CPU对数据处理位数来分的话,单片机通常可以分为4位单片机,8位单片机,16位单片机和32位单片机。 单片机的位数不同,实现的功能以及试用的场合也就不一样,虽然我们可以理解为单片机可以处理的位数越高单片机越好,但在不同的场合我们用最适合的单片机才是性价比最高的选择。4位单片机是处理位数最少的一种单片机,它的的控制能力很弱,CPU一次可以处理的二进制数位数仅仅只有四位。这类单片机在小型的计算器、简单的智能模块以及家电控制器中应用的比较广泛。由于处理位数太少,并不能够对本次毕业设计中需要处理的数据进行很快很好的处理,因此在本次设计中我们不采用它。 8位单片机是指一次可以处理八位二进制数的微型控制器,它的的控制功能较强,品种也最为齐全。和上面提到的那款相比,它的存储器可以存储大量的内容,可寻址的范围也特别广,除此之外它还有更多的中断源、I/O口(并行)和定时器/计数器,以及可以进行全双工通信的的串行口。 指令系统也比较完善,该种单片机的指令系统不仅增设了乘除指令,为了使程序设计更加简单,可以实现更多的功能,它还增加了比较指令。为了使单片机适应更多的场合,还研制出了好多增强型单片机,这样的单片机不仅增加了A/D和D/A转换功能,还集成有定时器/比较寄存器、看门狗定时器、BUS控制部件和晶体振荡电路等功能。由于这种类型的单片机片内资源丰富并且有强大的处理功能,所以在工业控制、智能仪表、家用电器和自动化办公系统中应用的比较广泛。 16位单片机是在20世纪80年代才慢慢的发展起来的。这类单片机的CPU是16位的,运算速度普遍比8位的单片机要高,有的16位单片机寻址能力可以达到1MB,片内含有A/D和D/A转换电路,并且支持像C语言这类的高级语言。这类单片机的应用领域和8位单片机差不多,都是用在工业控制,自动化办公系统以及工程控制系统中,他们比8位单片机具有更好的性能,可以完成一些8为单片机不能完成的东西。 32位单片机是指一次可以处理32位二进制数的微控制器,是单片机中最优秀的产品,具有极快的处理速度。近年来,随着科技的发展,32位单片机的市场前景被广泛看好。例如ARM单片机,作为一款32位的微处理器,ARM与普通的8位单片机相比,其处理效率要高很多很多。一般的情况下人们谈到ARM时经常会把它和嵌入式操作系统联系在一起,因为利用ARM实现嵌入式是一个非常好的选择方案。 虽然ARM的各种性能都非常好,16位单片机的性能也要高于8位单片机,但是如果在本次设计的行车记录仪系统中使用16位单片机或者更好的ARM单 5 天津科技大学2013届本科生毕业设计 片机完全是一种资源的浪费,因为一个8位的单片机就可以完全满足开发的要求了。而且平时我们对于8位的单片机了解得比较多,上手起来也非常容易,所以在本次设计中8位的单片机是最好的选择。目前流行的8为单片机很多例如AVR单片机,PIC单片机和我们最熟悉的51系列单片机,在这几个品种中,每种单片机也都有各自的优点: C51单片机是51单片机和C语言程序设计的简称,在大学阶段我们都对51单片机有一定的了解,所以在学习51系列的其它单片机时也会很容易上手因此,此类单片机可以作为首选。 PIC单片机种类很多,他的优点是比其它的单片机(例如51单片机,AVR单片机)都要稳定一些,所以这类单片机一般用在社会上对稳定性的要求比较高的场合。 PLC单片机运行很稳定,但是和他的稳定性相对应的就是它的价格普遍很高,它的核心其实也可以说就是一个51单片机,区别就在于它在51单片机的基础上又加了很多的隔离器,这样在应用过程中就不会有像单片机那样多的干扰,PLC的应用领域一般是在强电设计方面,例如工控行业。 AVR是ATMEL公司的一个系列的产品,其性价比较高,如果我们设计的产品对稳定性没有太大的要求的话,这款单片机算是一个比较不错的选择,它拥有哈佛结构和RISC,具有处理功能强、效率高等特点。 了解了各类单片机的特点与各自具有的优点,结合自己的实际选择一款单片机就变得很容易了。因为在大学阶段,主要学习的单片机就是89C51单片机,而且C语言也是大学中必修的一门课程,这两样东西都是很熟悉的东西,而且C51系列单片机在性能上也完全可以满足开发所需要的要求,所以C51系列单片机是最佳的选择。因此在这次毕业设计中我选择的是STC公司生产的90C51系列的单片机。STC单片机完全兼容51单片机,并有其独到之处,其抗干扰能力极强,保密性也很不错,功耗低,可以进行远程升级,内部还配置有MAX810专用复位电路,价格也较便宜,性价比非常高,最重要的是上手容易,而且拥有不错的性能。 6 天津科技大学2013届本科生毕业设计 第三章 行车记录仪系统的硬件设计 单片机模块 第一节 1.1STC90C516RD+系列单片机简介 STC90C516RD+系列单片机是高速、低功耗的单片机,指令代码对传统的51系列单片机完全的兼容,并且还有可供选择的两种时钟周期(12时钟/机器周期以及6时钟/机器周期),内部配置有专用的复位电路MAX810,时钟频率在12MHz以下时,复位脚可直接接地。 1.增强型6 时钟/机器周期,12时钟/机器周期; 2.工作电压:3.7V-5.5V/2.4V-3.8V; 3.工作频率的范围:0至40MHz,相当于一般的51系列的单片机 0至80MHz的频率范围; 4.用户应用程序空间 4K/6K/7K/8K/10K/12K/13K/16K/32K/40K/48K/56K/ 61K/字节; 5.片上集成 128/256/512字节的RAM; 6.通用I/O口,复位后的P1/P2/P3/P4 口全都是准双向口(相当于一般的51系列单片机的I/O口); 7.内含ISP/IAP; 8.EEPROM; 9.看门狗定时器; 10.内部集成MAX810专用复位电路,外部晶体12M以下时,可以省去外部的复位电路,只要把复位引脚接地即可; 11.共3个16位定时器/计数器,当需要时我们可以把定时器0当成2个8位定时器使用,这样就可以扩展为四个定时器; 12.4路外部中断,分别由下降沿触发和低电平触发; [2]13.通用异步串行口(UART),还可用定时器软件实现多个UART; 14.工作温度范围:0-75?/-40-+85?。 1.2 STC90C51系列单片机的内部结构 STC90C51系列单片机的内部结构框图如下图所示。STC90C51系列单片机中包含很多种模块,像中央处理器模块,程序存储器模块,数据存储器模块,定时/计数器模块,UART串口,I/O接口,EEPROM,看门狗模块等。这个系统几乎包含了数据采集和控制中所需的所有单元模块,可以称得上是一个完整的片上系统。STC90C51系列单片机的内部结构框图如下: 7 天津科技大学2013届本科生毕业设计 图3.1 STC90C51RD+系列内部框图 1.3 STC90C51系列单片机引脚说明 VCC:供电电压。 GND:接地。 P0口:P0口为一个8位双向I/O口。当P0口的管脚输入1时,显示高电平输入。当P0口被定义为数据/地址的低八位时还可以用于外部程序/数据存储器。当我们在用单片机做FIASH编程时会输入源码,进行校验时会输出源码,这时我们就可以从P0口进行输入和输出。如果这样做的话P0口外部必须接上拉电阻。 P1口:P1口也是一个8位双向I/O口。当P1口的被输入1时,该引脚会被置为高电平,此时P1为信息的输入端口,当P1口被置为0,则该引脚被置为低电平时,此时成为信息的输出端口。在FLASH编程和校验时,P1口主要是作为低八位地址的接收端口。 P2口:P2口为8位双向I/O口,当给P2口输入―1‖时,该引脚被置为高电平,此时它作为输入端口。当把P2口做为外部的程序存储器或数据存储器进行存取的接口时,此时P2口输出的为地址的高八位数据。如果对外部的数据存储器进 8 天津科技大学2013届本科生毕业设计 行读写操作时,P2口输出内容为它的特殊功能寄存器中的值。当P2口用在FLASH编程和校验时,他接受到的是数据高八位的地址信号和控制信号。 P3口:P3口也是双向I/O口,当P3口被写入―1‖后,该端口被置为高电平,用于数据的输入。 P3口除了上面提到的功能外,还可以作为STC90C51的一些特殊的功能接口,例如有以下备选功能: P3.0 (RXD口)和P3.1 (TXD口)相对应,他们可以分别作为串行口的输入和输出(串行输入口); P3.2 和P3.3相对应,他们可以分别作为/INT0和/INT1,即外部中断0和外部中断1的接口; P3.4 和P3.5是一组相对应的接口,他们可以分别做为外部T0和T1的输入端口(T指的是定时器); P3.6 和P3.7相对应,他们分别是外部数据存储器的读写选通接口,其中/WR表示写选通,/RD表示读选通; P3口的另外一种功能就是可以为闪烁编程和编程校验接收一些控制信号。 RST为单片机的复位输入引脚。 ALE/PROG:当访问外部存储器时,地址锁存对低位的地址字节有效。在用FLASH进行编程的时候,这个引脚为脉冲的输入引脚。 /PSEN:外部程序存储器选通信号。在外部程序存储器取地址的时候,每个机器周期该引脚有效两次。 /EA/VPP:该引脚为低电平时,不管内部是否有程序存储器,都是外部程序存储器(低值范围从0000H到FFFFH)工做。只有当该引脚为高电平时,内部程序存储器才开始工做。 XTAL1和XTAL2可以分别作为反向振荡放大器的输入和输出端,其中前者可以作为内部时钟工作电路的输入端口。 振荡器特性: 我们可以把这两个振荡器配置为片内振荡器。如果我们采用外部时钟源驱动器件的话,我们应该把XTAL2引脚悬空。因为给振荡器内部输入时钟信号时会通过一个二分频的触发器模块,因此这个对外部时钟信号的脉宽没有什么要求,但是需要注意的是,我们必须得保证输入信号的脉冲的高低电平所要求的宽度。 1.4 时钟电路设计 时钟电路就像整个单片机系统的心脏部分,由他来控制整个芯片的工作,CPU就是通过复杂的时序电路完成不同的指令功能。单片机的外部晶振电路如图3.6所示: 9 天津科技大学2013届本科生毕业设计 图3.2 外部晶振连接图 1.5 复位电路设计 复位是将单片机做重新初始化的操作。为了使CPU和系统中其它部件都处于一个确定的初始状态,单片机在启动运行时,都需要先进行复位操作,以便能有一个统一的工作状态,因此复位是一步很重要的操作,但是大多数的单片机不具备自动复位的功能,虽然在本次毕业设计中所用到的单片机在晶振频率为12M以下时可以直接将复位引脚接地进行复位,但是这次用到的单片机晶振的频率为12M,所以不能直接进行复位,所以必须配合相应的外部电路才能实现。单片机的上电自动复位电路如图3.7所示: 图3.3 上电自动复位电路 10 天津科技大学2013届本科生毕业设计 第二节 GPS模块 1.1GPS简介 GPS全称为Global Positioning System全球定位系统,他由空间部分,地面控制部分和用户设备部分三部分组成。 GPS的空间部分是由均匀分布在6个轨道面上距离地球表面两万多米的24 颗卫星组成。除此之外,在轨道上运行的还有另外四颗作为备份的卫星。这24颗卫星分布均匀,无论何时都可以保证在全球的各个角落观测到4 颗以上的卫星,以便能够随时保持良好的定位服务。这就保证了随时随地的进行连续的全球定位导航工作。GPS向地面发射两组电码,P码(Precise Code 10123MHz)和C/ A 码( Coarse/ Acquisition Code11023MHz)。P 码频率较高,因此有很强的抗干扰能力和准确的定位精度,但是它受到了美国军方的管制。由于被设定了密码,民间无法解读,所以它主要为美国的军方服务。C/ A 码则不同,C/A码为了开放给民间使用被人为的采取措施降低了精度。 地面控制部分由三部分组成,他们分别是主控站,全球监测站和地面控制站。主控制站位于美国科罗拉多州,主要任务是负责收集由卫星传回之讯息。监测站装配有精密的铯钟和能够连续测量到所有可见卫星的接受机。它们将从卫星接收到的观测数据(包括电离层和气象数据)经过初步处理后传送到主控站。主控站再从各监测站收集数据,根据这些数据计算出卫星的轨道和时钟参数,然后将结果送给地面控制站。当卫星运行至地面控制站上方时,控制站将这些导航数据信息及主控站指令发送给卫星。这种工作每天对每个卫星执行一次,并在卫星离开主控站作用范围之前进行最后的信息注入。假如某一地面控制站发生了故障,那么在卫星中预存的导航信息还是可以使用一段时间的,但是随着时间的增长,卫星的导航精度也会逐渐的降低。 所谓的用户设备部分其实就是一种信号接收设备(即GPS信号接收机)。它的主要功能就是可以捕获到卫星,并追踪这些卫星在宇宙空间中的运行。当它接收到被他追踪的GPS通讯卫星所发射出的信号之后,就可以测量并计算出接收 [3]天线至通讯卫星之间的伪距离和距离的变化率,通过这些数据来解调出通讯卫星运行的轨道参数等有效数据。将接收到的这些数据输入到该设备中的微处理计算机中,根据定位解析算法进行定位计算,就可以计算出用户所在地理位置的经度、纬度、高度、海拔、时间、速度等各种我们需要得到的信息。完整的GPS用户设备是由硬件部分、软件部分和GPS 数据处理后的软件包构成的。GPS 接收机又由天线部分和接收部分组成。接收机一般采用双电源进行供电,即机内和机外电源。机内电源的作用在于当你在更换外电源时不至于中断接收机对卫星的连续观测。在用机外电源时,机外电源会给机内电池进行充电。关机后,机内 11 天津科技大学2013届本科生毕业设计 电池也会继续为RAM存储器供电来防止存储在RAM存储器中的数据丢失。目前各种类型的接受机体积被做的越来越小,重量也越来越轻,越来越便于用在野外观测中。 1.2 GPS 接收机的性能与结构 GPS 卫星全部都采用展频技术来向地面发射信号,两个载频发射(L 1波长为19 cm,频率f 1= 154×10. 23MHz;L 2波长为24 cm,频率f 2= 120×10.23MHz) 的信号传输速率为50 Hz,调制方式为二相键控(BPSK)调制,且信号被调制在伪随机码上。GPS的伪随机码分为P码、C/A码和Y码三种: ?P 码称为精码,一般用在精密定位服务上。它的周期长为7 d,码频率为10.23MHz,既然可以称为精码,因此无论是定位还是时间速度等都有很高的精度。它的时间精度已经超越了纳秒的水平为100 ps,定位精度为16m,速度精度也达到了0.1 m/s。 ?C/A 码被称为粗码,也可以称他为标准定位服务码。它具有周期短频率低等优点,他的周期仅为1 m s;码的频率也仅有1.023MHz,它的一个周期中有1023 个码位。由于它的搜捕时间很短,所以特别适合用于快速提供精度不高的定位信息。定位精度为40m。 ?Y 码和P 码相类似,都属于精密定位服务码。但是它的编码比P 码复杂得多。 GPS最开始的用处就是用在美国军方的军事活动,军事科研等方面,虽然后来对民间开放,但是美国军方对GPS 的使用范围进行了一些控制,只有C/A 码和广播星历向全球开放。虽然美国对GPS的C/A码做了开放,但又不是绝对的开放,他们对C/A 码又采用了SA 方式,限制了C/A 码的精度,使得水平定位的精度变为一百米的概率为百分之九十五。美国在GPS 系统中采用的SA 措施,对用户是个很大的限制,为了针对这种限制,使这种限制降到最低,又发展了称为DGPS 的差分GPS 技术。由于采用差分编码技术,使得测量的定位精度得到了极大的提高,因此在大地的实际测量中获得了非常广泛的应用。 GPS 定位的基本原理实际上是比较简单的。由于每个地方都能监测到四颗卫星,这4 颗卫星同时向GPS接收机发射时钟信号,我们将它取名为D t,GPS接收机将收到的时钟信号与自身的标准时钟进行对比,就可以得出时钟偏差,这 8就是卫星信号传播所需要的时间,我们将它乘以3*10m/s,就可以计算出卫星信号传播的距离。于是我们得到这样的一个简单的多元方程组:(A i - U a ) L + (Bi - U b )L + (C i - U c )L = (R i - Cb)L这里A i、B i、Ci 分别代表四颗卫星的位置参数,由GPS 卫星以50 Hz 的速率向全球不间断广播。U a、U b、U c 为接收机的位置。R i 即为传播距离:R i= c×D ti。Cb 为用户的标准时钟偏差参数。于是得到含有四个未知数U a、U b、U c、Cb的四个方程。一般来说这样的方程都有 12 天津科技大学2013届本科生毕业设计 唯一的解,由此我们就可以得到准确的位置参数信息。作为GPS 用户部分的主要部件—GPS 接收机,主要是用来接收和处理来自GPS卫星发送的位置信息。它主要由主机天线、运算单元、输出通道等三个大部分构成。主机的核心是低噪 [4]放大器、信道电路、中央处理器、存储器等模块;我们可以借助软件将卫星信息进行接收、采集、放大、识别、存储、处理等操作以便能够输出有用的定位信息、速度信息和时间信息。 在本次毕业设计中使用的GPS模块采用瑞士U-BLOX公司的NEO-5Q主芯片,此芯片为多功能独立型GPS模块,它以ROM为基础架构,具有成本低,体积小等众多优点。在接收端采用U-BLOX公司最新的Kick-Start微弱信号攫取 [5]技术,无论天线尺寸多大,设备所处的位置如何,只要可以接收到GPS信号,都可以确保采用此模块的设备能够有最佳的初始定位性能并进行快速定位。 1.3GPS信号的数据解析 GPS上电后,每隔一定的时间就会返回一定格式的数据,数据格式为: $信息类型,x,x,x,x,x,x,x,x,x,x,x,x,x 每行开头的字符都必须是‗$‘,紧接着是信息类型,最后面的部分是数据,每个数据以逗号分隔开。一行完整的数据如下: $GPRMC,080655.00,A,4546.40891,N,12639.65641,E,1.045,328.42,170809,,,A* 60 信息类型一共可以分为以下几种类型: GPGSV:可见卫星信息 GPGLL:地理定位信息 GPRMC:推荐最小定位信息 GPVTG:地面速度信息 GPGGA:GPS定位信息 GPGSA:当前卫星信息 在本次的毕业设计中我们只用到了GPRMC和GPGGA的信息,因此在这里我们只对GPRMC和GPGGA的信息进行数据解析的介绍。 (1)GPRMC数据详解 GPRMC数据信息的格式为: $GPRMC,<1>,<2>,<3>,<4>,<5>,<6>,<7>,<8>,<9>,<10>,<11>,<12>*hh 其中标号―<1> ‖表示UTC时间,时间格式为:hhmmss(时分秒); 标号―<2>‖表示GPS的定位状态,其中A表示有效定位,V表示无效定位; 标号―<3>‖表示纬度信息,格式为:ddmm.mmmm(度分)(前面的0也将被传输); 标号―<4>‖表示纬度半球,其中包括south和north; 13 天津科技大学2013届本科生毕业设计 标号―<5>‖表示经度,其格式为:dddmm.mmmm(度分)(前面的0也将被传输); 标号―<6>‖ 表示经度半球,其中包括east和west; 3标号―<7>‖表示地面速率(0.0~9.999*10节,前面的0也是会被传输的); 标号―<8>‖表示地面航向(0.0~360度,参考基准为地磁北极,同上); 标号―<9>‖表示UTC日期,其日期格式为:ddmmyy(日月年); 标号―<10>‖表示磁偏角(0~180度,前面的0跟上面的数据一样会被传输); 标号―<11>‖表示磁偏角方向,其中包括east或west; 标号―<12>‖表示模式指示(其中A表示自主定位,D代表差分,E表示估算, N代表数据无效); 解析内容: 1. GPS上接收到的时间格式为格林威治时间,即世界时间(UTC),因此我们需要把它转换成北京时间(BTC)以便方便我们使用,BTC和UTC的时差为8个小时,因此我们要在这个时间基础上加8个小时才是北京时间。 2. 定位状态,在接收到有效数据之前,这个位为―V‖,后面没有数据,当接到有效数据之后,这个位就变为了―A‖,这样后面的数据才开始变为有效数据。 3. 纬度,把纬度转换成度分秒的格式是很有必要的,因为只有这样我们才能看得懂。他的计算方法如下: 如接收到的纬度是:4556.31981 4556.31981 / 100 = 45.5631981可以直接读出纬度的度数:45度 (45.5631981–45)* 60 = 27.946356即27分 (27.946356–27)* 60 = 50.73187即50秒 经过计算得到的纬度的数值:45度27分50秒。 4. 南北纬,它包括两种值:north and south; 5. 仿照上面纬度的计算,我们就可以得到经度的数值; 6. 东西经,这个位也有两种值east(东经)和west(西经); 7. 速率,这个速率单位是海里/时,为了把它转换成标准单位千米/时,我们应该知道换算的比例,因为1海里 = 1.85km,所以我们需要把通过计算得到的速率全都乘以1.85才行,这样就可以得到标准的速率; 8. 航向,指的是我们行驶的方向和正北的夹角; 9. 日期,GPS中的日期为准确日期,因此不需要转换。 GPGGA数据详解 GPGGA的数据格式为: $GPGGA,<1>,<2>,<3>,<4>,<5>,<6>,<7>,<8>,<9>,M,<10>,M,<11>,<12>*xx< CR> 14 天津科技大学2013届本科生毕业设计 $GPGGA:起始引导符及语句格式说明(本句为GPS定位数据); 标号―<1>‖表示 UTC时间,它的数据格式为hhmmss.sss; 标号―<2>‖表示 纬度,它的格式为ddmm.mmmm(如果数据的第一位是零也将会被传送); 标号―<3>‖表示 纬度半球,包括N和S(北纬和南纬); 标号―<4>‖表示 经度,其格式为dddmm.mmmm(如果数据的第一位零也将会被传送); 标号―<5>‖表示 经度半球,它包括E和W(东经和西经); 标号―<6>‖表示定位质量指示,0表示定位无效,1则表示定位有效; 标号―<7>‖表示使用卫星的数量,从00到12(第一个零也将被传送); 标号―<8>‖代表水平精确度,数值范围为0.5到99.9; 标号―<9>‖表示天线距离海平面的高度,高度值的范围从-9999.9到9999.9米 M 代表单位米; 标号―<10>‖表示大地水准面高度,高度值的范围也是从-9999.9到9999.9米 M 代表单位米 标号―<11>‖表示差分GPS数据期限(RTCM SC-104),最后设立RTCM传送的秒数量; 标号―<12>‖为差分参考基站标号,数值范围从0000到1023(如果首位为0也将会被传送)。 1.4 GPS模块工作原理 GPS模块原理图如下所示: 图3.4 主芯片原理图 15 天津科技大学2013届本科生毕业设计 图3.5 TTL电平接口 NEO-5Q的引脚功能: 1、VCC 主电源供电引脚。GPS 接收机对工作电源的纹波较为敏感。最大电源纹波峰峰值不得超过50mV。 2、V_BCKP 为备用电池连接引脚。在VCC主电源掉电的期间内可以继续维持实时时钟和备用RAM的供电。这样的好处就是可以使接收器在温启动、热启动后可以恢复并保持配置设定。如果备用电池未接入,那么在上电时接收器将执行一个冷启动。如果没有后备电池,将该引脚应该接VCC或者GND。(注:GPS 的热启动 冷启动和温启动) GPS开机定位分为冷启动、温启动和热启动三种方式。 冷启动:以下几种情况开机均属于冷启动方式。初次使用时的启动;电池耗尽导致星历信息丢失时的启动;关机状态下将接收机移动1000公里以上距离时; [6] 温启动:距离上次定位的时间超过两个小时的启动; 热启动:距离上次定位的时间小于两个小时的启动。 有时候如果机器有软件问题,需要进行冷启动,冷启动可以使用GPS-viewer进行。 3、VDD_USB USB接口电源,该引脚电压范围:3.0-3.6V。如USB未使用,该引脚必须连接到GND。 4、电源功耗模式 U-BLOX5 提供两种电源模式:最大性能模式和经济模式。 5、EXTINT 外部中断引脚,用于低功耗模式唤醒功能。 6、系统监控 U-BLOX5 GPS和伽利略接收器提供系统监控功能,这允许嵌入式处理器的操作及关联外围设备的监督。这些监控功能作为UBX协议的部分被输出。Class ―MON‖。 7、接口 A、UART 1 (RxD1/TxD1)是默认的串行接口。支持数据速率:4.8 k Bit/s to 16 天津科技大学2013届本科生毕业设计 115 K Bit/s.。信号电平:CMOS 0V 到VCC(注:RxD1 有固定输入电压阀值(input voltage thresholds),独立于VCC,如引脚不用,可以将之进行悬空处理。) B、USB 在主机的USB接口和接收器的VDD_USB引脚间必须接入一个LDO(输出3.3v)。接收器以USB自供电设备方式使用时,基本不耗电。但在总线供电方式下,电流最大约150mA左右。在这两种方式间切换,LDO需要通过使能端控制其是否工作。 2I C、DDC C 2I C通讯总线,SDA2 和SCL2引脚内置上拉。做为从机模式时则无需上拉。 D、SPI 8、I/O引脚 A、EXTINT0是一个有固定输入电压阀值的中断输入引脚。独立于VCC,如果不使用该引脚可以将之悬空。 B、配置引脚:(CFG_COM0, CFG_COM1, CFG_GPS0) NEO-5 模块提供了一些引脚用于开机时间配置。在启动后这些引脚立即有效。一旦模块启动,除非系统掉电或者复位修改后的信息一直保持,否则UBX的配置信息就会被修改。如果这些设置已存储到后备的RAM中,修改后的配置将直到后备电池被中断才会被修改。 天线供电:NEO-5 RF_IN引脚不对天线供电。建议在VCC_RF输出串接上一个适当的电阻用于限制电流 C、定时脉冲 ANTARIS/GPS 接收机提供了一个硬件同步TIMEPULSE(引脚29),时间脉冲周期(Pulse Period)从1 ms到60 s。用户可对极性(上升沿或下降沿)和脉冲宽度进行设置。更改TIMEPULSE 设置需要使用UBX 专用消息UBX - CFG (配置,Con-fig) - TP (时间脉冲,Time Pulse)。UBX - TIM (时间,Time) - TP (时间脉冲,Time-pulse)消息为下一个TIMEPULSE 提供时间信息,包括时间源和量化误差。 D、EXTINT0 Time-mark GPS 接收机可用于进行时间的精确测量,它的精度很高,达到了亚毫秒级,使用的是外部中断0(EXTINT0)。Time-mark 功能可用UBX – CFG – TM 进行使能。测量结果使用UBX – TIM – TM 消息通过串口发送,包括上一次Time-mark 定时源的时间、有效性、标记数、时间差和量化误差。 芯片的整个工作流程为: 芯片需要通过TTL电平接口的VDD引脚给芯片供电,以维持芯片工作,芯片通过电路板连接到天线,天线接收到数据后传给主芯片进行数据解析,将解析 17 天津科技大学2013届本科生毕业设计 好的数据通过TTL电平接口的TXD和RXD引脚传递给单片机,通过在单片机内烧入好的程序进行处理,最后在液晶屏上进行显示。 第三节 存储模块 在本次的行车记录仪的设计中要求包含存储模块,将从GPS模块收集到的数据存储到存储器中,以便拥有可以查阅历史纪录的功能。这样的存储器应该满足这样的要求,首先他的存储空间一定要大,这样才能存储足够的数据,其次要保证存储的数据一定要安全,还有就是存储下来的数据可以保存足够长的时间。单片机系统一般都不会采用硬盘或者软盘作为存储设备,相对的大部分单片机系统会使用FLASH存储器来存放数据和代码。 对于大容量的非易失性存储器,EEPROM或Flash型存储器是最普遍的选择,它们不仅可以保证在掉电的情况下不会丢失所保存的数据,确保了数据的安全性,并且能够改写很多次,价格低廉,性价比相对较高。24 系列EEPROM 是 2I一种C接口的存储器,无须外围元件操作,使用简单,应用广泛。因此在本次的设计中采用ATMEL公司生产的ATMEL24c16做为历史数据存储器。24C16 22II采用的是C总线接口方式,C总线是一种用于IC器件之间连接的二线制总线。它通过SDA(串行数据线)及SCL(串行时钟线)两根线在连到总线上的器件之间传送信息,并根据地址识别每个器件:不管是单片机、存储器、LCD驱动器还是键盘接口。 AT24C16是美国ATMEL公司生产的低功耗CMOS串行EEPROM,它内含256×8位存储空间,具有很宽的工作电压(2.5,5.5V)和大量的擦写次数(大于 10000次),除此之外,写入速度也非常快。芯片的原理图为: 图3.6 AT24C16芯片原理图 该芯片的前三个引脚是三条地址线,芯片的硬件地址由他们来确定。在本次毕业设计的试验开发板上它们都接地,第8脚和第4脚分别接电源的正极和负极。 18 天津科技大学2013届本科生毕业设计 2第5脚SDA为串行数据输入/输出接口,数据通过这条双向IC总线串行传送,在本次毕业设计所用到的试验开发板上和单片机的P3.5引脚连接。第6脚SCL为串行时钟输入线,在本次毕业设计的试验开发板上和单片机的P3.6引脚相连接。SDA以及SCL和正电源连接,在他们中都需要各接一个5.1K的上拉电阻。标号为 [7]7的引脚应该接地。24C16片内自带地址寄存器,每写入或读出一个数据字节后,该芯片的地址寄存器自动加1,这样才能实现对下一个存储单元的读写工做。对 芯片的总写入时间,一次所有字节采用的读取方式均为单一操作方式。为了降低 可以对8个字节的数据进行写入操作。 第四节 液晶显示模块的硬件设计 显示模块的主要功能是同键盘相配合,起到帮助使用者更直观、简便地操作记录仪主机系统的作用。显示电路一般都会和键盘电路相结合,一起实现数据上传、下载、显示状态等功能。在单片机系统中经常用到的显示器有:发光二极管(LED);液晶显示器(LCD);荧光管显示器。嵌入式应用领域中LED、LCD的显示技术都比较成熟,本系统显示的信息量大、数据多、界面较复杂,因此采用LCD的显示方案。 液晶显示器(LCD)的种类很多,包括数码液晶显示器、字符液晶显示器、图形液晶显示器和专业液晶显示器(如手机、PDA等)。各种显示器都有自己特殊的功能,每个显示器都有自己的优点,同时也都有一些小的缺憾,因此选择什么样的显示器要根据系统需要而定。在本次设计的这个系统中,要求能够进行字符、数字的液晶显示,因此本文选用了可以显示图形和字符图形的液晶显示器。显示器的作用主要是为人机交流提供即时的信息,能让人们与机器可以进行很好的交流。在众多种类的显示器中,液晶显示器作为人机交互的界面受到越来越多人的欢迎。其中液晶显示器(LCD)也分为好多种型号,按照显示方式来分的话,可以分为段位式的LCD、字符式的LCD以及点阵式的LCD。其中段位式和字符式的LCD只能用于数字和字符的简单的显示,无法显示图形和汉字;但是点阵式液晶显示器就不仅仅是这样了,它不仅能够清楚完美的显示字符和数字等简单信息,还可以显示各种图形等复杂的信息,除此之外它还可以实现屏幕的上下左右滚动等复杂功能。 考虑到本系统只需要显示字符与数字信息,因此LCD1602完全可以满足设计的要求。因此在本次毕业设计中采用LCD1602作为液晶显示的显示器。LCD1602的引脚接口说明如下表: 19 天津科技大学2013届本科生毕业设计 1602液晶也叫1602字符型液晶,它是一种专门用来显示字母、数字、符号等的点阵型液晶模块。它由若干个5X7或者5X11等点阵字符位组成,每个点阵字符位都可以显示一个字符,每位之间有一个点距的间隔,每行之间也有间隔, [9]起到了字符间距和行间距的作用,也正因如此它不能很好地显示图形。 LCD1602与单片机连接的部分原理图如下图所示: 图3.7 LCD1602与单片机连接的部分原理图 第五节 键盘模块 键盘是单片机应用系统中使用最广泛的一种数据输入设备。键盘是一组按键 20 天津科技大学2013届本科生毕业设计 的组合。按键通常是一种常开型的开关按钮,通常情况下,按键的两个触点处于断开状态(开路),按下键时它们才闭合(短路)。 键盘分为编码键盘和非编码键盘两种。编码键盘由检测键闭合的硬件电路、去抖动的硬件电路以及产生相应键编码的硬件电路和一个选通脉冲组成。选通脉冲可以作为CPU的中断请求信号,以通知CPU以中断的方式接收按下的键的编码。此种编码键盘虽然使用起来很方便,但是它硬件开销大、电路比较复杂、成本也比较高,因此常常不被单片机系统所采用,在单片机系统中一般是用非编码键盘来代替编码键盘。非编码键盘用一些按键排成行列矩阵,按键的作用只是使相应点接通或断开,在相应程序配合下产生被按键的编码。这种结构的特点是按键较少,硬件设计简单且相应的键扫描软件实现也比较简单。 非编码键盘按组成结构来分又可以分为独立式键盘和矩阵式键盘。独立式键盘的工作过程与矩阵式键盘类似,无论是硬件结构还是软件设计都比较简单,每个按键占用一条I/O线,当按键数量较多时,I/O口利用率不高,但程序编制简 [10]单,适用于所需按键较少的场合。 本次设计的行车记录仪采用四个独立按键,主要控制液晶显示屏的翻页,占用资源少,设计简单,所以用独立键盘完全可以满足要求,单片机与独立键盘的连接的原理图如图所示: 图3.8 单片机与独立键盘连接的原理图 21 天津科技大学2013届本科生毕业设计 第四章 行车记录仪系统的软件设计 编程语言的选择 第一节 汽车行驶记录仪软件部分主要是结合硬件系统来实现整个记录仪的各项功能。软件部分主要是由编程语言来实现,对于单片机的系统的软件设计来说,我们可以用汇编语言和C语言程序来实现单片机系统的软件功能。 汇编语言(Assembly Language)是一种面向机器的程序设计语言。它用助记符(Mnemonic)代替操作码,用地址符或标号代替指令或操作数的地址,如此就增强了程序的可读性,且降低了编写难度,像这样符号化的程序设计语言就 [10]是汇编语言,因此亦称为符号语言。 汇编语言是面向机器的语言,是最底层的语言,因此他被称为低级语言。汇编语言通常是为特定的硬件系统而专门设计的。因此,处理器不同,采用的汇编语言语法和编译器也就不一样,不同的编译的程序无法在不同的处理器上执行,可移植性非常差;而且想要从汇编语言代码上理解程序设计的想法或者是意图那是非常困难的,因此也就导致了它的可维护性非常的差,即使是完成简单的工作也一定要编写大量的程序代码,这样的话产生bug那是很正常的,调试工做也就理所当然的变得很困难;使用汇编语言必须对某种处理器做到特别的了解,而且只能针对特定的体系结构和处理器进行优化,开发效率特别的低,周期特别长并且特别单调乏味。 相比于汇编语言的这些缺点,基于单片机的C语言的程序设计完全解决了 [17]汇编语言的这些缺点。C语言是一种面向过程的程序设计语言,它既具有高级语言的特点,又具有汇编语言的优点。它把高级语言的基本结构和语句与低级语言的实用性结合起来。即可以像汇编语言一样对计算机最基本的工作单元位、字节和地址进行操作,又可以作为工作系统设计语言,编写系统应用程序,也可以作为应用程序设计语言,编写不依赖计算机硬件的应用程序。它的应用范围广泛,具备很强的数据处理能力,不仅可以用在软件开发上,编写系统软件,也可以用于硬件系统的开发,具体应用比如单片机以及嵌入式系统开发等。 C语言功能齐全、适用范围广、简洁紧凑、灵活方便、表达方式灵活实用,允许直接访问物理地址、对硬件进行操作、生成目标代码的质量高,程序执行效率高、可移植性好、表达力强。虽然在数据的封装性上,C在数据的安全性有很大缺陷,但这对这次要完成的记录仪的软件设计没有一点影响,考虑到这些因素,在这次的软件设计中我们用C语言做为主要编程语言。 22 天津科技大学2013届本科生毕业设计 第二节 主程序的设计 主程序的名称为Main(),主要完成系统的初始化工作,然后进入一个无限期的循环,在这个循环中,主要有判断语句来判断来自键盘的信息,还有确定GPS输入信号是否为有效信号的语句,根据键盘输入的信息并且判断接收到的信息是否有效,都成立的话,在液晶屏上显示相应的接收到的来自GPS模块的内容。如果数据无效,返回初始化。程序的流程图如下所示: 图4.1 主程序流程图 主程序内容见附录。 23 天津科技大学2013届本科生毕业设计 第三节 GPS接收模块的软件设计 GPS模块的程序的软件设计主要是初始化GPS模块的信息,判断GPS模块初始化是否准备完毕,准备完毕则接收数据,进行数据解析,如果没有初始化完毕的话,延迟一段时间,继续判断GPS模块是否准备完毕,直到初始化完成结束,才开始执行下面的步骤。由于GPS冷启动时,初始化的时间比较长,大概为30S左右,所以延迟应该设置的长一些,让GPS有充分的等待时间。 GPS模块程序设计的流程图如下图所示: 图4.2 GPS模块程序设计的流程图 24 天津科技大学2013届本科生毕业设计 第四节 数据存储模块的软件设计 汽车行驶记录仪所需要存储的数据有车速信息、海拔高度信息、经纬度信息等汽车的位置信息以及实时的时钟信息。数据存储任务的流程图如图所示,首先在开始要完成对存储器的初始化,第一次运行该程序时,首先要对EEPROM进行全片擦除工作。在以后的程序运行中,初始化后首先应等待消息并判断所接受到的消息的类别,然后按照时间、车速、经纬度,海拔和水平面高度的顺序进行数据存储,在数据的存储时首先要判断存储空间是否已满,满的话先用串口通信方式把所有的存储数据发送给PC机,并将他们全部存储,然后进行EEPROM的擦除工作。如果存储器还有存储空间的话,则存储数据。 图4.3 数据存储流程图 25 天津科技大学2013届本科生毕业设计 第五节 键盘和液晶显示模块的软件设计 显示器根据键盘按键的不同,可以显示出不同的内容;按键的作用主要控制液晶屏的翻页。在默认显示状态,可显示GPS的初始化信息,当初始化完毕后,通过按键选择,可以分别显示出当前的日期和时间,汽车的行驶速度,当前位置的经度和纬度以及海拔高度和水平面高度等信息。键盘和液晶显示模块的程序流程图如下图所示: 图4.4 键盘和液晶显示模块的程序流程图 26 天津科技大学2013届本科生毕业设计 结 论 在两个多月的时间里,经过阅读大量的文献,借鉴各国的前辈们设计的行车记录仪的经验,经过方案评估,电路设计,调试和总结等阶段,并且在自己不断的努力和同学们的帮助下,最终完成了这个基于单片机的行车记录仪的产品的设计。经过最终的调试和测试,在本次设计的行车记录仪可以完整的实现当初所需要实现的功能。即利用GPS模块接收信号和单片机的处理最终可以在液晶屏上显示汽车当前的位置信息以及车辆的行驶状态和当前的日期和时间,并且可以用键盘来控制液晶屏显示的内容。 本课题涉及的知识面较广,涵盖了通讯系统,GPS系统,和单片机系统设计等方方面面的知识。通信系统的知识包括对接收到的数字信号的处理,GPS方面的知识主要包括GPS系统的构成和工作原理,GPS定位仪的设计原理和方案等。单片机系统方面的知识主要包括微处理器的工作原理,单片机系统硬件的设计和调试,应用软件的设计和测试等等。除此之外,实际工作中还需要学习一些实用的知识,例如不同集成电路芯片的设计指南,包括微控制器STC90C51RD+,GPS接收模块NEO-5Q以及其他一些存储器,外设等芯片的使用和设计指南。同时一些必要的工具也必须要学习和掌握,比如说硬件电路原理图和印制板图绘制工 [11]具Protel等。这些东西好多对我来说都是首次接触,如果想要对它们灵活运用就必须将它们完全消化吸收。因此参阅大量文献是必不可少的一项工作,除此之外我们还可以从网上获取一些最新的硬件设计开发指南和相关的芯片开发手册等资料。在工作中也要向老师和同学多多的请教,通过系统的学习和实践的锻炼,积累一定的基础知识和提高自己实际开发的技能。 完成毕业设计的过程并不是一帆风顺的,除了在阅读资料时,遇到了大量的外文文献,让自己看得一头雾水,在进行的产品的最终的调试的时候也碰到了很多的困难。例如,在调试液晶显示屏显示内容的时候,液晶屏只是会亮,但是不出现任何的内容,反复查程序的错误所在,却没有一点收获,后来在无意中发现原来是液晶屏电路图看错了导致引脚插反,导致在液晶屏上看不到任何的内容。还有一次,键盘模块可以很好的控制液晶屏的换页,单片机也可以将输入的数据从液晶屏中显示出来,但是当接收到来自GPS模块的信号时,却不能将数据很好的从液晶显示器输出,开始以为GPS模块的数据没有输入到单片机中,但是经过了串口输入的调试发现数据可以很好的进行传输,在发现硬件好多都没问题之后,又对软件设计进行检查,发现没有一点问题。当时就觉得,做一个产品,想法很容易想出来,但是调试过程真是特别的难。虽然问题很难,但是我以及帮助我的同学们没有一点放弃,最终经过各种测试,发现原来是单片机晶振的原因,单片机的时钟频率和接收到的GPS模块的数据的频率不一致,导致GPS数据不 27 天津科技大学2013届本科生毕业设计 能很好的接收。在换过晶振之后,单片机可以很好的接收来自GPS模块的数据并且在液晶屏上显示出来。 虽然本次的题目做了出来,但是由于设备以及开发者本人能力的关系,设计完成的产品还有特别多的不足。例如存储模块,本次使用的存储模块为EEPROM存储器,EEPROM的特点是存储空间小并且存储速度慢,虽然对于本次的设计影响不大,但是当设计一个更好一点的行车记录仪的时候,EEPROM就远远不能满足要求,这就需要存储空间更大存储速度更快的存储器来代替它。还有液晶显示模块,由于资源的原因,这次使用的液晶屏为1602,只能用来显示字符和数字,远远不能满足行车记录仪的国标要求。假如换成彩色液晶屏来实现内容显示的话,只是用单片机又是不能实现的,必须换成处理速度更快内存空间更大的处理设备,例如基于32位嵌入式系统的行车记录仪的设计。 本次的毕业设计在忙碌与欢笑中完成了,经过了这段过程,我学到了很多的东西。在本次的毕业设计中,我了解了行车记录仪的发展史以及国内外的研发现状,知道了行车记录仪设计的国家要求,也知道了行车记录仪对我们生活的重要性,让我更进一步的对行车记录仪有了一定的了解,开始只是弱弱的认为行车记录仪只是一个汽车导航设备。同时在这次的课题中我还学习到了国内外关于电子领域的研究经验,更深一步的把自己在大学中学到的知识同实践联系了起来,让我对单片机,GPS,液晶显示,存储器有了更彻底的了解,对我以后的发展一定会起到不一样的影响。 本次设计的产品并不是完美的,他只是我在大学中学习到的知识的简单运用。现在电子技术的快速发展及汽车功能的不断扩展,汽车行驶记录仪不断的推陈出新,会有更多更好的行车记录仪的产品问世,因此我不会在这里停止脚步,借助这次毕业设计学到的,领会到的知识与经验,我会更加努力,在这些领域做得更好。同时祝愿今后我国汽车行驶记录仪的研究能日新月异,走在世界的前沿。 28 天津科技大学2013届本科生毕业设计 致 谢 四年的大学生活在这个夏天即将划上一个句号,而对于我的人生来说却只是一个小小的逗号,接下来我将面对的又将是一次崭新的征程。四年的大学生活在老师、朋友的大力支持下,走得艰辛却又很充实,在我的毕业设计论文即将完成之际,心情特别的激动,久久无法平静。虽然伟人、名人为我所崇拜,但那是以后的事,现在我更需要感谢一个人,他就是我的导师,**老师。我不是您最出色的学生,而您却是我最尊敬的老师。您治学严谨,学识渊博,思想深邃,视野雄阔,为我营造了一种良好的学习氛围与精神氛围。授人以鱼不如授人以渔,置身其间,耳濡目染,潜移默化,在不知不觉中,我不仅受到了全新的思想观念的熏陶,而且树立了宏伟的学习目标,从论文题目的选定到论文写作的指导,每次您都非常的耐心,经由您悉心的点拨,再经思考后的领悟,常常让我有这样的一种感觉,那就是陆游在一句诗中写的那样:“山重水复疑无路,柳暗花明又一村”。同时感谢**老师,***老师,**老师在这大学四年里对我的悉心教导,让我能够取得这么好的成绩;感谢我的老爸老妈,焉得谖草,言树之背,养育之恩,无以回报,你们永远健康快乐是我最大的心愿;感谢外国语学院的研究生学姐,是你帮助我克服英语的障碍,让我可以出色的完成文献翻译,在我阅读外文文献的时候给了我大量的指导;感谢帮助我完成毕业设计的同学们,是你们帮助我走了过来,中途的多少次放弃,是你们给我加油鼓气,我们一起克服了一个又一个的难题。在这期间我们一起欢笑,一起悲伤,走过了最艰难的岁月。你们是我永远的朋友,对于你们的帮助我将永远不会忘记。同时感谢我借鉴的论文的作者,是你们为我开辟了前进的道路,我一定会借鉴你们的了力量继续前进,攀登上科学的顶峰。 29 天津科技大学2013届本科生毕业设计 参考文献: [1]汽车行驶记录仪事故预防效果调查研究 庞昌乐,2006年 北京工业大学 [2]基于单片机中波广播发射系统同步激励器监测与切换装置的设计 《安徽电子信息职业技术学院学报》,2008年 顾姚昊 等 [3]基于GPS/GIS/GPRS的车辆监控管理系统的设计与开发 程一沛,2009年 西安科技大学 [4]基于CAN总线的车载GPS导航系统研究 张超,2008年 东北大学 [5]基于OMAP3530的船舶多功能组合导航仪的研究与设计 《工业控制计算机》,2011年 周辉 等 [6]基于Windows Mobile操作系统手机的GPS模块设计与实现 田蓓,2008年 厦门大学 [7]无线控制的智能家居安保系统研究及应用 施建珍,2006年 东南大学 [8]基于CPLD的超声波水位测量系统的研究 张卓敏,2010年 武汉理工大学 [9]交流电力智能传感器粗信号处理实验系统的研制 程志,2012年 西华大学 [10]钢铁墙壁面爬壁机器人的研究 丁鹏,2012年 太原理工大学 [11]基于单片机的GPS定位仪的研究与实现 胡成龙, 2006年 华中科技大学 [12]Gold,K.Brown,A.Architecture and performance testing of a software GPS receiver for space-based applications.IEEE,2005:56-78 [13]Bachir,Benslimane.Towards supporting GPS-unequipped vehicles in inter-vehicle geocast.IEEE,2003:23-26 [14]Wright,M.Stallings,D.Dunn,D.The effectiveness of global positioning system electronic navigation.Southeast-Con,2003:2-7 [15]徐进,周宁.GPS 接收机的单片机通讯接口.南京大学天文系. 南京市 [16]赖麒文.51单片机C语言的彻底应用.科学技术出版社 [17]C语言程序设计 谭浩强. [18]单片机原理与接口技术 何宏等 30 天津科技大学2013届本科生毕业设计 附 录 /******************************************************************** *文件名:液晶1602.c *描述:改程序实现了对液晶1602的控制 ********************************************************************* **/ #include #include #include #define uchar unsigned char #define uint unsigned int //GPS接收数据指示灯 #define REV_YES led1 = 0 #define REV_NO led1 = 1 #define RMC_YES led2 = 0 #define RMC_NO led2 = 1 #define GGA_YES led3 = 0 #define GGA_NO led3 = 1 sbit led1 = P1^0; //接收数据指示灯 sbit led2 = P1^1; //GPRMC数据有效指示灯 sbit led3 = P1^2; //GPGGA数据有效指示灯 sbit key1=P2^0; sbit key2=P2^1; sbit key3=P2^2; 31 天津科技大学2013届本科生毕业设计 sbit key4=P2^3; //这三个引脚参考资料 sbit E=P2^7; //1602使能引脚 sbit RW=P2^5; //1602读写引脚 sbit RS=P2^6; //1602数据/命令选择引脚 //GPS数据格式结构 typedef struct{ int year; int month; int day; int hour; int minute; int second; }DATE_TIME; typedef xdata struct{ double latitude; //经度 double longitude; //纬度 int latitude_Degree; //度 int latitude_Cent; //分 int latitude_Second; //秒 int longitude_Degree; //度 int longitude_Cent; //分 int longitude_Second; //秒 float speed; //速度 32 天津科技大学2013届本科生毕业设计 float direction; //航向 float height_ground; //水平面高度 float height_sea; //海拔高度 uchar NS; uchar EW; DATE_TIME D; }GPS_INFO; void GPS_Init(void); int GPS_RMC_Parse(char *line,GPS_INFO *GPS); int GPS_GGA_Parse(char *line,GPS_INFO *GPS); void Int_To_Str(int x,char *Str); static uchar GetComma(uchar num,char* str); static double Get_Double_Number(char *s); static float Get_Float_Number(char *s); static void UTC2BTC(DATE_TIME *GPS); void Show_Float(float fla, uchar x, uchar y); //1602显示 void GPS_DispTime(void); void GPS_DisplayOne(void); void GPS_DisplayTwo(void); void scan_key(); unsigned int key=1; uchar it=0; char xdata rev_buf[80]; //接收缓存 33 天津科技大学2013届本科生毕业设计 uchar xdata rev_start = 0; //接收开始标志 uchar xdata rev_stop=0; //接受停止标志 uchar xdata gps_flag = 0; //GPS处理标志 uchar xdata change_page = 0; //换页显示标志 uchar xdata num = 0; uchar num2=0; GPS_INFO GPS; //在display.c中定义,使用时要加extern /******************************************************************** *名称:delay() *功能:延时,延时时间大概为140us * 无 * 无 ********************************************************************* **/ void delay() { int i,j; for(i=0; i<=6; i++) for(j=0; j<=10; j++) ; } /******************************************************************** *名称:enable(uchar del) *功能:1602命令函数 34 天津科技大学2013届本科生毕业设计 *输入:输入的命令值 *输出:无 ********************************************************************* **/ void enable(uchar del) { P0 = del; RS = 0; RW = 0; E = 0; delay(); E = 1; //delay(); } /******************************************************************** *名称:write(uchar del) *功能:1602写入数据函数 *输入:需要写入1602的数据 *无 ********************************************************************* **/ void write(uchar del) { P0 = del; RS = 1; RW = 0; 35 天津科技大学2013届本科生毕业设计 E = 0; delay(); E = 1; //delay(); } /******************************************************************** *名称:L1602 init() *功能:1602初始化 *输入:无 *输出:无 ********************************************************************* **/ void L1602_init(void) { enable(0x01); enable(0x38); enable(0x0c); enable(0x06); enable(0xd0); } /**************************************** 串口初始化 /****************************************/ void Uart_Init(void) { 36 天津科技大学2013届本科生毕业设计 //SCON = 0x50; PCON = 0x00; TMOD=0x21;; TH0=0x3c; TL0=0xb0; TH1=0xfd; TL1=0xfd; //TR0=1; //开启定时器0 TR1=1; REN=1; //允许接收数据 SM0=0; SM1=1; TI=0; RI=0; EA=1; //开总中断 ES=1; //串口1中断允许 ET0 = 1; //定时器0中断允许 } /******************************************************************** *名称:L1602string(uchar hang,uchar lie,uchar *p) *功能:改变液晶中某位的值,如果要让第一行,第五个字符开始显示―ab cd ef‖,调用该函数如下 L1602_string(1,5,"ab cd ef;") *输入:行,列,需要输入1602的数据 *输出:无 ********************************************************************* 37 天津科技大学2013届本科生毕业设计 **/ void L1602_string(uchar hang,uchar lie,uchar *p) { uchar a; if(hang == 1) a = 0x80; if(hang == 2) a = 0xc0; a = a + lie - 1; enable(a); while(1) { if(*p == '\0') break; write(*p); p++; } } //============================================================ ========// //语法格式: void GPS_Init(void) //实现功能:GPS初始化,在LCD上显示初始化信息 //参数:无 //返回值:无 //============================================================ ========// void GPS_Init(void) { L1602_string(1,2,"The GPS Starts"); 38 天津科技大学2013届本科生毕业设计 L1602_string(2,2,"GPS Searching!"); } //============================================================ ========// // 语法格式:int GPS_RMC_Parse(char *line, GPS_INFO *GPS) // 实现功能:把GPS模块的GPRMC信息解析为可识别的数据 // 参数:存放原始信息字符数组、存储可识别数据的结构体 // 返回值: // 1:解析GPRMC完毕 // 0:没有进行解析,或数据无效 //============================================================ ========// int GPS_RMC_Parse(char *line,GPS_INFO *GPS) { uchar ch, status, tmp; float lati_cent_tmp, lati_second_tmp; float long_cent_tmp, long_second_tmp; float speed_tmp; char *buf = line; ch = buf[5]; status = buf[GetComma(2, buf)]; ($GPRMC) if (ch == 'C') //如果第五个字符是C, { if (status == 'A') //如果数据有效,则分析,第二位,定位状态,A=有效定位,v=无效定位 { 39 天津科技大学2013届本科生毕业设计 GPS -> NS = buf[GetComma(4, buf)]; GPS -> EW = buf[GetComma(6, buf)]; GPS->latitude = Get_Double_Number(&buf[GetComma(3, buf)]); GPS->longitude = Get_Double_Number(&buf[GetComma( 5, buf)]); GPS->latitude_Degree= (int)GPS->latitude / 100; //分离纬 度 lati_cent_tmp = (GPS->latitude - GPS->latitude_Degree * 100) * 0.6; GPS->latitude_Cent = (int)lati_cent_tmp; lati_second_tmp = (lati_cent_tmp - GPS->latitude_Cent) * 60; GPS->latitude_Second= (int)lati_second_tmp; GPS->longitude_Degree = (int)GPS->longitude / 100; //分离经度 long_cent_tmp= (GPS->longitude - GPS->longitude_Degree * 100) * 0.6; GPS->longitude_Cent = (int)long_cent_tmp; long_second_tmp = (long_cent_tmp - GPS->longitude_Cent) * 60; GPS->longitude_Second = (int)long_second_tmp; speed_tmp= Get_Float_Number(&buf[GetComma(7, buf)]); //速度 (单位:海里/时) GPS->speed= speed_tmp * 1.85; //1海 里=1.85公里 GPS->direction = Get_Float_Number(&buf[GetComma(8, buf)]); //角度 GPS->D.hour = (buf[7] - '0') * 10 + (buf[8] - '0'); //时间 GPS->D.minute = (buf[9] - '0') * 10 + (buf[10] - '0'); GPS->D.second = (buf[11] - '0') * 10 + (buf[12] - '0'); tmp = GetComma(9, buf); GPS->D.day = (buf[tmp + 0] - '0') * 10 + (buf[tmp + 1] - '0'); //日期 40 天津科技大学2013届本科生毕业设计 GPS->D.month= (buf[tmp + 2] - '0') * 10 + (buf[tmp + 3] - '0'); GPS->D.year= (buf[tmp + 4] - '0') * 10 + (buf[tmp + 5] - '0')+2000; UTC2BTC(&GPS->D); return 1; } } return 0; } //============================================================ ========// //语法格式: int GPS_GGA_Parse(char *line, GPS_INFO *GPS) //实现功能:把GPS模块的GPGGA信息解析为可识别的数据 //参数:存放原始信息字符数组、存储可识别数据的结构体 //返回值: // 1:解析GPGGA完毕 // 0: 没有进行解析,或数据无效 //============================================================ ========// int GPS_GGA_Parse(char *line,GPS_INFO *GPS) { uchar ch, status; char *buf = line; ch = buf[4]; status = buf[GetComma(2, buf)]; if (ch == 'G') //$GPGGA { 41 天津科技大学2013届本科生毕业设计 if (status != ',') { GPS->height_sea = Get_Float_Number(&buf[GetComma(9, buf)]); GPS->height_ground = Get_Float_Number(&buf[GetComma(11, buf)]); return 1; } } return 0; } //============================================================ ========// //语法格式:static float Str_To_Float(char *buf) //实现功能:把一个字符串转化成浮点数 //参数:字符串 //返回值:转化后单精度值 //============================================================ ========// static float Str_To_Float(char *buf) { float rev = 0; float dat; int integer = 1; char *str = buf; int i; while(*str != '\0') { 42 天津科技大学2013届本科生毕业设计 switch(*str) { case '0': dat = 0; break; case '1': dat = 1; break; case '2': dat = 2; break; case '3': dat = 3; break; case '4': dat = 4; break; case '5': dat = 5; break; case '6': dat = 6; break; case '7': dat = 7; 43 天津科技大学2013届本科生毕业设计 break; case '8': dat = 8; break; case '9': dat = 9; break; case '.': dat = '.'; break; } if(dat == '.') { integer = 0; i = 1; str ++; continue; } if( integer == 1 ) { rev = rev * 10 + dat; } else { rev = rev + dat / (10 * i); 44 天津科技大学2013届本科生毕业设计 i = i * 10 ; } str ++; } return rev; } //============================================================ ========// //语法格式: static float Get_Float_Number(char *s) //实现功能:把给定字符串第一个逗号之前的字符转化成单精度型 //参数:字符串 //返回值:转化后单精度值 //============================================================ ========// static float Get_Float_Number(char *s) { char buf[10]; uchar i; float rev; i=GetComma(1, s); i = i - 1; strncpy(buf, s, i); buf[i] = 0; rev=Str_To_Float(buf); return rev; } 45 天津科技大学2013届本科生毕业设计 //============================================================ ========// //语法格式: static double Str_To_Double(char *buf) //实现功能:把一个字符串转化成浮点数 //参数:字符串 //返回值:转化后双精度值 //============================================================ ========// static double Str_To_Double(char *buf) { double rev = 0; double dat; int integer = 1; char *str = buf; int i; while(*str != '\0') { switch(*str) { case '0': dat = 0; break; case '1': dat = 1; break; 46 天津科技大学2013届本科生毕业设计 case '2': dat = 2; break; case '3': dat = 3; break; case '4': dat = 4; break; case '5': dat = 5; break; case '6': dat = 6; break; case '7': dat = 7; break; case '8': dat = 8; break; case '9': dat = 9; break; case '.': 47 天津科技大学2013届本科生毕业设计 dat = '.'; break; } if(dat == '.') { integer = 0; i = 1; str ++; continue; } if( integer == 1 ) { rev = rev * 10 + dat; } else { rev = rev + dat / (10 * i); i = i * 10 ; } str ++; } return rev; } //============================================================ ========// //语法格式:static double Get_Double_Number(char *s) 48 天津科技大学2013届本科生毕业设计 //实现功能:把给定字符串第一个逗号之前的字符转化成双精度型 //参数:字符串 //返回值:转化后双精度值 //============================================================ ========// static double Get_Double_Number(char *s) { char buf[10]; uchar i; double rev; i=GetComma(1, s); i = i - 1; strncpy(buf, s, i); buf[i] = 0; rev=Str_To_Double(buf); return rev; } //============================================================ ========// //语法格式:static uchar GetComma(uchar num,char *str) //实现功能:计算字符串中各个逗号的位置 //参数:查找的逗号是第几个的个数,需要查找的字符串 //返回值;0 //============================================================ ========// static uchar GetComma(uchar num,char *str) 49 天津科技大学2013届本科生毕业设计 { uchar i,j = 0; int len=strlen(str); for(i = 0;i < len;i ++) { if(str[i] == ',') j++; if(j == num) return i + 1; } return 0; } //============================================================ ========// //语法格式:void UTC2BTC(DATE_TIME *GPS) //实现功能:转化时间为北京时区的时间 //参数:存放时间的结构体 //返回值;无 //============================================================ ========// static void UTC2BTC(DATE_TIME *GPS) { GPS->second ++; if(GPS->second > 59) { GPS->second = 0; 50 天津科技大学2013届本科生毕业设计 GPS->minute ++; if(GPS->minute > 59) { GPS->minute = 0; GPS->hour ++; } } GPS->hour = GPS->hour + 8; if(GPS->hour > 23) { GPS->hour -= 24; GPS->day += 1; if(GPS->month == 2 || GPS->month == 4 || GPS->month == 6 || GPS->month == 9 || GPS->month == 11 ) { if(GPS->day > 30) { GPS->day = 1; GPS->month++; } } else 51 天津科技大学2013届本科生毕业设计 { if(GPS->day > 31) { GPS->day = 1; GPS->month ++; } } if(GPS->year % 4 == 0 ) { if(GPS->day > 29 && GPS->month == 2) { GPS->day = 1; GPS->month ++; } } else { if(GPS->day > 28 &&GPS->month == 2) { GPS->day = 1; GPS->month ++; } } if(GPS->month > 12) { 52 天津科技大学2013届本科生毕业设计 GPS->month -= 12; GPS->year ++; } } } //============================================================ ========// // 语法格式: Int_To_Str(int x,char *Str) // 实现功能:转化整形值为字符串形式 // 参数: x:转化的整数 // Str:转化后的字符串 // 返回值:无 //============================================================ ========// void Int_To_Str(int x,char *Str) { int t; char *Ptr,Buf[5]; int i = 0; num2=0; Ptr = Str; 当整数小于10时,转化为―0x‖的格式 if(x < 10) // { *Ptr ++ = '0'; *Ptr ++ = x+0x30; num2=2; 53 天津科技大学2013届本科生毕业设计 } else { while(x > 0) { t = x % 10; x = x / 10; Buf[i++] = t+0x30; //通过计算把数字转化成ASCII码形式 } num2=i; i -- ; for(;i >= 0;i --) //将得到的字符串倒序 { *(Ptr++) = Buf[i]; } } *Ptr = '\0'; } /**************************************** 显示时间 /****************************************/ void GPS_DispTime(void) { uchar i = 0; //uchar ch; 54 天津科技大学2013届本科生毕业设计 char time[5]; Int_To_Str(GPS.D.year,time); //将年转换成字符串,存在time中 L1602_string(1, 1, "DATE:"); L1602_string(1, 6, time); //年月日 L1602_string(1, 10, "/"); for(i=0;i<5;i++) time[i]=0; Int_To_Str(GPS.D.month,time); L1602_string(1, 11, time); L1602_string(1, 13, "/"); for(i=0;i<5;i++) time[i]=0; Int_To_Str(GPS.D.day,time); L1602_string(1, 14, time); for(i=0;i<5;i++) time[i]=0; Int_To_Str(GPS.D.hour,time); L1602_string(2, 1, "TIME:"); L1602_string(2, 6, time); L1602_string(2, 8, ":"); for(i=0;i<5;i++) time[i]=0; Int_To_Str(GPS.D.minute,time); L1602_string(2, 9, time); L1602_string(2, 11, ":"); 55 天津科技大学2013届本科生毕业设计 for(i=0;i<5;i++) time[i]=0; Int_To_Str(GPS.D.second,time); L1602_string(2, 12, time); for(i=0;i<5;i++) time[i]=0; } /**************************************** 显示第一页(日期,时间) /****************************************/ void GPS_DisplayOne(void) { enable(0x01); //清屏 GPS_DispTime(); } /**************************************** 显示第二页(经度,纬度) /****************************************/ void GPS_DisplayTwo(void) { // uchar ch; uchar i=0; char info[10]; enable(0x01); //清屏 56 天津科技大学2013届本科生毕业设计 if (GPS.NS == 'N') //判断是北纬还是南纬 L1602_string(1, 1, "North:"); else if (GPS.NS == 'S') L1602_string(1, 1, "South:"); if (GPS.EW == 'E') //判断是东经还是西经 L1602_string(2, 1, "East:"); else if (GPS.EW == 'W') L1602_string(2, 1, "West:"); Int_To_Str(GPS.latitude_Degree,info); //纬度 L1602_string(1, 7, info); L1602_string(1, 9, "'"); for(i=0;i<10;i++) info[i]=0; Int_To_Str(GPS.latitude_Cent,info); //纬分 L1602_string(1, 10, info); L1602_string(1, 12, "'"); for(i=0;i<10;i++) info[i]=0; Int_To_Str(GPS.latitude_Second,info); //纬秒 L1602_string(1, 13, info); for(i=0;i<10;i++) info[i]=0; Int_To_Str(GPS.longitude_Degree,info); //经度 L1602_string(2, 6, info); 57 天津科技大学2013届本科生毕业设计 L1602_string(2, 8, "'"); for(i=0;i<10;i++) info[i]=0; Int_To_Str(GPS.longitude_Cent,info); //经分 L1602_string(2, 9, info); L1602_string(2, 11, "'"); for(i=0;i<10;i++) info[i]=0; Int_To_Str(GPS.longitude_Second,info); //经秒 L1602_string(2, 12, info); for(i=0;i<10;i++) info[i]=0; } /**************************************** 显示第三页(速度,航向) /****************************************/ void GPS_DisplayThree(void) { uchar temp[2]={0xdf,'C'}; enable(0x01); //清屏 L1602_string(1, 1,"Speed:"); L1602_string(2, 1, "Course:"); Show_Float(GPS.speed, 1, 7); L1602_string(1, 7+num2+3,"km/h"); 58 天津科技大学2013届本科生毕业设计 Show_Float(GPS.direction, 2, 8); L1602_string(2, 8+num2+3,temp); } /**************************************** 显示第四页(地面高度,海拔高度) /****************************************/ void GPS_DisplayFour(void) { enable(0x01); //清屏 L1602_string(1, 1,"Height:"); L1602_string(2, 1,"Elevat:"); Show_Float(GPS.height_ground, 1, 8); L1602_string(1, 7+num2+3, "m "); Show_Float(GPS.height_sea, 2, 8); L1602_string(2, 7+num2+3, "m "); } //======================================================== // 语法格式: void Show_Float(float fla, uchar x, uchar y) // 实现功能: 在LCD上显示浮点数 // 参数: fla-要现实的浮点数 // x - LCD的x坐标 // y - LCD的y坐标 // 返回值:无 //======================================================== 59 天津科技大学2013届本科生毕业设计 void Show_Float(float fla, uchar x, uchar y) { //uchar a; //if(x == 1) a = 0x80; // if(x == 2) a = 0xc0; // a = a + y - 1; // enable(a); int integar; char Info[10],ch[1]; uchar i=0; integar = (int)fla; // 显示整数部分 Int_To_Str(fla,Info); //显示整数部分 L1602_string(x, y, Info); L1602_string(x, y+num2, "."); for(i=0;i<10;i++) Info[i]=0; fla = fla - integar; //显示小数部分 fla = fla * 10; //0.1 显示 0.1 integar = (int) fla; fla = fla - integar; // 改变fla的值,使fla总是小于1 ch[0] = integar + 0x30; L1602_string(x, y+num2+1, ch); fla = fla*10; //0.01 显示 0.01 integar = (int) fla; fla = fla - integar;//改变fla的值,使fla总是小于1 60 天津科技大学2013届本科生毕业设计 ch[0] = integar + 0x30 ; L1602_string(x, y+num2+2, ch); } /******************************************************************** * 名称: Main() * 功能:主函数 * 输入:无 * 输出:无 ********************************************************************* **/ void Main() { uchar i = 48; uchar error_num = 0; // dula = 0; // wela = 0; L1602_init(); Uart_Init(); //初始化串口 delay(); delay(); delay(); GPS_Init(); //初始化GPS delay(); delay(); delay(); //P2=0xff; 61 天津科技大学2013届本科生毕业设计 key1=1; key2=1; key3=1; key4=1; while(1) { // uchar te; scan_key(); //te=key+0x30; //L1602_string(1, 1,&te); if (rev_stop) //如果接收完一行 { TR0 = 1; //开启定时器 REV_YES; //if (change_page % 4 == 0) //换页 if(key==1) { if (GPS_RMC_Parse(rev_buf, &GPS)) //解析GPRMC { RMC_YES; GPS_DisplayOne(); //显示GPS第一页信息 error_num = 0; gps_flag = 0; rev_stop = 0; led1 = 1; 62 天津科技大学2013届本科生毕业设计 } else { error_num++; if (error_num >= 20) //如果数据无效超过20次 { RMC_NO; error_num = 0; GPS_Init(); //返回初始化 } gps_flag = 0; rev_stop = 0; REV_NO; } } else if(key==2)//if(change_page % 4 == 1) { if (GPS_RMC_Parse(rev_buf, &GPS)) //解析GPRMC { RMC_YES; GPS_DisplayTwo(); //显示GPS第一页信息 error_num = 0; gps_flag = 0; rev_stop = 0; 63 天津科技大学2013届本科生毕业设计 led1 = 1; } else { error_num++; if (error_num >= 20) //如果数据无效超过20次 { RMC_NO; error_num = 0; GPS_Init(); //返回初始化 } gps_flag = 0; rev_stop = 0; REV_NO; } } else if(key==3)//if(change_page % 4 == 2) { if (GPS_GGA_Parse(rev_buf, &GPS)) //解析GPGGA { GGA_YES; GPS_DisplayThree(); //显示第三页信息 error_num = 0; gps_flag = 0; 64 天津科技大学2013届本科生毕业设计 rev_stop = 0; REV_NO; } else { error_num++; if (error_num >= 20) //如果数据无效超过20次 { GGA_NO; error_num = 0; GPS_Init(); //返回初始化 } gps_flag = 0; rev_stop = 0; REV_NO; } } else if(key==4) { if (GPS_GGA_Parse(rev_buf, &GPS)) //解析GPGGA { GGA_YES; GPS_DisplayFour(); //显示第四页信息 error_num = 0; 65 天津科技大学2013届本科生毕业设计 gps_flag = 0; rev_stop = 0; REV_NO; } else { error_num++; if (error_num >= 20) //如果数据无效超过20次 { GGA_NO; error_num = 0; GPS_Init(); //返回初始化 } gps_flag = 0; rev_stop = 0; REV_NO; } } } } } /**************************************** 定时器中断 /****************************************/ 66 天津科技大学2013届本科生毕业设计 void timer0(void) interrupt 1 { static uchar count = 0; TR0=0; ET0=0; TH0 = 0x3c; TL0 = 0xb0; count++; if (count == 100) //5秒钟 { count = 0; change_page++; //换页 if (change_page == 10) change_page = 0; } ET0=1; TR0=1; } /**************************************** 串口接收中断 /****************************************/ void Uart_Receive(void) interrupt 4 { uchar ch; ES = 0; 67 天津科技大学2013届本科生毕业设计 if (RI) { ch = SBUF; if ((ch == '$') && (gps_flag == 0)) //如果收到字符‘$‘,便开始接收 { rev_start = 1; rev_stop = 0; //L1602_string(1, 1, "$$$$$$$$$"); } if (rev_start == 1) //标志位为1,开始接收 { rev_buf[num++] = ch; //字符存到数组中 if (ch == '\n') //如果接收到换行 { rev_buf[num] = '\0'; rev_start = 0; rev_stop = 1; gps_flag = 1; num = 0; } } } RI = 0; //RI清零,重新接收 ES = 1; } 68 天津科技大学2013届本科生毕业设计 void scan_key() //按键检测函数 { if(key1==0) key= 1; if(key2==0) key= 2; if(key3==0) key= 3; if(key4==0) key= 4; } 69
/
本文档为【基于单片机的行车记录仪的设计】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑, 图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。 本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。 网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。

历史搜索

    清空历史搜索