车载gps定位终端_毕业设计
?
毕 业 论 文
?
?
题 目 车载GPS定位终端
英文题目 Vehicle GPS Position Terminal
毕业设计(论文)原创性声明和使用授权说明
原创性声明
本人郑重承诺:所呈交的毕业设计(论文),是我个人在指导教师的指导下进行的研究工作及取得的成果。尽我所知,除文中特别加以标注和致谢的地方外,不包含其他人或组织已经发表或公布过的研究成果,也不包含我为获得 及其它教育机构的学位或学历而使用过的材料。对本研究提供过帮助和做出过贡献的个人或集体,均已在文中作了明确的说明并表示了谢意。
作 者 签 名: 日 期:
指导教师签名: 日 期:
使用授权说明
本人完全了解 大学关于收集、保存、使用毕业设计(论文)的规定,即:按照学校要求提交毕业设计(论文)的印刷本和电子版本;学校有权保存毕业设计(论文)的印刷本和电子版,并提供目录检索与阅览服务;学校可以采用影印、缩印、数字化或其它复制手段保存论文;在不以赢利为目的前提下,学校可以公布论文的部分或全部内容。
作者签名: 日 期:
学位论文原创性声明
本人郑重声明:所呈交的论文是本人在导师的指导下独立进行研究所取得的研究成果。除了文中特别加以标注引用的内容外,本论文不包含任何其他个人或集体已经发表或撰写的成果作品。对本文的研究做出重要贡献的个人和集体,均已在文中以明确方式标明。本人完全意识到本声明的法律后果由本人承担。
作者签名: 日期: 年 月 日
学位论文版权使用授权书
本学位论文作者完全了解学校有关保留、使用学位论文的规定,同意学校保留并向国家有关部门或机构送交论文的复印件和电子版,允许论文被查阅和借阅。本人授权 大学可以将本学位论文的全部或部分内容编入有关数据库进行检索,可以采用影印、缩印或扫描等复制手段保存和汇编本学位论文。
涉密论文按学校规定处理。
作者签名: 日期: 年 月 日
导师签名: 日期: 年 月 日
摘 要
随着经济的发展,人口的增加和车辆的普及使得各地交通成为大众关注的问题,因此为了解决交通问题,随即出现了智能的车载GPS定位终端,它是智能公交系统的一个重要的组成部分,在城市交通优越的背景下,为了缓解城市交通拥堵的现象,就必须大力发展公交事业。智能公交系统的建设可以改善公交公司的企业管理方法,提高公交系统的运营效率与服务水平,是城市公交事业发展重要的一步。
本文在参考大量文献、熟悉相关设计的基础上,结合先进的GPS、GPRS技术,提出了基于单片机控制的公交车载终端的设计与实现方法,包括硬件电路设计、软件代码的编写、整机调试等内容。文章详细说明了终端的功能,并提出了相应的设计方案,给出了具体硬件设计的原理图,在软件设计中画出了比较详尽的程序流程图,给出了主要功能模块函数。最后对通过了的终端进行了整体的调试展示。
本设计使用方便,而且稳定,可将实时信息连续发送给监控中心,达到对终端的及时定位,在液晶显示屏上还可显示当前时间,符合大众需求,很有实用价值。
关键词:全球定位系统,通用分组无线服务技术Abstract
With the development of economy,the increase of population and the popularity of vehicle lead to traffic becoming more attentive problem. Intelligent vehicle GPS position terminal came in order to solve the traffic problems, which is an important component of intelligent bus system. Under the advantageous background of urban traffic, we must forcefully develop public transport business in order to alleviate the congestion of urban traffic. The construction of intelligent bus system can improve the managing methods of the bus company and improve the operating efficiency and service levels of the public transportation system which is an important development step for urban public transport.
In this paper, referring to a lot of literatures and designs and combinating of advanced technology on GPS, GPRS, bus terminal design and implementation controlled by MCU are proposed, including hardware design, software code writing, debugging machine and so on. The function of the terminal is described in detail.the corresponding design and a specific hardware design schematics are gram flow chart are drawn thoroughly in software design.the main modules function is proposed.Finally, the terminal is tested.
This design is stable and easy to use with real-time information be sent continuously to the monitoring center to locate the terminal timely.The current time can display on the LCD screen which is very practical and meeting popular demand.
Key words:Global Positioning System, General Packet Radio Service, Terminal
目 录
摘 要 I
Abstract II
1 绪论
1.1 选题背景 (1)
1.2 选题意义 (1)
1.3 本课题国内外现状 (2)
2 GPRS和GPS介绍
2.1 GPS全球定位系统的简介 (3)
2.2 GPRS简介 (4)
3 系统设计
3.1 设计要求 (5)
3.2 设计思想 (5)
3.3 使用的硬件 (5)
3.4 所用的软件 (12)
3.5 设计的难点 (13)
3.6 小结 (13)
4 功能电路模块的实现
4.1 STC单片机基本电路模块 (14)
4.2 Max232电路设计 (16)
4.3 显示模块 (17)
4.4 小结 (17)
5 硬件实现
5.1 绘制PCB图 (18)
5.2 制作电路板 (20)
5.3 焊接 (22)
5.4 硬件测试 (24)
5.5 小结 (28)
6 软件设计
6.1 实现ME3000模块通信 (29)
6.2 GPS格式 (32)
6.3 单片机寄存器 (34)
6.4 程序设计 (37)
6.5 小结 (46)
7 系统测试
结束语 (51)
附 录 (53)
致谢 (62)
参考文献 (63)
1 绪论
1.1 选题背景
我国近几年来交通运输行业得到了快速高效的发展,显现出一番蓬勃繁荣的景象,但是这也带来很多的问题,首先,长途客车和货车由于长时间的工作,存在很多的安全隐患,给人民的生命安全和财产安全带来了很大的危害。其次,这几年我国机动车辆数量迅速增加,交通拥塞现象很普遍。再者,公安巡逻、医疗急救车、押款车等都要对其进行合理的调度和安全的保障。为了解决以上诸多问题,车载GPS终端便在我们身边发展起来了。
关于GPS车载终端这方面的研究,我国还处于初级阶段,但经过长期的努力,已取得了很大的成就。我国汽车GPS导航基本推广,各行各业无不受到影响,给我国很多行业的管理发展提供了强力的手段,也给人们带来了便利,比如申通公司,它可以让客户查快件的当前位置和路线,它提供了卫星、地图、地形三种方式,其可用性和适用性较为理想,还有在全国公交查询系统中也提供了路线查询,能更好的服务于人民。尤其自2000年以来,随着GPRS无线通信技术的发展,利用GPRS网络进行数据传输成为车载终端的理想选择方式,再加上GPS定位的准确性为其提供了技术手段,因此车载终端的发展已成为必然。
1.2 选题意义
动态交通信息服务一直是智能交通领域的研究热点问题,科学技术的发展拉近了人们的距离,也成功的服务于人民,这样一来,人们的活动范围逐渐增大,对即时监控和一些突发事件的实时获取便有了很大的困难,但这些影响着人们的正常生活,时刻威胁着人民的生命安全和财产安全。因此为了解决这些问题,有很多的方案出现在我们的眼前,但是还要考虑很多的问题,比如:价格、外形、通用性等。
近年来,随着人们生活水平的不断提高,汽车逐渐进入家庭,并成为生活的必需品,未来几年内汽车的增长速度还将会大幅度上升。车载GPS系统具有巨大的市场潜力和不可估量的发展前景[1]。
采用ME3000通信模块接入网络,利用单片机控制串口接收的GPS信息并进行处理,再将有用信息用ME3000模块通过网络传送,从而达到对有车载终端装置的物体进行实时的监控和突发事件的获取。本装置稳定性好,价格便宜且具有很高的通用性,并且GPRS技术提供了通信的最佳方式,也具有普遍性,综上所述,车载终端会有很大的市场前景。
1.3 本课题国内外现状
国外对车辆导航与监控系统的研究比较早,尤其北美、欧洲、日本等地,这方面的技术都非常先进,最初他们只应用于军事上,而近十年来车辆导航与监控系统的研究已达到相当高的水平,开发了各种智能的导航定位监控装置,并广泛的应用于汽车上。
在美国,美国城市公交管理局(UMTA)已经启动了智能公共交通系统项目。经过现场试验,UMTA对此项目评价很高,一些开发公交车队管理系统的公司,已经采用自动确定车辆位置的全球定位系统和计算机辅助发车系统等,进行实时管理公共汽车的运营,并开发了一些先进的系统。在日本,公共交通综合管理系统包括累计运营数据、乘客计数、监视和控制公共汽车运营和乘客服务等功能,其中乘客服务功能中包括进站汽车、信息查询和公共交通与铁路接驳信息提示。公共交通综合管理系统的硬件包括公交主控中心、区域中心以及路边、车库和车载设备等,其水平在世界前列[2]。
而对于我国而言,智能导航与监控系统应用经历了缓慢的发展道路,起初是把电子技术应用于交通运输和管理,后来GPS(Global Positioning System)卫星定位技术应引入我国,主要用在大地测量、海上渔业和车辆定位等领域。直到1998~2000年间,随着无线通信技术的发展,我国车载监控系统才得到发展。杭州、北京、大连等几座大城市已在部分公交线路上建成了公交车辆跟踪调度系统,并安装了电子站牌,车载GPS定位设备,实现了对车辆的实时跟踪和定位,公交车与调度室的双向通讯、以及电子站牌上实时显示下班车位置等功能。但是和欧美相比还相差很远,因此具有很大的发展空间[3]。
2 GPRS和GPS介绍
2.1 GPS全球定位系统的简介
全球定位系统GPS(Global Positioning System),是一种可以授时和测距的空间交会定点的导航系统,可向全球用户提供连续、实时、高精度的三维位置,三维速度和时间信息。
1957年10月第一颗人造地球卫星上天,天基电子导航应运而生。美国从1973年开始筹建全球定位系统,1994年投入使用。经历20年,耗资300亿美元,是继阿波罗登月计划和航天飞机计划之后的第三项庞大空间计划。
GPS定位系统由三部分组成:GPS卫星空间部分、地面控制部分和用户GPS接收机。
GPS空间由24颗分布在6个等间隔轨道上的卫星组成,全球任何地方任何时间都不少于4颗卫星供观测,而这24颗中有3颗作为备用卫星。每个轨道上有4颗卫星,他们按与地球55度的相通方向运行,空间间隔为90度。 用户可以用4颗卫星确定4个导航参数:维度、经度、高度和时间。GPS接收机通过接收多颗卫星的信号来解算出自身的位置已实现定位和导航[4]。其原理如图2-1所示。
图2-1 GPS定位原理
上述四个方程式中待测点坐标x、?y、?z?和Vto为未知参数,其中di=cti?(i=1、2、3、4) di (i=1、2、3、4) 分别为卫星1、卫星2、卫星3、卫星4到接收机之间的距离。ti (i=1、2、3、4) 分别为卫星1、卫星2、卫星3、卫星4的信号到达接收机所经历的时间。 c为GPS信号的传播速度(即光速)。四个方程式中各个参数意义如下:x、y、z 为待测点坐标的空间直角坐标。 xi 、yi 、zi (i=1、2、3、4) 分别为卫星1、卫星2、卫星3、卫星4在t时刻的空间直角坐标,可由卫星导航电文求得。 Vti (i=1、2、3、4) 分别为卫星1、卫星2、卫星3、卫星4的卫星钟的钟差,由卫星星历提供。 Vto为接收机的钟差。
由以上四个方程即可解算出待测点的坐标x、y、z 和接收机的钟差VtoGeneral Packet Radio Service)是通用分组无线业务的英文简称,是GSM的延续GPRS和以往连续频道传输的方式不同,是以封包(Packet)式来传输,因此使用者所负担的费用是以其传输资料单位计算,并非使用其整个频道,理论上较为便宜。GPRS的传输速率可提升至56甚至114Kbps3 系统设计
3.1 设计要求
(1)接收GPS信息并通过单片机对其进行处理。
(2)将所需信息发送给监控中心。
(3)对监控中心的命令进行响应。
3.2 设计思想
由上面的设计要求可知,先要对GPS接收的信息进行分析,得知其数据的格式和相应的意义,将有用的数据处理之后用1602液晶显示屏显示出来。要了解AT指令,将GPRS模块通过串口程序的控制可以通信上网,再将相应的AT命令用单片机通过串口控制发送给GPRS模块,以实现和监控中心通信。
3.3 使用的硬件
3.3.1 GPRS模块
其模块上有中兴公司的ME3000、L1084D等硬件器件,如下图3-1所示。
图3-1 GPRS模块
ME3000模块的主连接器有40管脚连接器和10管脚连接器两种,管脚间距为1.27mm。管脚说明如图3-2和3-3所示[5]。
图3-2 ME300040管脚连接器
图3-3 ME300040管脚连接器
10管脚连接器的管脚除了1-4接地外,其他悬空。40管脚连接器我们不需要都有很详细的了解,但是对于很重要且和本设计密切相关的要掌握其作用和意义,主要管脚定义如表3-1所示[5]。
表3-1 ME3000引脚介绍
功能 管脚号 信号名称 输入/输出 基本功能 SIM卡接口 4 CARD_DATA 双向 数据线 6 CARD_CLK 输出 时钟线 8 V_CARD 输出 CARD电源 2 CARD_RST 输出 复位信号 电源 23 GND 地 24 GND 地 22 V_MAIN 输入 模块主电源 19 V_MAIN 输入 模块主电源 21 V_MAIN 输入 模块主电源 串口1 13 TXD 输出 模块发送数据给用户 11 RXD 输入 模块从用户接收数据 12 /CTS 输出 模块允许用户发送数据 14 /RTS 输入 用户请求模块允许发送数据 17 /DSR 输出 模块准备好 16 /DTR 输入 用户电路准备好 灯 28 SMS_LED 输出 来电、来短信指示灯 30 SLG_LED 输出 网络信号指示灯 复位 10 /RESET 输入 ME3000模块电源由V_MAIN提供,电压特性如表3-2所示。
表3-2 ME3000电压特性表
分类 最小值 典型值 最大值 输入电压 3.3V 3.9V 4.25V L1084D为可调低压差线性稳压器 地址锁存允许信号输出引脚/编程脉冲输入引脚 31 EA/VPP 外部程序存储器地址允许输入/编程电压输入信号 29 PSEN 片外ROM读选通信号 并行I/O口引脚 32-39 P0 8位双向I/O口引脚或数据/地址总线低8位复用 1-8 P1 8位准双向I/O口 21-28 P2 8位准双向I/O口引脚或高8为地址总线 10-17 P3 8位准双向I/O口引脚和第二功能
P3口第二功能介绍如表3-5所示[6]。
表3-5 P3口第二功能定义
引脚 第二功能 信号名称 P3.0 RXD 串行数据接收 P3.1 TXD 串行数据发送 P3.2 INT0 外部中断0申请 P3.3 INT1 外部中断1申请 P3.4 T0 定时/计数器0的外部输入 P3.5 T1 定时/计数器1的外部输入 P3.6 WR 外部RAM的写选通 P3.7 RD 外部RAM的读选通 3.3.3 Max232
Max232该产品是有德州仪器公司(TI)推出的一款兼容RS232标准的芯片。其作用就是用来电平转换的,外形如图3-7所示。
图3-7 Max232外形
该芯片有三部分组成:第一部分是电荷泵电路。由1、2、3、4、5、6脚和4只电容构成。功能是产生+12v和-12v两个电源,提供给RS-232串口电平的需要。第二部分是数据转换通道。由7、8、9、10、11、12、13、14脚构成两个数据通道。 其中13脚(R1IN)、12脚(R1OUT)、11脚(T1IN)、14脚(T1OUT)为第一数据通道。 8脚(R2IN)、9脚(R2OUT)、10脚(T2IN)、7脚(T2OUT)为第二数据通道。TTL/CMOS数据从T1IN、T2IN输入转换成RS-232数据从T1OUT、T2OUT送到电脑DB9插头;DB9插头的RS-232数据从R1IN、R2IN输入转换成TTL/CMOS数据后从R1OUT、R2OUT输出。 第三部分是供电15脚GND、16脚VCC。 主要特点1)符合所有的RS-232C技术标准
(2)只需要单一 +5V电源供电3)片载电荷泵具有升压、电压极性反转能力,能够产生+10V和-10V电压4)功耗低,典型供电电流5mA
(5)内部集成2个RS-232C驱动器
(6)内部集成两个RS-232C接收器接地接电源(+5V)液晶显示器对比度调整端,接正电源时对比度最弱,接地电源时对比度最高(对比度过高时会产生“鬼影”,使用时可以通过一个10K的电位器调整对比度)。RS为寄存器选择,高电平1时选择数据寄存器、低电平0时选择指令寄存器。R/W为读写信号线,高电平(1)时进行读操作,低电平(0)时进行写操作。E(或EN)端为使能(enable)端,下降沿使能。低4位三态、 双向数据总线 0位(最低位)低4位三态、 双向数据总线 1位低4位三态、 双向数据总线 位低4位三态、 双向数据总线 位低4位三态、 双向数据总线 位低4位三态、 双向数据总线 位低4位三态、 双向数据总线 位高4位三态、 双向数据总线 7位(最高位)(也是busy flag背光电源正极背光电源正极Proteus软件是英国Labcenter electronics公司出版的EDA工具软件(该软件中国总代理为广州风标电子技术有限公司)。它不仅具有其它EDA工具软件的仿真功能,还能仿真单片机及外围器件。。智能原理图设计完善的电路仿真功能单片机协同仿真功能PCB设计平台较高的推广利用价值Keil C51软件提供丰富的库函数和功能强大的集成开发调试工具MedWin好用可以完成编辑、编译、连接、调试、仿真等整个开发流程。可用IDE本身或其它编辑器编辑C或汇编源文件。然后分别由C51及C51编译器编译生成目标文件(.OBJ)标准的Hex文件Proteus中将其写入单片机进行仿真。
(3)由于要制作电路板,所以要选择相应的PCB设计软件,但PCB设计软件很多,然而protel其运行速度快,占用系统资源少。在其运行过程中运行稳定,而且简单易学,方便实用AT指令的发送和返回实现,4 功能电路模块的实现
4.1 STC单片机基本电路模块
STC单片机具有高抗静电超强抗干扰8051内核的,所以它与8051单片机是兼容的。基本电路模块、复位电路、晶振电路标准的RS232的DB9接口有9,:DSR(数据装置准备好DTR(数据终端准备好RTS(请求发送CTS(允许发送DCD(接收线信号检出RI(振铃指示TXD(发送数据RXD(接收数据GND(接地)[11]。然而,这次设计中,只需要接三条线就可以了,其DB9所用到的引脚定义
引脚 引脚名 引脚定义 2 RXD 数据接收 3 TXD 数据发送 5 GND 接地 4.3 显示模块
根据第二章的引脚的介绍,其电路连接如图4-5所示。
图4-5 1602电路
4.4 小结
对前一章有个充分的了解后,我们就对工作电路有了一个较为合理的思考,才一步一步的对各个电路模块进行构造,从而画出原理图,这样的话既能清晰我们的思路,同时有保证了以后工作能更好更快的进行下去,在这一章中实现了各个模块的原理图,那么在硬件实现时就按照这写模块电路进行组装,只要把握好每个器件的封装,相信就能有个好的结果。5 硬件实现
5.1 绘制PCB图
上一章中我已经介绍了功能模块,完成了Sch电路,如图5-1所示。
图5-1 整体电路
上图中显示单元1602液晶显示屏在库中找不到,因此要自己绘制,具体模块也在上一章中介绍过了,接下来就是要绘制PCB电路了,在绘制过程中应注意一下几个方面的内容:
(1)整个电路板的布局。要将每个器件分布的紧凑,以免使作品的体积过大,这样不但给制作电路板带来了困难,而且会浪费电路板。而且要放在合适的位置,不要给布线带来不必要的麻烦。
(2)每个元件的封装。对于不知道封装的器件,要准确的测量,不要板子做完了后悔莫及,对于电容、电阻等器件,没必要那么精确,在允许的情况下,可合理的改动。
(3)布线。合理布线对整个系统极为重要,要把握好线的宽度和每个焊盘的大小。
完成了PCB图的设计并焊接后,发现1602液晶显示屏的数据引脚和STC12C5A60S2的P2口接反了,这给以后的编程带来了很大的麻烦,因此第一次就这样以失败而告终,不得不重新做修改电路,再做一个板子了。修改完的PCB图如5-2图所示。
图5-2 PCB电路图
完成了PCB图的绘制之后,好好的进行检查,也可以让身边的人帮自己看看,这样更能发现错误。这时候要考虑制作的板子是否把每个器件都能合适的插上去,器件与器件之间的距离,有些器件体型如果不考虑的话,到时候一个会挡住另一个,虽然只有一点点,但却会给焊接带来很大的麻烦,甚至可能会作废制作的板子。
5.2 制作电路板
由于PCB打样费用比较昂贵,而且费时,因此大多数人会自己做,我已经画好的PCB图,那么下一步就是做电路板了。制作电路板有很多种方法,而感光法来制作电路板是最好的,因为这种方法精度高、成功率高,是目前20cm×20cm透明玻璃和四个大的夹子 将打印好的电路图紧紧贴在感光板上 日光灯 对感光板曝光。 显影剂 用于感光板显影 三氯化铁 用于感光板蚀刻 钻孔工具 插入元件
在制作板子前首先要先确定是否有已配制好的药液,如果没有要及时配制,尤其是显影液的配制,把握不好比例就会使显影失败。还要对曝光时间进行把握,因为天气的变化会影响曝光时间的长短。因此要对二者进行测试,已达到最好的效果。步骤可分为一下7个部分:
(1)打印
用激光打印机将PCB图打印到菲林纸上。在打印之前要设置打印选项,因为图是在底层的,所以要选择打印底层并选择打印孔不需要镜像。8到91到3将显影剂(烧碱)与水按1:20的比例配置好,如果实在是没有测量工具的话可以先在容器倒入一矿泉水瓶的三分之一水量,然后放入约为小手指大小的显影剂,混合均匀后,放入一小块的感光板实验一下,之后根据它的反应来调整显影剂的浓度。然后将曝光好的板子放入其中显像,并微微晃动让板子表面的显影液均匀流动。显影剂配置的好的话,只要几分钟就能看到最终效果:除线路和焊盘上一层绿色的感光膜外,其他地方均为裸露的红色铜。蚀刻将三氯化铁按与水的比例为4:6配置好,将显影好的板子放入装有三氯化铁溶液的塑料盆中(不要用金属盆,特别是铜的),蚀刻电路板,在蚀刻的同时,如果给溶液加热的保持温度在50-60度之间,温度越高蚀刻速度越快。最终效果:除有线路的地方有感光膜覆盖铜线外,其他地方的铜均已被腐蚀掉,剩下绝缘的基板这样电路板就算是做好了。0.8mm的钻头[9]。
5.3 焊接
现在板子制作完了,就该找所需器件了,如表5-2所示。
表5-2 所需器件
器件名称 数量 备注 STC12C5A60S2 1 MCU Max232 1 RS232转换 DB9RA(M) 1 串口(公),下载程序,GPS接口 DA9RA(F) 1 串口(母),GPRS模块接口 DIP40 1 单片机座 DIP16 1 Max232座 4K7 2 复位和电源指示灯 10K 1 复位用 排阻 1 上拉电阻 发光二极管 1 电源指示灯 22u电容 1 复位用 104电容 5 RS232电路 30p电容 2 晶振 短路子 若干 交叉线选择用 1620液晶显示屏 1 显示GPS信息 单列插槽 1 1602用 晶振 1 电源插座 1 不带锁开关 1 复位 微调电阻 1 调节1602亮度 找完元件后,就开始焊接,首先要准备好焊接所需的工具,有40W电烙铁带烙铁架、锡丝、镊子、剪刀、小刀、斜口钳、吸锡器等。在这个过程中首先要焊接小元件和藏在大器件下面的元件,最重要要注意锡的量,如把握不好,麻烦就来了。现将焊接步骤总结如下:
(1)准备施焊:右手拿电烙铁,左手拿焊锡丝,采用握笔式。
(2)加热焊接点:将烙铁边侧放置于焊件与焊盘形成的直角处,使焊接点升温。
(3)送入焊锡丝:及时将焊锡丝放置到电烙铁焊接处的对面,同时接触焊盘和引脚。
(4)移开焊锡丝:落在焊盘上的焊料适量后,迅速移开焊锡丝。
(5)移开电烙铁:当焊盘上的焊料接近饱满,充分浸润在焊盘和焊件之间,在焊锡最光亮,流动性最强时,及时迅速地移开电烙铁,移开的时候往上稍稍提拉(完全一次焊接过程所用的时间大约2-4如图
图5-6 接收数据
由于ZTEMe3000串口调试助手是自行用C#编写的,所以只针对中兴公司ME3000模块的,每个类型的GPRS的AT指令是不一样的,所以其他模块就不管用了,至于怎么编写的这里就不做介绍了,里面定义了几个类,也较为复杂,现给出主要函数名称,以供参考。
private void buttonCOMOpen_Click(object sender, EventArgs e); //打开串口
private void OnOpenCOM(string openText); //串口打开成功
private void OnCloseCOM();//串口关闭
private void OnRecv(string recInf) ;//接收数据
private void buttonComSend_Click(object sender, EventArgs e);//通过串口发送
private void buttonModelInit_Click(object sender, EventArgs e) ;//模块初始化
private void GetNetInf(string netInf) ;//获取网络状态
private void GetCSQ(string csqInf) ;//获取信号强度
private void OpenAllFunc(string openInf) ;//打开所有功能
private void GetGPRSStatus(string GPRSStatusInf); //查询GPRS连接状态
private void GPRSOpen(string GPRSOpenInf); //连接GPRS
private void GetIPAddress(string IPInf) ;//查询IP地址
private void buttonConnect_Click(object sender, EventArgs e) ;//连接服务器
private void Connecting(string connectingInf); //等待连接应答
private void buttonSend_Click(object sender, EventArgs e) ;//TCP发送信息
private void StatusOpenCom();//打开串口时控件状态
private void ControlStatusInitMOk();//模块初始化成功状态
private void ControlStatusTCPConnect();//tcp连接成功
private void AddRecordInf(string recordInf); //加入流水信息
private string[] GetComArg();//读取串口参数
private void StatuesOpenComConTrl();//打开串口控件状态
private void StatuesCloseComContrl();//关闭串口时的状态
private void StatusSuccessInitModle();//模块初始化成功
private void ThreadTcpSending();//发送信息
private void StatusTCPConnected();//连接TCP服务器成功
(2)测试1602液晶显示屏
用C语言编写程序,实现在1602液晶显示屏上显示Jiujiang Welcome You,从而测试焊接好的电路是否正常,首先将写好的程序编译、执行,产生hex文件,再用软件通过串口将其烧入单片机中,软件截图如下图5-7所示。
图5-7 写入程序
由上图可以看到,在写入程序之前,还要选择单片机的型号、最高波特率和最低波特率等,打开程序文件点击下载,然后上电,这样就可以成功的的将程序写入单片机,现在可以看出,已经将程序成功的将程序烧入单片机,接下来就是看看效果了。
将1602液晶显示屏插上去,然后上电复位,这是就能看到所预期的效果了,成功之后,看看效果如图5-8所示。
图5-8 电路测试
5.5 小结
这章主要是硬件的实现,而前几章我们对整个系统的设计打下了基础,这一章将第三章各个模块的原理图组合之后得到系统总原理图,根据这个原理图画出PCB图。采用这章介绍的方法制作电路板和焊接,然后测试电路是否正常,这对以后的软件编程相当重要。6 软件设计
说到软件设计,先要从全区考虑,以免所设计的软件不能达到预期目标,车载终端首先要接收GPS信息并进行处理显示,在将所需信息发给监控中心,结构如下图6-1所示。
图6-1
6.1 实现ME3000模块通信
要想和监控中心通信,就先得用微机控制模块进行通信,以得知模块通信的具体过程和所用到的指令,这样才能进行程序设计,达到所预期的效果。因此就要对此模块的AT指令特别熟悉,系统常用AT指令格式如表6-1、表6-2、表6-3、表6-4、表6-5、表6-6所示 [10]。
表6-1 AT+ZIPSEND向目标地址发送TCP数据
描述 该指令用于向绑定的TCP服务器发送数据 格式 AT+ZIPSEND=port,lengthCR
提示’’后再发送数据 示例 AT+ZIPSEND=1,10
ziyoufengCR
+ZIPSEND:OK
OK 在成功连接服务器后,向TCP服务器发送数据,发送10个字节的数,ziyoufeng 参数 port:TCP连接数目为1个,值为1.
Length:数据长度(最大支持1000个字符,支持0x00-0xff发送)。 表6-2 AT+ZIPSETUP:建立TCP服务器链接
描述 该指令用于链接到TCP服务器 格式 AT+ZIPSETUP=N,IP,M 示例 AT+ZIPSETUP=1,332
+ZIPSETUP:CONNECTED 连接到TCP服务器 参数 N:TCP连接数目为1个,值为1.
IP:为一个目标地址IP值,*.*.*.*。*范围为0-255.
M:端口号 表6-3 AT+ZPPPOPEN:打开GPRS数据链接
描述 该指令用于打开打开GPRS数据链路 格式 AT+ZPPPOPEN 示例 AT+ZPPPOPEN
+ZPPPOPEN:CONNECTED
OK 表6-4 AT+ZPPPSTATUS:查询GPRS连接状态
描述 该指令用于查询GPRS链路状态 格式 AT+ZPPPSTATUS 示例 AT+ZPPPSTATUS
+ZPPPSTATUS:ESTABLISHED
OK 查询GPRS链路状态 表6-5 AT+ZIPCLOSE:关闭TCP链接
描述 该指令用于关闭TCP链路 格式 AT+ZIPCLOSE=N 示例 AT+ZIPCLOSE=1
OK 关闭TCP链路 参数 N:TCP连接数目为1个,值为1. 表6-6 AT+ZPPPCLOSE:关闭GPRS数据连接
描述 该指令用于关闭GPRS数据链路 格式 AT+ZPPPCLOSE 示例 AT+ZPPPCLOSE
OK 打开串口超级终端,按照以下步骤进行输入指令,就可以连接并通信成功(要有用的IP和端口号)。
(1)打开gprs 建立TCP/UDP服务器连接关闭TCP/UDP连接这些信息在没有经过分类提取之前是无法加以利用的因此,必须通过程序将各个字段的信息从缓存中提取出来,将其转化成有实际意义的的数据主要由帧头、帧尾和帧内数据组成,根据数据帧的不同,帧头也不相同,主要有$GPGGA、$GPGSA、$GPGSV以及$GPRMC等。通常的情况,我们所关心的定位数据如经纬度、速度、时间等均可以从$GPRMC帧中获取得到,该帧的结构及各字段释义如下:
$GPRMC,1,2,3,4,5,6,7,8,9,10,11*hh
1 当前位置的格林尼治时间,格式为hhmmss
2 状态, A 为有效位置, V为非有效接收警告,即当前天线视野上方的卫星个数少于3颗。
3 纬度, 格式为ddmm.mmmm
4 标明南北半球, N 为北半球、S为南半球
5 径度,格式为dddmm.mmmm
6 标明东西半球,E为东半球、W为西半球
7 地面上的速度,范围为0.0到999.9
8 方位角,范围为000.0到 359.9 度
9 日期, 格式为ddmmyy
10 地磁变化,从000.0到 180.0 度
11 地磁变化方向,为E 或 W
至于其他几种帧格式,除了特殊用途外,平时并不常用,虽然接收机也在源源不断地向主机发送各种数据帧,但在处理时一般先通过对帧头的判断而只对$GPRMC帧进行数据的提取处理在处理缓存数据时一般是通过搜寻ASCII码$来判断是否是帧头,在对帧头的类别进行识别后再通过对所经历逗号个数的计数来判断出当前正在处理的是哪一种定位导航参数,并作出相应的处理。$GPRMC,152654.082,A,2940.8967,N,11600.5562,E,0.00,0.00,070511,,,A*6A
;$GPRMC,1,2,3,4,5,6,7,8,9,10,11,12*hhCRL
;;1 UTC时间,hhmmss(时分秒)格式
;;2 定位状态,A=有效定位,V=无效定位
;;3 纬度ddmm.mmmm(度分)格式(前面的0也将被传输)
;;4 纬度半球N(北半球)或S(南半球)
;;5 经度dddmm.mmmm(度分)格式(前面的0也将被传输)
;;6 经度半球E(东经)或W(西经)
;;7 地面速率(000.0~999.9节,前面的0也将被传输)
;;8 地面航向(000.0~359.9度,以真北为参考基准,前面的0也将被传输)
;;9 UTC日期,ddmmyy(日月年)格式
;;10 磁偏角(000.0~180.0度,前面的0也将被传输)
;;11 磁偏角方向,E(东)或W(西)
;;12 模式指示(仅NMEA0183 3.00版本输出,A=自主定位,D=差分,E=估算,N=数据无效)
;;逗号计数为1之后是A有效V无效信息,逗号计数为8之后是日月年信息,注意提取!
6.3 单片机寄存器
对于单片机的编程,不仅要对各个引脚功能和存储空间进行熟悉,还要对各个寄存器要有个必要的了解,寄存器介绍如表6-7、表6-8、表6-9、表6-10、表6-11、表6-11、表6-12表、6-13、表6-14所示[12]。
表6-7 定时器 / 计数器方式选择TMOD
D7 D6 D5 D4 D3 D2 D1 D0 GATE C/T M1 M0 GATE C/T M1 M0 TMOD的低4位为定时器0的方式字段,高4位为定时器1的方式字段。门控制位 GATE=0 时是软件启动定时器,即用指令使TCON中的TR1(TR0)置1即可启动定时器1(定时器0)。 C/T为定时、计数 方式选择位。 当C/T=0 时为定时方式 ,C/T=1 时计数方式。
M1M0,M0M1=00 时为方式 0 、 M1M0=10 时为方式 1 , M1M0=11 时为方式 3。
M1和M0的功能如表6-8所示。
表6-8 M1和M0功能
M1 M0 工作方式 功能说明 0 0 方式0 13位计数器 0 1 方式1 16为计数器 1 0 方式2 自动重装如初值8位计数器 1 1 方式3 定时器0:分为两个独立的8位计数器
定时器1:停止计数 表6-9 中断标志与中断控制寄存器TCON
D7 D6 D5 D4 D3 D2 D1 D0 TF1 R1 TF0 TR0 IE1 IT1 IE0 IT0 TR1、TR0 是 T1 、T0 的启动控制位,置 1 起动。置 0 停止定时 / 计数器。 TF1 、 TF0 分别是定时器1和定时器0 的溢出标志位,溢出时由硬件置 1 ,CPU 响应中断后由硬件清0,软件查询时由软件清0。
IT0 、 IT1 为外部中断触发方式选择位,IT0/1=0 时为电平触发=1时下降沿触发。
IE0 、 IE1 为请求标志位,当有中断信号时由硬件置1,完成中断时由硬件清 0。
表6-10 中断允许控制寄存器IE
D7 D6 D5 D4 D3 D2 D1 D0 EA ――― ――― ES ET1 EX1 ET0 EX0 EA:总控位, EA=0 时关所有中断。 EA=1 时所有中断请求均被开放。
ES:串行口, ES=1 时开, ES=0 时关串行中断
ET1、ET0 为定时器1和定时器0中断允许位。 EX1、EX0 为外部中断1和外部中断允许位,=1时开,=0时关。
表6-11中断优先级控制寄存器IP
D7 D6 D5 D4 D3 D2 D1 D0 ――― ――― ――― PS PT1 PX1 PT0 PX0 PS:为串口中断优先级控制位。 PT1、PT0分别为定时器1和定时器0中断优先控制位。PX1/0为外部中断优先级控制位,=1高优先=0低优先。
表6-12 串行控制寄存器SCON
D7 D6 D5 D4 D3 D2 D1 D0 SM0 SM1 SM2 REN TB8 RB8 TI RI 表6-13 串行工作方式选择位SM0
SM0 SM1 工作方式 说明 波特率 0 0 方式 0 同步移位寄存器 Fosc/12 0 1 方式 1 10 位异步收发 由定时器4控制 1 0 方式 2 11 位异步收发 Fosc/32/64 1 1 方式 3 11 位异步收发 由定时器4控制 SM2:是多机通信控制位,主要用于 2 和 3 。仅用于接收。对于方式 2 和 3 若 SM2=1 ,允许多机通信,只有当接收到第 9 位数( RB8 )为 1 时,才接收前 8 位数送入 SBUF ,并向 RI 位产生中断请求,否则前 8 位数丢弃。 SM2=0 时,无论 RB8 是 0/1 都将前 8 位数装入 SBUF 中并产生中断请求。在方式 0 进不用 SM2 时必须设为 0 。在方式 1 时,若 SM2=1 时则只有接收到有效停止位时 RI 才置 1 。 REN 允许接收位, REN =1允许接收,否则不允许。
TB8:为发送的第 9 位数(在方式 2 、3 时),可用作校验位,在多机通信中,用 TB8 的状态表示主机发送的是地址还是数据。 TB8=1 时表示地址。=0时表示数据。
RB8:是接收数据第 9 位(方式 2 、3 )还代表接收数据的特征,可能是校验或地址 / 数据标志
TI:发关中断标志位 RI: 接收中断标志位。由软件清 0 。串行接收必须满足 REN=1,RI=0。
表6-14 电源控制寄存器PCON
D7 D6 D5 D4 D3 D2 D1 D0 GF1 GF0 PD IDL PCON主要是为CHMOS型单片机的电源控制而设置的专用寄存器,单元地址是87H,当SMOD=1时,串行口波特率加倍。系统复位默认为SMOD=0。PD=0 单片机处于正常工作状态。PD=1 单片机进入掉电(Power Down)模式 ,可由外部中断或硬件复位模式唤醒,进入掉电模式后,外部晶振停振,CPU、定时器、串行口全部停止工作,只有外部中断工作。IDL=0 单片机处于正常工作状态。IDL=1 单片机进入空闲(Idle)模式,除CPU不工作外,其余仍继续工作,在空闲模式下可由任一个中断或硬件复位唤醒。
图6-3 系统主程序流程图
6.4.1 初始化
对整个系统的结构有了一个初步的把握以后,就可以进行具体的功能模块的程序实现了,首先要对系统进行初始化,这样以保证整个系统的稳定性,而STC有双串口,因此要对相应的寄存进行定义,如下所示:
void UartFInit(void) //115200bps@11.0592MHz
{
PCON = 0x7f; //波特率不倍速
SCON = 0x50; //8位数据,可变波特率
AUXR |= 0x40; //定时器1时钟为Fosc,即1T
AUXR = 0xfe; //串口1选择定时器1为波特率发生器
TMOD = 0x0f; //清除定时器1模式位
TMOD |= 0x20; //设定定时器1为8位自动重装方式
TL1 = 0xFD; //设定定时初值
TH1 = 0xFD; //设定定时器重装值
ET1 = 0; //禁止定时器1中断
TR1 = 1; //启动定时器1
}
void UartSInit(void) //9600bps@11.0592MHz
{
AUXR = 0xf7; //波特率不倍速
S2CON = 0x50; //8位数据,可变波特率
BRT = 0xDC; //设定独立波特率发生器重装值
AUXR |= 0x04; //独立波特率发生器时钟为Fosc,即1T
AUXR |= 0x10; //启动独立波特率发生器
}
/******************初始化LCD*********************/
void LCD_initial(void)
{LCD_write_instruction(LCD_AC_AUTO_INCREMENT|LCD_MOVE_DISENABLE);
LCD_write_instruction(LCD_DISPLAY_ON|LCD_CURSOR_OFF);
LCD_write_instruction(LCD_DISPLAY_DOUBLE_LINE);
LCD_cls();
}
6.4.2 GPS数据接收处理
初始化串口之后,就开始接收数据,对接收的数据首先要进行提取,再将所需数据进行格式转换,对时间调整之后就可以正确显示了,此模块流程图如6-4所示。
图6-4 数据接收处理
接收完数据之后要对相应的数据进行处理,首先是时间,北京时间是格林威治时间加8小时,这样的话就要考虑很多的事情,在特殊情况下,相加大于24小时时要对年月日进行相应的处理,使整个系统稳定,不会出错,时间处理函数如下:
/********时间转换和调整*************/
void TimeGpsStrToNormal(Time* ptStruct)
{
char* time = GpsInf;
char* date = GpsInf + strlen(GpsInf)-7;
ubyte* yTablePt;
ptStruct-hour = (time[0]-0x30)*10 + (time[1]- 0x30);
ptStruct-minite = (time[2]-0x30)*10 + (time[3]-0x30);
ptStruct-second = (time[4]-0x30)*10 + (time[5]-0x30);
//date
ptStruct-day = (date[0] -0x30)*10 + (date[1] - 0x30);
ptStruct-month= (date[2] -0x30)*10 + (date[3] - 0x30);
ptStruct-year = (date[4] -0x30)*10 + (date[5] - 0x30);
//调整8个小时
ptStruct-hour += 8;
if(24 = ptStruct-hour)
{
ptStruct-hour -= 24;
if(CheckLYear(YEARBASE+ptStruct-year)) //调用函数对年月进行判断
{
yTablePt = lYTable;
}
else
{
yTablePt = pYTable;
}
ptStruct-day +=1;
if(yTablePt[ptStruct-month-1] ptStruct-day )
{
ptStruct-day -= yTablePt[ptStruct-month-1];
ptStruct-month += 1;
if(12ptStruct-month)
{
ptStruct-month -= 12;
ptStruct-year +=1;
date[4] = ptStruct-year/10 + 0x30;
date[5] = ptStruct-year%10 + 0x30;
}//month
date[2] = ptStruct-month/10 + 0x30;
date[3] = ptStruct-month%10 + 0x30;
}//day
date[0] = ptStruct-day/10 + 0x30;
date[1] = ptStruct-day%10 + 0x30;
}//hour=24
time[0] = ptStruct-hour/10 + 0x30;
time[1] = ptStruct-hour%10 + 0x30;
PrintTimeToStr(); //将时间转成字符串数字中
}
对于经纬度的处理和时间差不多,只是时间要考虑格林威治时间和北京时间的转换,而经纬度不需要。先要将其从ASCII码转换成浮点型,然而要想把所需信息在1602显示屏上显示出来就又要对数据进行转换,将其转换成字符串,这样才能成功的显示出来,处理经度的函数如下:
/*************接收的数据转换成浮点型***********/
float LongiStrToFloat(char* strLongi)
{ float longitude = 0;
longitude += (strLongi[3]-0x30)*10;
longitude += strLongi[4]- 0x30;
longitude += (strLongi[6]- 0x30)*0.1;
longitude += (strLongi[7]- 0x30)*0.01;
longitude += (strLongi[8]- 0x30)*0.001;
longitude += (strLongi[9]- 0x30)*0.001;
longitude /= 60.0;
longitude += (strLongi[0]-0x30)*100;
longitude += (strLongi[1]-0x30)*10;
longitude += strLongi[2]-0x30;
return longitude;
}
/************浮点型向字符串的转换*********/
void StringToFloat(uchar* strFloatPt,float value)
{
int temp=0;
float temp1=0;
int tempfor1=0;
ubyte charcount=0;
temp = (int)value;
tempfor1 = temp/100;
if(0 != tempfor1)
{
strFloatPt[0]=(ubyte)tempfor1+0x30;
}
tempfor1 =(temp%100)/10;
if(0 != tempfor1 || 0!=charcount)
{
strFloatPt[charcount++] = (ubyte)(tempfor1) +0x30;
}
strFloatPt[charcount++] = (ubyte)(temp%10)+0x30;
strFloatPt[charcount++] = .;
temp1=value-temp;
strFloatPt[charcount++] =(ubyte)(int)(temp1*10)+0x30;
strFloatPt[charcount++] =(ubyte)(int)(temp1*100)%10+0x30;
strFloatPt[charcount++] =(ubyte)(int)(temp1*1000)%10+0x30;
strFloatPt[charcount++] =(ubyte)(int)(temp1*10000)%10+0x30;
}
6.4.3 数据显示
前面通过对所需数据进行了采集,并进行了相关的处理和转换,那么就要将数据在1602液晶显示屏上显示出来了,具体模块程序如下:
/**********写入字符串到第x(1,2)行y(0,15)列***********/
void LCD1602_write_string(unsigned char x,unsigned char y,unsigned char *s)
{
unsigned char i=0;
x=(x-1)*0x40;//第几行
y=x+y; //第几列
LCD_write_instruction(0x80+y); //写指令到LCD
while(s[i]!=0x00) //写入字符串值
{
LCD_write_data(s[i]); //写一个字节数据到LCD
i++;
}
}
/*******写入字符到第x(1,2)行y(0,15)列**********/
void LCD1602_write_char(unsigned char x,unsigned char y,unsigned char dat )
{
unsigned char i=0;
x=(x-1)*0x40; //第几行
y=x+y; //第几列
LCD_write_instruction(0x80+y); //写指令到LCD
LCD_write_data(dat); //写入字符值
}
6.4.4 GPRS通信
GPS数据接收和处理的功能模块函数实现之后就可以考虑GPRS模块通信的问题了,在此,我已经很好的熟悉了AT指令,并对模块连接网络进行通信的过程都已经全部掌握,现在就开始程序设计,流程图如6-5图所示。
图6-5 GPRS通信
建立TCP连接之后就可给服务器发送数据了,现将模块函数定义如下:
/***************发送数据**************/
ubyte TcpSendDatas(uchar* buffer,ubyte len )
{
ubyte count = 0;
PrintStrF(TCPSend);
TI = 0;
if(0 != len/10)
{
SBUF = (len/10) + 0x30;
while(!TI)_nop_();
TI = 0;
}
SBUF = (len%10) + 0x30;
while(!TI)_nop_();
PrintStrF(CmdEnd);
for(;;)
{
RI=0;
while(!RI)_nop_();
if( == SBUF) //未连接
{
count = 0;
while(len--)
{
TI = 0;
SBUF = buffer[count++];
while(!TI)_nop_();
}
break;
}
count++;
if(40 == count) //等待时间过长退出
{
return 1;
}
}
return 0;
}
6.5 小结
这一章对各个模块功能的实现进行了函数实现,并在Keil软件中进行编译的,并没有出现什么大的错误,但是要想对GPS接收到的数据进行合理的格式处理和GPRS发送的数据是否正确进行判断的话,就要可视化的分析数据,因此可以将二者分别进行测试,将数据另一个串口发送出去,并且在电脑串口软件中显示出来,这样才能更好的做出判断,通过不懈的努力,基本功能基本实现,接下来就看代码的移植了。
7 系统测试
在上一章中已经实现了各个模块功能函数,现在最主要的工作就是把各个模块进行移植,并进行测试,以实现预期的效果。
对各个代码的移植也是个很繁琐的工作,尤其在延时和对数据格式的处理上,一不注意就会带来错误,而且一时间难以找到,还有在条件判定中也会很容易出现错误的,因此在此过程中对每个变量、数组下标都要格外注意。
为了对提取的GPS数据的处理结果是否正确加以肯定,就必须可视化的分析数据,将完成处理的数据通过另一个串口发送出去,再用微机接收并保存,数据如下:
UnDealGps:154825,A,2940.9184,11600.5449,0.00,0.00,070511
DoneGps:234825,A,2940.9184,11600.5449,0.00,0.00,070511
timebuffer:D05-07 T23:48:25
latitude:255.
UnDealGps:154826,A,2940.9184,11600.5449,0.00,0.00,070511
DoneGps:234826,A,2940.9184,11600.5449,0.00,0.00,070511
timebuffer:D05-07 T23:48:26
latitude:255.
UnDealGps:154827,A,2940.9184,11600.5449,0.00,0.00,070511
DoneGps:234827,A,2940.9184,11600.5449,0.00,0.00,070511
timebuffer:D05-07 T23:48:27
latitude:255.
UnDealGps:154828,A,2940.9184,11600.5449,0.00,0.00,070511
DoneGps:234828,A,2940.9184,11600.5449,0.00,0.00,070511
timebuffer:D05-07 T23:48:28
latitude:255.
UnDealGps:154829,A,2940.9184,11600.5449,0.00,0.00,070511
DoneGps:234829,A,2940.9184,11600.5449,0.00,0.00,070511
timebuffer:D05-07 T23:48:29
latitude:255.
从上面数据看出,已经没什么大的问题了,所以就要用1602液晶显示屏来显示数据了,经过长时间的尝试,终于将可行的结果显示了出来,请以下看图7-1所显示的效果。
图7-1 系统显示
由上图可知实时数据已经正确的显示出来了,而且是稳定的,剩下的就是通信这个模块了,和上面方法一样,把单片机控制串口发送给GPRS模块的AT指令在微机串口软件上显示出来,以判断是否正确,但是在此过程中不能把握的就是每条指令发送的延时难以判断,这会导致系统的不稳定,因此关于延时的问题还是要对整个系统进行测试的时候通过观察来确定每条指令发送延时,这样才能保证系统的稳定性和可用性,指令截图如7-2所示。
图7-2 AT指令发送
由以上截图可以看出,单片机已经成功的控制串口发送所需的AT指令了,那么这时候就应该测试通信这个模块了,看是否能成功的和服务器进行通信,通过长时间的努力,对每条指令发送延时加以修改,服务器成功的接收到了数据,而且达到了预期目的,截图如7-3所示。
图7-3 服务器数据接收
由上图可以看出,本系统基本功能已经实现,服务器成功的接收到了终端发送的数据,包括时间、经纬度等,只是还不够稳定,以待完善。
本章主要介绍了系统的测试方法,就这样一个小工程,如果测试方法不当或者不对,都会降低工作的效率。因此,测试方法在一个工程中是至关重要的,这就要求我们对这方面的知识一定要充实,才能达到预期的目的。结束语
大学生涯就这么匆匆结束了,以前那么多时间就是没好好的学习,通过这次毕业设计我才意识到,自己学到的东西实在太少了,动手做毕业设计的时候根本是没办法下手,不知该干些什么,感觉自己实在是太没用了,但是在此过程中我学到了很多东西,不仅学到了关于单片机的一些知识,还对很多硬件的知识了解了很多,使我对一个完整的工程过程有了全新的认识,在程序编写过程中学了很多以前我不知道的东西,例如宏定义命令#define的使用,更为精妙。
//关闭所有中断
#define INT_ALL_CLOSE IE=0x00;
IE2=0xFD;
//打开所有中断
#define INT_ALL_OPEN IE=0x11;
IE2|=0x03;
不难看出,这样给出别名会增加程序的可读性,让人更容易理解,在以后的编程过程中就可以直接使用其别名,这样也可减少程序代码长度,最重要的是该宏定义命令还可以给函数取别名,并将此别名以头文件的形式定义,这样在同一个工程中,其他文件只要包含此头文件,就可以顺利的调用此函数,这样就增加了代码的可移植性,对以后的学习有很大的帮助。
#ifndef SERIALPORT_H
#define SERIALPORT_H
#include..\typedef.h
//串口1初始化波特率115200,禁用定时器1
void UartFInit(void);
void UartSInit(void);
#endif
对于GPRS模块的认识更让我好奇,通过ZTEMe3000串口调试助手软件的控制,不需要输入任何的AT指令,就可以连接网络和串口软件进行通信,对于AT指令的熟悉让我更加对无线网络通信有了更好的认识,再加上要编写用单片机控制串口发送AT指令使得GPRS模块使用网络进行通信的程序,无论是GPS还是GPRS模块使用的串口,接收和发送数据都是以ASCII码的形式,这很麻烦,尤其是发送AT指令,要将每个AT指令存入数组,还要将返回的数据也存入数组,要想对其判断,就要确定特定字符的数组下表,这不知道又做了多少工作,但是通过努力还是实现了。附 录
/*********主函数**********/
void main()
{
ubyte gpsFlag = 0;
MainInit();
WelcomePage();
delay_ms(5000);
while(1)
{
gpsFlag = ReadGpsInfString(GpsInf);
if(8 gpsFlag)
{
TimeGpsStrToNormal(time);
ShowTime();
if(0 == ConnectServer())
{
TcpSendDatas(GpsInf,(ubyte)strlen(GpsInf));
}
}
}
}
/*************读取GPS信息************/
ubyte ReadGpsInfString(char* gpsInf)
{
ubyte datas[MAXRECBUFF];
ubyte maxFailCount = MAXFAILCOUNT; //读取失败次数
ubyte countd = 0; //读取数据个数计数countdata
ubyte wrongFlag = 0; //普通计数
ubyte count = 0;
while(maxFailCount--)
{ wrongFlag = 0;
UARTINIT;
CLOSEAURINT; //关闭串口中断
WAITRI; //等待正确信息头
while(1)
{ while(0x24 != GSBUF) //$
{ CLEARRI;
WAITRI;
}
count = 5; //跳过$gprm检测第6位
while(count--)
{ CLEARRI;
WAITRI;
}
if( C== GSBUF)
{ wrongFlag = 1;
break;
}
}
wrongFlag = 2;
CLEARRI;
WAITRI;
if(, == GSBUF)
{
wrongFlag = 3;
CLEARRI;
WAITRI;
countd = 0; //开始接收
//hhmmss.sss 接收hhmmss
//开始接收时间信息7位
count=6;
while(count--)
{
datas[countd++] = GSBUF;
CLEARRI;
WAITRI;
}
//过滤.sss
count=4;
while(count--)
{
CLEARRI;
WAITRI;
}
if(,==GSBUF)
{
//,定位
wrongFlag = 4;
count=2;
while(count--)
{
datas[countd++]=GSBUF;
CLEARRI;
WAITRI;
}
//判断信息是否有效
/*if(V == datas[countd-1])
{
wrongFlag = 255;
continue;
} */
if(,==GSBUF)
{
wrongFlag = 5;
//10维度,ddmm.mmmm
count=10;
while(count--)
{
datas[countd++]=GSBUF;
CLEARRI;
WAITRI;
}
//过滤维度区分,s
count=2;
while(count--)
{
CLEARRI;
WAITRI;
}
if(, == GSBUF)
{
wrongFlag = 6;
//接收经度,dddmm.mmmm
count=11;
while(count--)
{
datas[countd++]=GSBUF;
CLEARRI;
WAITRI;
}
//过滤经度度区分,e
count=2;
while(count--)
{
CLEARRI;
WAITRI;
}
if(, == GSBUF)
{
//接收速度,0.0-1851.knots
wrongFlag = 7;
do
{
datas[countd++]=GSBUF;
CLEARRI;
WAITRI;
}while(,!= GSBUF);
//,接收相对位移方向
//c长度不固定
do
{
datas[countd++]=GSBUF;
CLEARRI;
WAITRI;
}while(,!= GSBUF);
if(,== GSBUF)
{
wrongFlag = 8;
//,六位日期信息
count=7;
while(count--)
{ datas[countd
文档评论(0)