配色: 字号:
简易GPS定位仪的设计
2012-11-28 | 阅:  转:  |  分享 
  






东海科学技术学院



毕业论文(设计)



题目:简易GPS定位仪的设计

系:机电系

学生姓名:

专业:电子信息工程

班级:

指导教师:

起止日期:



2010年6月3日







简易GPS定位仪的设计

李胜泰

(浙江海洋学院东海科学技术学院机电系,浙江舟山316000)



摘要

为了提高卫星定位的精度,美国自1973年开始筹建全球定位系统GPS(GlobalPositioningSystem)。在经过了方案论证、系统试验阶段后,在1989年开始发射正式工作卫星,并于1994年全部建成,投入使用。GPS系统的空间部分由21颗卫星组成,均匀分布在6个轨道面上,地面高度是20000余公里,轨道倾角是55度,扁心率约为0,周期约为12小时,卫星向地面发射两个波段的载波信号,载波信号频率分别为1575.442兆赫兹(L1波段)和1227.6兆赫兹(L2波段),卫星上安装了精度很高的原子钟,以确保频率的稳定性,在载波上调制有表示卫星位置的广播星历,用于测距的C/A码和P码,以及其它系统信息,能在全球范围内,向任意多用户提供高精度、全天候、连续、实时的三维测速、三维定位和授时。GPS的应用已十分广泛,而且越来越广泛,差不多涉及到国民经济的各个领域,尤其是近几年来其向消费市场的发展的强劲势头表时,以GPS为代表的卫星导航应用产品,由于他能很容易地提供位置、速度和时间信息,所以会很快成为现代信息社会重要信息来源,成为信息时代的国家基础设施之一,由于他功能强大、使用方便、价格合适,所以能很好的与其他系统结合,形成大量的新应用、新产品,迅速的进入我们日常工作、学习、生活和娱乐中。本设计由单片机控制器来对GPS模块发送的信息进行处理,通过液晶显示器显示北京实时标准时间、及经纬度等信息,对系统的整体设计方案进行了分析,并对各个功能组成模块及其涉及的硬软件进行细致的介绍。



关键词:单片机;LCD显示器;GPS;





































DesignofsimpleGPSLocator

Lisheng-tai

(ZhejiangOceanUniversityCollegeofMechanicalandElectricalEngineering.ZhejiangZhoushan316000)



Abstract

Inordertoimprovetheprecisionofsatellitepositioning,theUnitedStates,startedin1973,theglobalpositioningsystemGPS(GlobalPositioningSystem).Afterademonstrationprograminprogress,thesystemtestphase,wasofficiallylaunchedin1989workingsatellites,allbuiltin1994,putintouse.SpacesegmentofGPSsystemcomposedof21satellites,evenlydistributedinsixorbitalplanes,groundaltitudeof20,000km,orbitalinclinationof55degrees,flatheartrateofabout0,cyclesofabout12hours,thetwosatellitestoground-launchedbandsofthecarriersignal,carriersignalfrequencywas1575.442MHz(L1band)and1227.6MHz(L2band),satellite,highprecisionatomicclockinstalledinordertoensurefrequencystability,modulationonthecarrierhassaidsatellitebroadcastephemerispositionforthedistanceoftheC/AcodeandPcode,andothersysteminformation,toworldwide,toprovideasmanyhigh-precision,all-weather,continuous,real-timethree-dimensionalmeasurementspeed,three-dimensionalpositioningandtiming.ApplicationofGPShasbeenveryextensive,andmoreextensive,involvingalmostallfieldsofnationaleconomy,especiallyintheconsumermarketinrecentyearstothemomentumofthedevelopmentofform,asrepresentedbyaGPSsatellitenavigationapplications,ashecaneasilyprovideposition,velocityandtimeinformation,itwillsoonbecomeamoderninformationsociety,animportantsourceofinformationhasbecometheinformationage,oneofthecountry''sinfrastructure,becauseofhispowerful,easytouse,thepriceisright,itcanbeverygoodwithothersystemstoformalargenumberofnewapplications,newproducts,rapidaccesstoourdailywork,study,livingandentertainment.Thedesignofthemicro-controllertosendtheinformationtotheGPSmoduletoprocessreal-timethroughtheLCDdisplayBeijingstandardtime,andlatitudeandlongitudeandotherinformation,thepresentstudy,theoveralldesignofthesystemwereanalyzed,andthecompositionofthevariousfunctionalmodulesandtheirrelatedhardwareandsoftwarefordetaileddescription



Keywords:Microcontroller;LCD;GPS;

















目录

摘要 II

Abstract III

第1章绪论 1

1.1GPS系统的构成 2

1.2GPS系统基本定位原理 3

1.3GPS-OEM通信协议 3

第2章系统总方案设计 5

2.1GPS-OEM接收板 5

2.2LCD液晶显示器 6

2.3MCU的选择 6

第3章系统硬件的设计 8

3.1电源电路的设计 8

3.2单片机电路系统 8

3.3GPS接收电路与接口 9

3.4LCD液晶显示器接口设计 13

第4章软件设计 15

4.1主程序的设计 15

4.2LCD液晶驱动程序 15

4.3GPS数据接收程序 20

4.4显示控制程序 22

4.5系统初始化程序 23

小结 25

致谢 26

[参考文献] 27

附录1:电路原理图 28

附录2:程序清单 29

附录3:液晶字模文件(LCD_code.h) 52





第1章绪论

GlobalPositioningSystem全球定位系统(GPS)是20世纪70年代由美国陆海空三军联合研制的新一代空间卫星导航定位系统。其主要目的为陆、海、空三大领域提供实时、全天候和全球性的导航服务,并用于情报收集、核爆监测和应急通讯等一些军事目的,是美国独霸全球战略的重要组成。经过20余年的研究实验,耗资300亿美元,到1994年3月,全球覆盖率高达98%的24颗GPS卫星星座己布设完成。

全球定位系统由三部分构成:(1)地面控制部分,由主控站(负责管理、协调整个地面控制系统的工作)、地面天线(在主控站的控制下,向卫星注入寻电文)、监测站(数据自动收集中心)和通讯辅助系统(数据传输)组成;(2)空间部分,由24颗卫星组成,分布在6个道平面上;(3)用户装置部分,主要由GPS接收机和卫星天线组成。

全球定位系统的主要特点:(1)全天候;(2)全球覆盖;(3)三维定速定时高精度;(4)快速省时高效率:(5)应用广泛多功能。

全球定位系统的主要用途:(1)陆地应用,主要包括车辆导航、应急反应、大气物理观测、地球物理资源勘探、工程测量、变形监测、地壳运动监测、市政规划控制等;(2)海洋应用,包括远洋船最佳航程航线测定、船只实时调度与导航、海洋救援、海洋探宝、水文地质测量以及海洋平台定位、海平面升降监测等;(3)航空航天应用,包括飞机导航、航空遥感姿态控制、低轨卫星定轨、导弹制导、航空救援和载人航天器防护探测等。

GPS卫星接收机种类很多,根据型号分为测地型、全站型、定时型、手持型、集成型;根据用途分为车载式、船载式、机载式、星载式、弹载式。

经过20余年的实践证明,GPS系统是一个高精度、全天候和全球性的无线电导航、定位和定时的多功能系统。GPS技术已经发展成为多领域、多模式、多用途、多机型的国际性高新技术产业。

24颗GPS卫星在离地面1万2千公里的高空上,以12小时的周期环绕地球运行,使得在任意时刻,在地面上的任意一点都可以同时观测到4颗以上的卫星。

由于卫星的位置精确可知,在GPS观测中,我们可得到卫星到接收机的距离,利用三维坐标中的距离公式,利用3颗卫星,就可以组成3个方程式,解出观测点的位置(X,Y,Z)。考虑到卫星的时钟与接收机时钟之间的误差,实际上有4个未知数,X、Y、Z和钟差,因而需要引入第4颗卫星,形成4个方程式进行求解,从而得到观测点的经纬度和高程。

事实上,接收机往往可以锁住4颗以上的卫星,这时,接收机可按卫星的星座分布分成若干组,每组4颗,然后通过算法挑选出误差最小的一组用作定位,从而提高精度。由于卫星运行轨道、卫星时钟存在误差,大气对流层、电离层对信号的影响,以及人为的SA保护政策,使得民用GPS的定位精度只有100米。为提高定位精度,普遍采用差分GPS(DGPS)技术,建立基准站(差分台)进行GPS观测,利用已知的基准站精确坐标,与观测值进行比较,从而得出一修正数,并对外发布。接收机收到该修正数后,与自身的观测值进行比较,消去大部分误差,得到一个比较准确的位置。实验表明,利用差分GPS,定位精度可提高到5米。

GPS前景

由于GPS技术所具有的全天候、高精度和自动测量的特点,作为先进的测量手段和新的生产力,已经融入了国民经济建设、国防建设和社会发展的各个应用领域。随着冷战结束和全球经济的蓬勃发展,美国政府宣布2000年至2006期间,在保证美国国家安全不受威胁的前提下,取消SA政策,GPS民用信号精度在全球范围内得到改善,利用C/A码进行单点定位的精度由100米提高到20米,这将进一步推动GPS技术的应用,提高生产力、作业效率、科学水平以及人们的生活质量,刺激GPS市场的增长。据有关专家预测,在美国,单单是汽车GPS导航系统,2000年后的市场将达到30亿美元,而在我国,汽车导航的市场也将达到50亿元人民币。可见,GPS技术市场的应用前景非常可观[1]。



1.1GPS系统的构成

GPS系统包括三大部分:

●空间部分—GPS卫星星座;

●地面控制部分—地面监控系统

●用户设备部分—GPS信号接收机

(1)GPs工作卫星及其星座

由21颗工作卫星和3颗在轨备用卫星构成。24颗卫星均匀分布在6个轨道平面内,轨道倾角为55度,各个轨道平面之间相距60度。每个轨道平面内各颗卫星之间的升交角距相差90度。在GPS系统中,GPS’卫星的作用为:

①接收和储存来自地面监控站的导航信息,接收并执行监控站的控制指令。

②通过星载的高精度艳钟和铆钟提高精密的时间标准。

③卫星计算机进行必要数据处理。

④用L波段的两个无线载波(19cm和24cm)向广大用户连续不断的发送导航定位信号。

⑤接收地面主控站通过注入站发送到卫星的调度命令,适时地调整运行偏差或启用备用卫星等。

(2)地面监控系统

GPS工作卫星的地面监控系统包括一个主控站、三个注入站和五个检测站。主控站设在美国本土科罗多拉。主控站的任务是收集、处理本站和监测站收到的全部资料,编算出每颗卫星的星历和GPS时间系统,将预测的卫星星历、钟差、状态数据以及大气传播改正编制成导航电文,传送到注入站。

主控站还负责纠正卫星的轨道偏离,必要时调度卫星,让备用卫星取代失控的工作卫星。另外还负责监测整个地面监测系统的工作,检验注入给卫星的导航电文,监测卫星是否将导航电文发送给了用户。

三个注入站分别设在大西洋的阿森松岛、印度洋的迪戈加西亚岛和太平洋的卡瓦加兰。其任务是将主控站发来的导航电文注入到相应卫星的存储器,每天注入三次,每次注入14天的星历。此外,注入站能主动向主控站发射信号,每分钟报告一次自己的工作状态。

五个监测站除了位于主控站和三个注入站之外的四个站外,还在夏威夷设立了一

个监测站。监测站的主要任务是为主控站提供卫星的观测数据。每个监测站均用GPS

信号接收机对每颗可见卫星每6分钟进行一次伪距测量和积分多普勒观测,采集气象

要素等数据。在主控站的遥控下自动采集定轨数据并进行各项改正,每巧分钟平滑

一次观测数据,据此推算出每2分钟间隔的观测值,然后将数据发送给主控站。[2,3]

(3)信号接收机

GPS信号接收机的任务是:

能够捕获到按一定卫星高度截止角所选择的待测卫星的信号,并跟踪这些卫星的运行,对所接收到的GPS信号进行变换、放大和处理,以便测量出GPS信号从卫星到接收机天线传播时间,解译出GPS卫星所发送的导航电文,实时地计算出观测站的三维位置,甚至三维速度和时间。静态定位中,GPS接收机在捕获和跟踪GPS卫星的过程中固定不变,接收机高精度的测量GPS信号的传播时间,利用GPS卫星在轨的已知位置,解算出接收机天线所在位置的三维坐标。

动态定位则是用GPS接收机测定一个运动物体的运动轨迹。GPS信号接收机所位于的运动物体叫做载体(如航行中的船舰,空中的飞机,行走的车辆)。载体上的GPS接收机天线在跟踪GPS卫星的过程中相对地球而运动,接收机用GPS信号实时地测得运动载体的状态参数(瞬间三维位置和三维速度)接收机硬件和机内软件以及GPS数据的后处理软件包,构成完整的GPS用户设备。GPS接收机的结构分为天线单元和接收单元两大部分。对于测地型接收机来说,两个单元一般分为两个独立的部件,观测时将天线单元安置在观测站上,接收单元置于观测站附近的适当地方,用电缆线将两者连成一个整机。或将接收单元和天线单元制作成一个整体,观测时将其安装在测站点上。

1.2GPS系统基本定位原理

GPS定位原理比较复杂,这里只概述其基本原理。

二维平面定位基本原理可用“三点定位法”来说明。三点定位法需要有三个坐标已知的参考点,并且知道被测点到参考点之间的距离,以参考点为圆心、以被测点到各参考点的距离为半径画圆周,三个圆周的唯一交点即是被测点的确切位置,如图1.1所示。

对于三维空间定位,可同理采用“四点定位法”。





图1.1GPS三点定位法原理图



在GPS系统中,参考点就是悬在空中的卫星。卫星位置包含在导航信息中,只要测量出卫星发射信号的时刻与它到达用户时刻的时间间隔,即可求得卫星与用户之间的距离。从而被测点在地球上的位置可由地面接收装置中的计算机计算出来。对于陆上和海上二维位置(经度和纬度)来说,只要观测3颗卫星就可以;对于空间的三维位置(经度、纬度和高度),需要采集4颗卫星的信号才能计算确定

1.3GPS-OEM通信协议

GPS的通讯协议比较多,其中NMEA(NationalmarineElectronicsAssociation)0183协议为GPS接收机和其他航海电子产品的导航数据输出格式,是目前普遍使用且为大多数生产商遵循的协议之一,以下为其基本通讯参数及报文格式。

(l)NMEA0183报文格式

NMEA0183协议报文的语句串(Ascll字符)格式全部信息可如下表示:

$AAXXX,ddd…ddd,hh

各符号的意义如下表1.1











表1.1NMEA0183协议报文符号及意义

符号 意义 $ 串头,表示串开始 AA 识别符 XXX 语句名 Ddd 数据字段,字母或数字 , 数据分隔符 hh校验和 回车控制符 换行控制符

(2)NMEA0183具体内容

通常,GPS接收机每秒通过直接计算产生一次定位数据,位置时间信息通过封装成GPS报文交给主机。NMEA0183报文输出的常用语句信息包含内容,如表1.2

表1.2NMEA-0183输出语句

NMEA 种类说明 GPGGA 卫星定位数据 GGPLL 地理位置-径度纬度 GPGSA 导航偏差和有源卫星 GPGSV 可接受到信号的GPS卫星状态 GPRMC 推荐最小数据量的GPS具体内容/传输数据 GPVTG 对地方及对地速度 其中GPRMC是推荐最小数据,适合海上船只或地面交通工具使用,可给出世界标准时间、经/纬度、航行速度/方向等信息。输出范例为:

$GPRMC,161229.487,A,3723.2475,N,12158.3416,W,0.13,309.62,120598,10

其详细说明如表1.3所示。

表1.3RMC资料格式

名称 实例 说明 讯息代号 $GPRMC RMC规范台头 标准定位时间 161229.487 时时分分秒秒.秒秒 定位状态 A A=资料可用,V=资料不可用 纬度 3723.1487 度度分分.分分分分 南北半球指示 N 北半球N,南半球S 径度 12158.1416 度度度分分.分分分分 东西半球指示 W 东半球E,西半球W 对地速度 0.13 0.0至1815.8节 对地方向 309.62 实际值 日期 120598 日日月月年年 磁极变量 东半球 校验码 10 信息结束





第2章系统总方案设计

总体电路设计原理框架如图2.1



图2.1总电路设计原理框架

整体电路电路主要由GPS-OEM接收板、液晶显示器、单片机等部分组成。

2.1GPS-OEM接收板

根据本课题所要功能需要对GPS模块的主要性能进行选择:

1、并行通道:一般消费类GPS设备有2~5条并行通道接收卫星信号。因为最多可能有12颗卫星是可见的(平均值是8),GPS接收器必须按顺序访问每一颗卫星来获取每颗卫星的信息。市面上的GPS接收器大多数是12并行通道型的,这允许它们连续追踪每一颗卫星的信息,12通道接收器的优点包括快速冷启动和初始化卫星的信息,而且在森林地区可以有更好的接收效果。一般12通道接收器不需要外置天线,除非你是在封闭的空间中,如船舱、车厢中。因此对本设计来说一般消费类的GPS设备的并行通道来说已经足够了。

2、定位信息:这是指重启GPS接收器时,它确定现在位置所需的时间以及。对于12通道接收器,如果你在最后一次定位位置的附近,冷启动时的定位时间一般为3~5分钟,热启动时为15~30秒,而对于2通道接收器,冷启动时大多超过15分钟,热启动时为2~5分钟。

3、定位经度:大多数GPS接收器的水平位置定位精度在5m~10m左右,但这只是在SA没有开启的情况下。

4、信号干扰:给予你一个很好的定位,GPS接收器需要至少3~5颗卫星。如果你在峡谷中或者两边高楼林立的街道上,或者在茂密的丛林里,你可能不能与足够的卫星联系,从而无法定位或者只能得到二维坐标。同样,如果你在一个建筑里面,你可能无法更新你的位置,一些GPS接收器有单独的天线可以贴在挡风玻璃上,或者一个外置天线可以放在车顶上,这有助于你的接收器得到更多的卫星信号。GARMIN公司被广泛应用的GPS25LP型GPSOEM接收板。GARMIN公司作为全球最大的GPSOEM板的供应商其生产的GPS25LP型GPSOEM板具有:1、并行12通道接收;2、重捕时间<2S,热启动时间15S,冷启动时间45S,自动搜索时间90S;3、定位精度:差分(DGPS)情况下<5M,非差分15M;4、提供外接天线以帮助接收。基于以上性能GARMINGPS25LP接收板完全能满足这次设计的需要。

2.2LCD液晶显示器

一般嵌入式系统可供选择的显示器有:

1、VFD显示器:VFD显示器是由电子管发展过来的一种显示器件。它是真空二极管或三极管的一种改型。二极管的改型称为静态VFD,三极管的改型称为动态VFD。静态VFD含有二个基本电极:阴极(灯丝)和阳极。动态比静态多一极:栅极。所有极在高真空条件下封装于玻璃壳内。由阴极发射的电子在正向电位的作用下加速到达栅极和阳极(静态VFD直接到达阳极),并碰撞激活在阳极上的荧光粉图案使其发光。所需的亮度图形显示可以由控制栅极和阳极(静态VFD仅控阳极)正电位或负电位而实现。

VFD显示器具有高清晰度高亮度宽视角反应速度快从红色到蓝色多种色彩,使用滤色器可获得更多色彩CIG(集成芯片玻璃)技术,集成VFD的驱动电路可靠且使用寿命长高亮度宽视角反应速度快可靠使用寿命长第3章系统硬件的设计

3.1电源电路的设计

本设计中的电源主要是给各个硬件模块供电,具体的电源电路采用两种供电方式:机内变压器供电和机外外接电源供电,具体如图3.1。两种供电方式可以任选一种,在机内自动切换。机外外接供电口因为随环境变化较大,故采用傻瓜式接口。即无需辨认直流电正负极,也可以接入8-15V的交流电压。下面介绍这两种供电方式的电路原理:

机内变压器是输入220V交流电压,输出8V交流电压。主要电路构造是先对输入220V交流电压进行整流(采用四个二极管构成整流桥)后输出大约9V的脉动电压,然后再经过滤波电路,经过查找资料采用470U的滤波电容,得到平稳的直流电压。此电压为了使输出的电压更加稳定再经过三端稳压器7805稳压使输出电压稳定在+5V。

外接供电口输入的电源也是经过机内另一组全桥式整流桥,再经过滤波,稳压,然后输出。本接法的傻瓜式接口主要是通过输入口的整流桥来实现了。当输入直流电源的时候无论怎么接由D1、D4,或者D2,D3中的一组完成极性转换。如果输入的是交流电源则由D1-D4组成的全桥式整流桥完成整流[6,7]。



图3.1电源供电电路图



3.2单片机电路系统

系统电路的主芯片采用美国ATMEL公司的AT89C51FLASH单片机,它与MCS-51系统产品兼容,具有4K字节可重编程Flash存储器,5V±20%电源电压、128×8位的内部RAM,两个16位定时器/计数器,5个中断源,以及低功耗空闲和掉电方式等一系列的功能。

AT89C51单片机的电源、复位、晶振振荡电路如图3.2所示。



图3.2AT89C51单片机的电源、复位、晶振振荡电路

高电平有效复位,当单片机上电和振荡器正在运行时,在复位端(RST)上保持两个机器周期的高电平即可完成操作。外部复位电路是为内部复位电路提供两个机器周期以上的高电平而设计的。系统采用上电自动复位,由于上电瞬间电容器上的电压不能突变,因此RST上的电压是VCC和电容器上电压之差,所以RST上电压大小与VCC相同。随着充电时间的加长,电容器上电压不断上升,RST电压就随着下降,只要RST脚上保持10mS以上高电平系统就可有效复位[9]。

晶振振荡电路主要是由谐振器端口1和2(即XTAL1脚和XTAL2脚)分别构成片内振荡器的反相放大器的输入和输出端,外接石英晶体或陶瓷振荡器以及补偿电容C1、C2构成并联谐振电路。当外接石英晶体时,电容C1、C2选30PF±10PF;当外接陶瓷振荡器时,电容C1、C2选47PF±10PF。AT89C51系统中晶振可在0-24MHZ选择。外接电容C1、C2的大小会影响振荡器频率的高低、振荡频率的稳定度、起振时间及温度稳定性。

3.3GPS接收电路与接口

GPS信息接收采用GARMIN公司的GARMINGPS25LP型GPSOEM板,与单片机的信息传送采用RS-232标准。GPSOEM电路板输出引脚功能如图3.3。



图3.3GPSOEM板其中输出引脚

各引脚功能说明如下:

●Pin1:串行口2的数据输出端。

●Pin2:串行口2的数据输入端。

●Pin3:秒脉冲输出端,经度uS。

●Pin4:串行口1的数据输出端。

●Pin5:串行口1的数据输入端。

●Pin6:掉电模式控制端。

●Pin7:外部备用电源输入端。

●Pin8:GND接地端。

●Pin9:Vin电源输入端。

●Pin10:同Pin9,电源输入端,内部同Pin9相连。

●Pin11:空脚NC。

●Pin12:NMEA(美国海洋电子协会)0183,Ver1.5格式输出端。

由于使用的是LVS版本GPS25LP型GPSOEM板,所以串行口1,串行口2和NMEA口使用的都是RS-232电平。如果使用的是LVC版本的GPS25LP型GPSOEM板这些端口使用的是CMOS/TTL电平。在本系统中将串行2连至计算机用作GPSOEM板设置用,本机显示GPS信息从NMEA送出。具体如图3.4。





























































图3.4GPSOEM板接口电路

由于GPSOEM送出的是RS-232电平,计算机串行通信用的也是RS-232电平,而单片机串行通信使用的是COMS/TTL电平。因此GPSOEM和计算机通信无需多余的电路可以直接相连,而和单片机接口必须进行RS-232电平和COMS/TTL电平的相互转换方能通信。

RS-232是异步串行通信中应用最早的,也是最广泛的标准串行总线之一。它原是基于公用电话网的一种串行通信标准,推荐电缆的最长长度为15M(50英尺)。它的逻辑电平以公共地为对称,其逻辑“0”电平规定在+3~+25V之间,逻辑“1”电平则在-3~-25V之间,因而它要使用正负极性的双电源。主要电气参数见表3.1。而且传统的COMS/TTL电平,逻辑电平是以地为标准不对称设置,其逻辑“0”电平规定为<0.7V,逻辑“1”电平则规定>3.2V。因此两者之间逻辑电平不兼容,所以两者通信时必须进行电平转换。

以前RS-232和COMS/TTL电平转换常用MC1488和MC1489。MC1488实质上的由3个与非门和1个反向器组成,通过他们可以将4路COMS/TTL电平转换为RS-232电平,它需要V或者V双路电源,适用于数据发送。MC1489实质上是4个带控制门的反相器,其控制端通常接一滤波电容到地,使用单一+5V电源,适用与数据接收。

由于MC1488和MC1489是单一功能的发送/接收器,所以在双向数据传输中各端都需要同时使用两个器件,此外由必须同时使用正负两组电源,因而在很多场合下使用显得不方便,所以被淘汰。为此推出了只用单一电压且具有发送/接收双重功能的电路。这种器件内部集成一个电荷泵和一个电压变换器,它能将+5V或者更低的电压变换成RS-232所需的V以上的电压。这类芯片最典型的就是MAXIM的MAX232芯片(如图3.5),它内部电荷泵电路先将+5V提升到+10V,然后在用电压反转电路将+10V变成-10V,这样就得到了RS-232所需的V的电压了。



图3.5MAX232接线图

设计中单片机只需接收从GPSOEM板发送过来的数据,而无需向GPSOEM板发送数据。也就是只需将RS-232电平转换为COMS/TTL电平,而无需将COMS/TTL电平转换为RS-232电平。在对RS-232电平和COMS/TTL电平(表3.1)作出分析后我们采用单个三极管来进行转换,而不用MAX232等专用RS-232-COMS/TTL电平转换器。具体接线如图3.6

表3.1RS-232电平和COMS/TTL电平逻辑电平对比表

RS-232电平 COMS/TTL电平 逻辑“0” +3~+25V <0.7V 逻辑“1” -3~-25V >3.2V





图3.6RS-232电平COMS/TTL电平转换图



当RS-232IN端输入RS-232逻辑电平“0”,也就是输入+3~+25V时,三极管正向导通。此时TTLOUT端输出的是三极管的饱和压降。此电压约0.1-0.2V,符合COMS/TTL电平<0.7V的要求。

当RS-232IN端输入RS-232逻辑电平“1”,也就是输入-3~-25V时,三极管截至。此时TTLOUT端输出的是电源电压+5V。符合COMS/TTL电平>3.2V要求。

实践证明此电路完全可行,未出现任何异常。证明此电路也很可靠,符合设计要求。

3.4LCD液晶显示器接口设计

液晶驱动IC(SED1520F0A)基本特性:

1、具有低功耗、供应电压范围宽等特点。

2、具有16common和61segment输出,并可外接驱动IC扩展驱动。

3、具有2560位显示RAM(DDRAM),即80×8×4位

4、具有与68系列或80系列相适配的MPU接口功能,并有专用的指令集,可完成文本显示或图形显示的功能设置

工作参数:

1、逻辑工作电压(VDD-VSS):2.4~6.0V

2、LCD驱动电压(Vdd-Vlcd):3.0~13.5V

3、工作温度(Ta):0~55℃(常温)/-20~70℃(宽温)

4、保存温度(Tstg):-10~70℃

电气特性(测试条件Ta=25,Vdd=5.0±0.25V):

1、输入高电平(Vih):3.5V(min)

2、输入低电平(Vil):0.55V(max)

3、输出高电平(Voh):3.75V(min)

4、输出低电平(Vol):1.0V(max)

5、工作电流:2.0mA(max)

液晶显示器CGM-12232的引脚功能如图3.7所示。

























图3.7液晶显示器CGM-12232的引脚功能图

●Pin1:VDD正电源输入。

●Pin2:GND地。

●Pin3:LCD驱动电压,调对比度。

●Pin4:接口时序选择。

●Pin5:芯片1使能信号,高电平有效。

●Pin6:芯片2使能信号,高电平有效。

●Pin7:读/写控制端,高电平读,地电平写。

●Pin8:数据/指令选择端,高电平数据,地电平指令。

●Pin9-Pin16:液晶并行数据。

●Pin17:背光LED阳极。

●Pin18:背光LED阴极。

单片机和液晶显示器接口电路图见图3.8。CGM-12232的Pin9-Pin16接单片机P2口来进行数据传输,Pin5-Pin83根控制线接P0口。由于P0口内部没有上拉电阻不能输出高电平因此在P0口上接了一个10K排阻RP9作为P0口的上拉电阻。P0口是单片机I/O口中能承受电流最大的口,能承受8个TTL负载,但相对于LCD液晶显示器的背光电流来说还是较小的。在这里我们采用三极管扩流的方法来驱动LCD液晶显示器的背光LED灯。

在CGM-12232的说明文档里面,将Pin3脚VLCD电压通过电阻在VDD和GND之间分压得到,而实验中发现通过分压后液晶显示很暗,直接将其接地液晶显示器明显好转,因此这里将其直接接地。

































图3.8单片机和液晶显示器接口电路图



第4章软件设计

4.1主程序的设计

由于OEM板与单片机之间采用异步串行通信,所以在执行程序前要对串口进行初始化设置,设置数据存储区来存储初始化配置信息以及OEM板的输出数据等。当OEM板开始向单片机发送数据时,单片机执行接收子程序以及显示程

序。系统主程序流程如图4.1所示。[10]





































图4.1主程序流程图

4.2LCD液晶驱动程序

CGM-12232型LCD液晶显示器软件设计从底层写起,逐步提高,最后完成显示一个code区域的数据功能。即先往LCD液晶显示器发送一个字节的数据或指令写起,逐步上升,最后到画一个图指定开始列,上下层,图形的宽度,图形指针固定高度为16的图。汉字和数字字符都是通过“画”这种图来得到的。

1、往LCD液晶显示器发送一个字节的数据主或指令子程序。程序原型:

调用方式:voidsend_mi(ucharinstuction)

函数说明:发指令instruction到主窗口(内函数,私有,用户不能直接调用)

调用方式:voidsend_si(ucharinstruction)

函数说明:发指令instruction到从窗口(内函数,私有,用户不能直接调用)

调用方式:voidOutMD(uchari)

函数说明:发数据data到主窗口(内函数,私有,用户不能直接调用)

调用方式:voidsend_sd(uchardata)

函数说明:发数据data到从窗口(内函数,私有,用户不直接调用)

首先是确定要往主芯片,还是从芯片发,然后判断芯片是否忙,忙则等待,不忙则可以发数据或者指令了,然后把选中的芯片取消选中。流程图如4.2。[11]





































2、芯片判忙子程序。函数原型:

调用方式:voidwait_ready(void)

函数说明:等待LCD内部操作完成,判忙(内函数,私有,用户不能直接调用)

芯片判忙是本系统唯一读状态指令

















































LCD液晶屏初始化完成后就可以显示各种,图形和字符了。也就是进入正常工作状态。在显示图形和字符的时候还要注意及时切换页(page)和列。

4、页切换子程序、列切换子程序。程序原型:

调用方式:voidset_page(ucharpage)

函数说明:同时设置主(右)从(左)显示页为0-3页

调用方式:voidSetAddress(ucharaddress)

函数说明:同时设置主(右)从(左)列地址为0-61列

页切换子程序主要是在4个页面之间切换,列切换子程序主要是设置起始列。它们两个都是发送一个特定的特定数据的指令给LCD液晶屏。页切换发送的是1011,10XX,后两位XX表示的就是页地址。列切换子程序发送的是0XXX,XXXX后XXX,XXXX,表示的就是起始列的地址。而行由于这两个程序只是简单地将两个特定值发送给LCD液晶屏这里就不再详述。

5、清屏子程序。程序原型:

调用方式:voidlcd_clr(void)

函数说明:清屏

起始清屏子程序是在整个画面上画一个空白的图片。由于SED1520F0A有点类似于FlashROM芯片,但刚好和FlashROM相反。FlashROM是置0只要把0写进去,置1则需要擦除。可以在原来“1”的基础上把“1”变成“0”,而不可以把原来“0”变成“1”。而SED1520F0A就是可以把原来为“0”的变成“1”,而不可以把原来“1”的变成“0”,也就是刚好和FlashROM相反。因此在每一次要重新显示画面的时候必须调用清屏程序。清屏程序的流程如图4.5。













































6、画图子程序。

调用方式:voiddraw_bmp(ucharcol,ucharlayer,ucharwidth,ucharbmp)函数说明:画一个图,横坐标是col,layer表示上下层,width是图形的宽,高固定16,bmp是图形指针,使用Zimo3Pro软件,采用纵向取模,字节倒序得到数据。col图型的起始位置0~121layer图形的位置(Y坐标)0-上半部分非0-下半部分width图形宽度要求col+width<121bmp图形数据指针。画图子程序是LCD初始化完成后,对LCD液晶显示器唯一的操作函数,是操作LCD液晶显示器的基础。具体程序流程如图4.6。









































































4.3GPS数据接收程序

单片机接收程序流程如图4.7。

单片机接收数据时,先判断是否是起始标志符“$”,当接收到“$”后,才开始接收数据,并对接收到的数据进行处理和存储。最后,判断接收字符是否是以确定接收子程序是否结束。































































图4.7单片机接收程序流程













4.4显示控制程序

显示子程序就是根据键盘值将经纬度、北京时间、大地水准面高度这三个信息选择一个显示到LCD液晶显示器。由于GPSOEM板发送的ASCII码的数据,在进行显示前必须将ASCII码转成BCD码。而对于“0-9”以外的字符则根据需要转到特定值。然后则根据键盘值显示所要显示的内容。

显示经纬度。

对应经度的格式为“度度分分.分分分分,E(W)”。

对应纬度格式为“度度分分.分分分分,N(S)。

显示的信息为:





其中GPSOEM板发送的信息和什么要显示的信息有所不同。1、必须将GPSOEM板发送“E,S,W,N”对应成“东,南,西,北”4个字符。2、GPSOEM板发送的是“度度分分.分分分分”格式,而什么显示的是“度度°分分′秒妙″”的格式,因此必须进行转换。转换方法是100/60即可得。另外考虑到GPSOEM板最后的两位“分分”即使在完全不动的情况下也会没有规律的变化,因此把这两位舍去。具体见流程图4.8。







































其中,经度先显示三位数字,然后显示单位“°”再显示两位数字,再显示“′”,再显示两位数字,再显示“″”,纬度也是一样,只不过刚开始显示的是两位数字,并且显示在LCD液晶显示器的下半部。

显示北京时间

对应时间格式为:时时分分秒妙。

显示的信息为:







初看起来好像GPSOEM板传过来的时间格式和要显示的时间格式是一致,不用转换。而实际上GPSOEM板传过来的是格林尼治时间,也就是东一区的时间。北京时间和格林尼治时间相差8个小时。北京时间=格林尼治时间+8。但当格林尼治时间16点以后,北京时间已经是第二天的凌晨了。也就是当算出来的北京时间大于24时必须减去24才是正确的北京时间。具体流程如图4.9。































4.5系统初始化程序

一般的系统初始化包括RAM初始化、特殊功能寄存器初始化、外围设备初始化。RAM初始化主要是将RAM进行清零处理,本系统只用到内部的RAM即只需对内部的RAM进行清零出理即可;特殊功能寄存器的初始化包括定时器的初始值的装入、中断的开放等;外围设备初始化主要是对外围设备的初始,例如本系统就在上电时必须将LCD液晶显示器进行初始化。

一般在KeilC51编译器里面RAM的初始化由“STARTUP.A51”文件来完成,它其实是一个带有宏定义和条件编译的汇编语言文件。开机先执行这个文件产生的代码,然后在执行main()主函数。

特殊功能寄存器初始化和外围设备初始化在main()主函数处开始,在进入功能函数循环前完成初始化。本系统主要完成端口复位、开机延时、LCD液晶屏初始化、LCD液晶屏清屏、调用开机LOGO画面、定时器0(T0)初始化、串行口波特率发生器(T1)初始化、开定时器0和串行口中断,延时1.5妙,打开定时器0(T0),10妙后熄灭背光。具体流程如图4.10。

定时器0(T0)主要是背光显示延时10S熄灭用。当按键按下时,将背光打开,然后将定时器0(T0)打开,定时器0(T0)定时为50mS,配合一个软件计数器,在10S后将背光关掉,同时也将自身关闭停止计时。



图4.10初始化流程























小结

本次设计主要包括三方面:方案的设计,硬件的设计,软件的设计。把平时所学的单片机,C语言编程等知识,合理的运用到研究当中。硬件设计中,主要是各个功能模块的确定。在软件设计中主要是先对各个硬件模块的初始化,然后是对各个硬件的基础上编写软件程序来完善整个功能。通过本次设计进一步掌握了单片机综合应用系统的应用设计方法,在整个设计过程中能独立完成从方案认证、电路设计、程序编写与调试等全过程,在软件程序设计时采用C语言编写,为单片机的应用打下了的基础!









































































致谢

在经过大概几个月的毕业设计过程中,本人设计开发了基于单片机的GPS简易定位仪,在这设计过程中,特别要感谢我的指导老师楼然苗的全力支持和精心指导,给我设计初始提供了大量的书籍与资料,并在设计总体方案时给我明确了目标,在论文完成的最后阶段还给了我给我很多完善论文的建议,在此谨表衷心感谢。

















































































[参考文献]

[1]楼然苗,李光飞.51系列单片机设计实例.北京:北航出版社,2003.03:北航出版社,200.09

[3]楼然苗,李光飞.51系列单片机设计实例.北京:北航出版社,200.09

[4]李光飞,李良儿,楼然苗.单片机C程序设计实例指导.北京:北航出版社,200.09

[5]余永权.ATMEL89系列单片机应用技术.北京:北航出版社,2001.10

.89系列单片机应用.北京:出版社,.09

[7]孙燕,.Protel99设计与实例.北京:出版社,.11[8]张洪润、易涛.单片机(第二版)应用技术教程[M].清华大学出版社

[9]张伟等编著.Protel99SE实用教程[M].人民邮电出版社

[10]张旭涛、曾现锋、王爱军.单片机原理与应用[M]北京理工大学出版社

[11]先锋工作室[M]编著.单片机程序设计实例.清华大学出版社

[12]吴黎明主编.单片机原理及应用技术[M].科学出版社

[13]孟庆卓,郑素华.GPS定位仪显示系统,中国长春物理研究所(130021)

[14]吴广华,张茂林,张杏谷,胡稳才,黄丽卿,林庆武.简易型GPS、角速度传感器组合导航系统,集美大学(36102)





















































附录1:电路原理图







附录2:程序清单

#include //89C52单片机头文件

#include //液晶LCD的字模文件

#include



//功能引脚定义

sbitA=P0^7; //数据1/命令0选择

sbitRW=P0^6; //读1/写0

sbitE1=P0^4; //片选1(Master)

sbitE2=P0^5; //片选2(slave)

sbitLED=P0^3; //背光

sbitup=P0^0; //向上翻页键

sbitdown=P0^1; //向下翻页键

#definedataP2 //液晶并行数据



//液晶显示控制命令表

#definedisp_on0xAf //显示关闭

#definedisp_off0xAe //显示打开

#definedisp_start_line0xC0 //显示起始地址(后5位-表示0-31行)

#definepage_addr_set0xB8 //页地址设置(0~3)

#definecol_addr_set0x00 //列地址设置(0~61)

#definestatus_busy0x80 //0=ready

#definemodeRWite0xEE //写模式

#definedynamic_driver0xA4 //动态驱动

#defineadc_select0xA0 //clockwise

#defineclk320xA9 //刷新时钟设置1/32

#defineclk160xA8 //刷新时钟设置1/16

#definereset0xE2 //软件复位



#defineucharunsignedchar

#defineuintunsignedint



//全局变量,及标志位定义

uchartime_counter=0; //定时器的软件计数器

ucharkey=0; //键盘值

ucharserial_counter; //串行计数器



bitdisp_flag=0; //显示更新标志

ucharbdataserial_byte=0; //串行口标志位定义字节

sbitSflag=serial_byte^0; //串行接收头部标志,一下8个都定义在''serial_byte''内

sbitG1flag=serial_byte^1;

sbitPflag=serial_byte^2;

sbitG2flag=serial_byte^3;

sbitG3flag=serial_byte^4;

sbitAflag=serial_byte^5;

sbitDFflag=serial_byte^6;

sbitENflag=serial_byte^7;

bitr_flag=0;



unsignedcharidataserial_buff[77]; //串行接收缓冲



voidlcd_init(void); //LCD初始化

voidlcd_clr(void); //LCD清屏

voidwait_ready(void); //等待ready

voiddraw_bmp(ucharcol,ucharlayer,ucharwidth,ucharbmp);//点阵码显示输出

voidASCII2BCD(void); //ASCII码转换为BCD码

voidlogo(void); //开机画面显示



/------------------------------------------------------------------------

中断程序

------------------------------------------------------------------------/

//////////////////////////////////////////////////////////////////////////

//定时器0中断函数,用于控制背光灯延时10S熄灭

//////////////////////////////////////////////////////////////////////////

voidint_t0()interrupt1using1

{ //定时器0中断函数,用于控制背光灯延时10S熄灭

TH0=0x4C;

TL0=0x00; //重装定时器0,定时50mS

time_counter++; //软件计数器+1;

if(time_counter==200) //软件计数器定时到10S,关背光,定时器0,清软件计数器

{

time_counter=0;

LED=1;

TR0=0;

}

}



//////////////////////////////////////////////////////////////////////////

//串行口中断函数,用于语句''$GPGGA''判断和此语句的接收

//////////////////////////////////////////////////////////////////////////

voidserial()interrupt4using2

{

ucharpp;

RI=0;

pp=SBUF;

if(ENflag==1) //串口接收完毕,可以用来显示,清标志位重新开始

{

disp_flag=1;

serial_byte=0;

}

elseif(DFflag==1) //''$GPGGA''头判断完毕,开始接收$GPGGA,语句的数据

{

if(pp==42)

ENflag=1; //等待收到''''结束接收

else

{

serial_buff[serial_counter]=pp; //没收到'''',继续接收,数据放入串口缓冲

serial_counter++;

}

}

elseif(Aflag==1) //第六个为''A'',判断第七个是不是'',''

{

if(pp==44)

DFflag=1; //第七个个是'',''开始接收$GPGGA,语句的数据

else

serial_byte=0; //不是'','',清标志位

}

elseif(G3flag==1) //第五个为''G'',判断第六个是不是''A''

{

if(pp==65)

Aflag=1; //第六个是''A''判断下一个是不是'',''

else

serial_byte=0; //不是''A'',清标志位

}

elseif(G2flag==1) //第四个为''G'',判断第五个是不是''G''

{

if(pp==71)

G3flag=1; //第五个是''G''判断下一个是不是''A''

else

serial_byte=0; //不是''G'',清标志位

}

elseif(Pflag==1) //第三个为''P'',判断第四个是不是''G''

{

if(pp==71)

G2flag=1; //第四个是''G''判断下一个是不是''G''

else

serial_byte=0; //不是''G'',清标志位

}

elseif(G1flag==1) //第二个为''G'',判断第三个是不是''P''

{

if(pp==80)

Pflag=1; //第三个是''P''判断下一个是不是''G''

else

serial_byte=0; //不是''P'',清标志位

}

elseif(Sflag==1) //第一个为''$'',判断第二个是不是''G''

{

if(pp==71)

G1flag=1; //第二个是''G''判断下一个是不是''P''

else

serial_byte=0; //不是''G'',清标志位

}

elseif(pp==0x24) //判断第一个是不是$

{

Sflag=1; //第一个为$,判断下一个是不是G

serial_counter=0; //串行计数器清零

}

}



//////////////////////////////////////////////////////////////////////////

//调用方式:voidsend_mi(ucharinstuction)

//函数说明:发指令instruction到主窗口(内函数,私有,用户不能直接调用)

//////////////////////////////////////////////////////////////////////////



voidsend_mi(ucharinstruction)

{

E2=0; //关Slaver

E1=1; //开Master

wait_ready(); //判断忙

A=0; //指令

RW=0; //写触发

data=instruction; //指令码

E1=0; //关Master

}





//////////////////////////////////////////////////////////////////////////

//调用方式:voidOutMD(uchari)

//函数说明:发数据data到主窗口(内函数,私有,用户不能直接调用)

//////////////////////////////////////////////////////////////////////////



voidsend_md(ucharc)

{

E2=0; //关Slaver

E1=1; //开Master

wait_ready(); //判断忙

A=1; //数据

RW=0; //写触发

data=c; //数据

E1=0; //关Master

}



//////////////////////////////////////////////////////////////////////////

//调用方式:voidsend_si(ucharinstruction)

//函数说明:发指令instruction到从窗口(内函数,私有,用户不能直接调用)

//////////////////////////////////////////////////////////////////////////

voidsend_si(ucharinstruction)

{

E1=0; //关Master

E2=1; //开Slaver

wait_ready(); //判断忙

A=0; //指令

RW=0; //写触发

data=instruction; //指令码

E2=0; //关Slaver

}



//////////////////////////////////////////////////////////////////////////

//调用方式:voidsend_sd(uchardata)

//函数说明:发数据data到从窗口(内函数,私有,用户不直接调用)

//////////////////////////////////////////////////////////////////////////

voidsend_sd(ucharc)

{

E1=0; //关Master

E2=1; //开Slaver

wait_ready(); //判断忙

A=1; //数据

RW=0; //写触发

data=c; //数据

E2=0; //关Slaver

}





//////////////////////////////////////////////////////////////////////////

//等待ready:等待LCD内部操作完成,判忙

//////////////////////////////////////////////////////////////////////////

voidwait_ready(void)

{

A=0; //指令

RW=1; //读

_nop_(); //空操作,产生汇编里面的nop

while(data&status_busy);//读入LCD状态,1=忙,一直等待LCD内部操作完成

}



//////////////////////////////////////////////////////////////////////////

//调用方式:voidlcd_init(void)

//函数说明:122x32LCD初始化,开机后仅调用一次

//////////////////////////////////////////////////////////////////////////

voidlcd_init(void)

{

send_mi(reset); //复位m-left,s-right

send_si(reset);



send_mi(disp_off); //关闭显示

send_si(disp_off);



send_mi(dynamic_driver);//动态驱动

send_si(dynamic_driver);



send_mi(clk32); //1/32占空比

send_si(clk32);



send_mi(adc_select); //clockwise

send_si(adc_select);



send_mi(modeRWite); //写模式结束

send_si(modeRWite);



send_mi(col_addr_set);//归回零列,设定显示起始行首

send_mi(disp_start_line);

send_si(col_addr_set);

send_si(disp_start_line);



send_mi(disp_on); //开显示

send_si(disp_on);

}



//////////////////////////////////////////////////////////////////////////

//调用方式:voidlcd_clr(void)

//函数说明:清屏

//////////////////////////////////////////////////////////////////////////

voidlcd_clr(void)

{

uchari,page;

for(page=0;page<4;page++)

{

send_mi(page_addr_set|page);//设置页从0-3

send_si(page_addr_set|page);

send_mi(0); //主窗口设置为0列

send_si(0); //从窗口设置为0列

for(i=0;i<62;i++)//全部写入0x00

{

send_md(0x00);

send_sd(0x00);

}

}

}



//////////////////////////////////////////////////////////////////////////

//调用方式:voidset_page(ucharpage)

//函数说明:同时设置主(右)从(左)显示页为0-3页

//////////////////////////////////////////////////////////////////////////

voidset_page(ucharpage)

{

send_mi(page_addr_set|page);

send_si(page_addr_set|page);

}



//////////////////////////////////////////////////////////////////////////

//调用方式:voidSetAddress(ucharaddress)

//函数说明:同时设置主(右)从(左)列地址为0-61列

//////////////////////////////////////////////////////////////////////////

voidset_address(ucharaddress)

{

send_mi(address&0x7F);//&0x7F,考虑到防止越限

send_si(address&0x7F);

}



//////////////////////////////////////////////////////////////////////////

//调用方式:voidputchar_l(ucharc)

//函数说明:在左页(主窗口)当前地址画一个字节(8点)

//////////////////////////////////////////////////////////////////////////

voidputchar_l(ucharc)

{

send_md(c);

}



//////////////////////////////////////////////////////////////////////////

//调用方式:voidputchar_r(ucharc)

//函数说明:在右页(从主窗口)当前地址画一个字节(8点)

//////////////////////////////////////////////////////////////////////////

voidputchar_r(ucharc)

{

send_sd(c);

}









//////////////////////////////////////////////////////////////////////////

//调用方式:voiddraw_bmp(ucharcol,ucharlayer,ucharwidth,ucharbmp)

//函数说明:画一个图,横坐标是col,layer表示上下层,width是图形的宽,高固定16

//bmp是图形指针

//使用Zimo3Pro软件,采用纵向取模,字节倒序得到数据。

//col图型的起始位置0~121

//layer图形的位置(Y坐标)0-上半部分非0-下半部分

//width图形宽度8,16可选

//bmp图形数据指针

//////////////////////////////////////////////////////////////////////////

voiddraw_bmp(ucharcol,ucharlayer,ucharwidth,ucharbmp)

{

ucharx;

ucharaddress; //address表示显存的物理地址

ucharp=0;

ucharpage=0;

ucharwindow=0; //page表示上下两页,window表示左右窗口(0左,1右)

if(layer)page=2; //左-主窗口,右-从窗口



for(x=col;x
{

if(x>121)return; //防止显示乱码

if(x>60) //左右窗口定位

{

window=1; //右-从窗口

address=x%61;

}

else

{

address=x;

} //主窗口输出



set_page(page); //上层数据输出

set_address(address);



if(window)

{

putchar_r(bmp[p]);

}

else

{

putchar_l(bmp[p]);

}



set_page(page+1); //下层数据输出

set_address(address); //列保持不变



if(window)

{

putchar_r(bmp[p+width]);

}

else

{

putchar_l(bmp[p+width]);

}

p++;

}

}



/------------------------------------------------------------------------

延时程序:入口unsingedchari,延时i毫秒

------------------------------------------------------------------------/

delay(uchari)

{

ucharj;

for(i=i<<1;i>0;i--)

for(j=0xf3;j>0;j--)

{}

}

disp_transit()

{

ucharj,row=0,temp;

temp=(serial_buff[25]10+serial_buff[26])3/5;//经度最后.XX分转换位秒

serial_buff[25]=temp/10;

serial_buff[26]=temp%10;

temp=(serial_buff[12]10+serial_buff[13])3/5;//纬度最后.XX分转换为秒

serial_buff[12]=temp/10;

serial_buff[13]=temp%10;

lcd_clr(); //清屏

draw_bmp(0,0,16,azimuth[serial_buff[30]-20]);//判断东、西,并显示

draw_bmp(16,0,16,jing);//显示''经''

draw_bmp(32,0,8,num[13]); //显示'':''

for(j=19;j<28;j++) //显示经度

{

if(j==22)

{

draw_bmp(40+row8,0,8,num[11]); //显示数字度符号

row++;

}

if(j==24)

{

draw_bmp(40+row8,0,8,num[12]); //显示''''''(分)

row++;

j++;

}



if(j==27) //显示''"''(秒)

{

draw_bmp(40+row8,0,8,num[14]);

row++;

break;

}

draw_bmp(40+row8,0,8,num[serial_buff[j]]);//显示数字

row++;



}





row=0;

draw_bmp(0,1,16,azimuth[serial_buff[17]-20]);//判断南、北,并显示

draw_bmp(16,1,16,wei); //显示纬

draw_bmp(32,1,8,num[13]); //显示:

for(j=7;j<15;j++)

{



if(j==9) //显示数字度符号

{

draw_bmp(40+row8,1,8,num[11]);

row++;

}

if(j==11)

{

draw_bmp(40+row8,1,8,num[12]); //显示''''''(分)

row++;

j++;



}

if(j==14) //显示''"''(秒)

{

draw_bmp(40+row8,1,8,num[14]);

row++;

break;

}

draw_bmp(40+row8,1,8,num[serial_buff[j]]);//显示数字

row++;

}

}



disp_time()

{

ucharhour,j,row=0;

lcd_clr(); //清屏

draw_bmp(29,0,64,bjsj); //在液晶上部29列开始显示''北京时间''

hour=serial_buff[0]10+serial_buff[1]+8; //格林尼治时间转化为北京时间

if(hour>23) //北京时间=格林尼治时间+8

{hour=hour-24;} //当大于24时,减去24

serial_buff[0]=hour/10; //回存到缓冲区

serial_buff[1]=hour%10;

for(j=0;j<6;j++) //显示6个数字和2个冒号,格式为XX:XX:XX

{

draw_bmp(29+row8,1,8,num[serial_buff[j]]);//显示6个数字

row++;

if((j==1)||(j==3)) //第2个和第4个数字后面显示'':''

{

draw_bmp(29+row8,1,8,num[13]); //显示冒号

row++;

}

}

}



disp_level()

{

uchari,j,row=1;

lcd_clr();

draw_bmp(0,0,120,level);

if(serial_buff[32]==0)//无GPS接收信号

{

draw_bmp(0,1,112,nosignal);

}

else

{ //探测水平信号数据存放的位置

for(i=35;row;)

{

if(serial_buff[i]==''M'')

{

i=i+2;

row=0; //跳出循环

}

else

{

i++;

}

}

j=i;

row=1;

for(;row;)

{

if(serial_buff[j]==''M'')

{

row=0; //跳出循环

}

else

{

j++;

}

}



for(;i
{

draw_bmp(0+row8,1,8,num[serial_buff[i]]);

row++;

}

draw_bmp(0+row8,1,8,num[15]);

}



}



disp_speed() //速度显示程序

{



}



disp_direction() //方向显示程序



/-----------------------------------------------------------------------

将接收到的ASCII转换位BCD码和特定值

------------------------------------------------------------------------/



voidASCII2BCD(void)

{

uchari;

for(i=0;i<60;i++) //只转换前38个接收到的数据

{

if((serial_buff[i]>=48)&&(serial_buff[i]<=57))

{ //接收到的是数字,转换为BCD码。BCD码=ASCII码-48

serial_buff[i]=serial_buff[i]-48;

}

else

{

switch(serial_buff[i])

{ //非数字,将它们转换为特定值

case''.'':{serial_buff[i]=10;break;}



case''-'':{serial_buff[i]=16;break;}



case''E'':{serial_buff[i]=20;break;}

case''S'':{serial_buff[i]=21;break;}

case''W'':{serial_buff[i]=22;break;}

case''N'':{serial_buff[i]=23;break;}

case'','':{serial_buff[i]=0xff;break;}

default:break;

}

}

}

}

//////////////////////////////////////////////////////////////////////////

// 主程序

//////////////////////////////////////////////////////////////////////////

voidmain(void)

{

P0=0xff;//端口复位

P1=0xff;

P2=0xff;

P3=0xff;

delay(255);

lcd_init();//初始化液晶显示器

lcd_init();

lcd_init();

lcd_clr(); //清屏

logo(); //显示开机画面



//TMOD:GATE|C/!T|M1|M0|GATE|C/!T|M1|M0

//00100001

TMOD=0x21; //T016位定时器,T1自动重装,方式3

TH0=0x4C;

TL0=0x00; //定时50mS

//SCON:SM0|SM1|SM2|REN|TB8|RB8|TI|RI

//01000000

SCON=0x40; //串行口8位UTRA

TH1=0xFA;

TL1=0xFA; //波特率发生器,4800bps

ET0=1; //开定时器0中断允许

ES=1; //开串行口中断

EA=1; //开总中断

REN=1; //允许串行接收

TR1=1; //开串行口波特率发生(T1)

while(1) //主程序

{

up=1; //把键盘位置1,以便进行键盘输入

down=1;

keywork(); //键盘扫描

if(disp_flag) //判断是否可以更新显示

{

disp_flag=0; //清显示更新标志

display(); //显示程序

}

}

}















































附录3:液晶字模文件(LCD_code.h)

unsignedcharcodewelcome_1[]=

{

/------------------------------------------------------------------------------

;源文件/文字:WelcometoGPS

;宽×高(像素):112×16

;字模格式/大小:单色点阵液晶字模,纵向取模,字节倒序/224字节

;数据转换日期:2004-5-1620:24:15

------------------------------------------------------------------------------/

0xF8,0x08,0x00,0xF8,0x00,0x08,0xF8,0x00,0x00,0x00,0x80,0x80,0x80,0x80,0x00,0x00,

0x00,0x08,0x08,0xF8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x80,0x80,0x00,0x00,

0x00,0x00,0x80,0x80,0x80,0x80,0x00,0x00,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x00,

0x00,0x00,0x80,0x80,0x80,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,

0x00,0x80,0x80,0xE0,0x80,0x80,0x00,0x00,0x00,0x00,0x80,0x80,0x80,0x80,0x00,0x00,

0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xC0,0x30,0x08,0x08,0x08,0x38,0x00,0x00,

0x08,0xF8,0x08,0x08,0x08,0x08,0xF0,0x00,0x00,0x70,0x88,0x08,0x08,0x08,0x38,0x00,

0x03,0x3C,0x07,0x00,0x07,0x3C,0x03,0x00,0x00,0x1F,0x22,0x22,0x22,0x22,0x13,0x00,

0x00,0x20,0x20,0x3F,0x20,0x20,0x00,0x00,0x00,0x0E,0x11,0x20,0x20,0x20,0x11,0x00,

0x00,0x1F,0x20,0x20,0x20,0x20,0x1F,0x00,0x20,0x3F,0x20,0x00,0x3F,0x20,0x00,0x3F,

0x00,0x1F,0x22,0x22,0x22,0x22,0x13,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,

0x00,0x00,0x00,0x1F,0x20,0x20,0x00,0x00,0x00,0x1F,0x20,0x20,0x20,0x20,0x1F,0x00,

0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x07,0x18,0x20,0x20,0x22,0x1E,0x02,0x00,

0x20,0x3F,0x21,0x01,0x01,0x01,0x00,0x00,0x00,0x38,0x20,0x21,0x21,0x22,0x1C,0x00

};



unsignedcharcodewelcome_2[]=

{

/------------------------------------------------------------------------------

;源文件/文字:System

;宽×高(像素):104×16

;字模格式/大小:单色点阵液晶字模,纵向取模,字节倒序/208字节

;数据转换日期:2004-5-1620:32:36

------------------------------------------------------------------------------/

0x00,0x70,0x88,0x08,0x08,0x08,0x38,0x00,0x80,0x80,0x80,0x00,0x00,0x80,0x80,0x80,

0x00,0x00,0x80,0x80,0x80,0x80,0x80,0x00,0x00,0x80,0x80,0xE0,0x80,0x80,0x00,0x00,

0x00,0x00,0x80,0x80,0x80,0x80,0x00,0x00,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x00,

0x00,0x38,0x20,0x21,0x21,0x22,0x1C,0x00,0x80,0x81,0x8E,0x70,0x18,0x06,0x01,0x00,

0x00,0x33,0x24,0x24,0x24,0x24,0x19,0x00,0x00,0x00,0x00,0x1F,0x20,0x20,0x00,0x00,

0x00,0x1F,0x22,0x22,0x22,0x22,0x13,0x00,0x20,0x3F,0x20,0x00,0x3F,0x20,0x00,0x3F

};



unsignedcharcodewelcome_3[]=

{

/------------------------------------------------------------------------------

;源文件/文字:经

;宽×高(像素):16×16

;字模格式/大小:单色点阵液晶字模,纵向取模,字节倒序/32字节

;数据转换日期:2004-5-1621:09:10

------------------------------------------------------------------------------/

0x20,0x30,0xAC,0x63,0x10,0x00,0x40,0x42,0x22,0x22,0x12,0x1A,0x26,0x42,0xC0,0x00,

0x22,0x23,0x22,0x12,0x12,0x00,0x20,0x21,0x21,0x21,0x3F,0x21,0x21,0x21,0x20,0x00

};



unsignedcharcodewei[]=

{

/------------------------------------------------------------------------------

;源文件/文字:纬

;宽×高(像素):16×16

;字模格式/大小:单色点阵液晶字模,纵向取模,字节倒序/32字节

;数据转换日期:2004-5-1621:11:14

------------------------------------------------------------------------------/

0x20,0x30,0xAC,0x63,0x20,0x18,0x24,0x24,0x24,0xFF,0x24,0x24,0x24,0x24,0x04,0x00,

0x12,0x33,0x12,0x12,0x0A,0x08,0x01,0x01,0x01,0xFF,0x01,0x01,0x11,0x21,0x1F,0x00

};



unsignedcharcodeazimuth[4][32]=

{

{//东

0x00,0x04,0x04,0xC4,0xB4,0x8C,0x87,0x84,0xF4,0x84,0x84,0x84,0x84,0x04,0x00,0x00,

0x00,0x00,0x20,0x18,0x0E,0x04,0x20,0x40,0xFF,0x00,0x02,0x04,0x18,0x30,0x00,0x00

},

{//南

0x04,0x04,0xE4,0x24,0x24,0x64,0xB4,0x2F,0x24,0xA4,0x64,0x24,0x24,0xE6,0x04,0x00,

0x00,0x00,0x7F,0x04,0x05,0x05,0x05,0x7F,0x05,0x05,0x05,0x25,0x44,0x3F,0x00,0x00

},

{//西

0x02,0xF2,0x12,0x12,0x12,0xFE,0x12,0x12,0x12,0xFE,0x12,0x12,0x12,0xF2,0x02,0x00,

0x00,0x7F,0x28,0x24,0x22,0x21,0x20,0x20,0x20,0x21,0x22,0x22,0x22,0x7F,0x00,0x00

},

{//北

0x00,0x20,0x20,0x20,0x20,0xFF,0x00,0x00,0x00,0xFF,0x40,0x20,0x30,0x18,0x10,0x00,

0x10,0x30,0x18,0x08,0x04,0x7F,0x00,0x00,0x00,0x3F,0x40,0x40,0x40,0x40,0x78,0x00

},

};



unsignedcharcodebjsj[]=

{







/------------------------------------------------------------------------------

;源文件/文字:北京时间

;宽×高(像素):64×16

;字模格式/大小:单色点阵液晶字模,纵向取模,字节倒序/128字节

;数据转换日期:2004-5-1621:16:11

------------------------------------------------------------------------------/

0x00,0x20,0x20,0x20,0x20,0xFF,0x00,0x00,0x00,0xFF,0x40,0x20,0x30,0x18,0x10,0x00,

0x00,0x04,0x04,0xE4,0x24,0x24,0x25,0x26,0x24,0x24,0x24,0xE4,0x06,0x04,0x00,0x00,

0x00,0xFC,0x44,0x44,0x44,0xFC,0x10,0x90,0x10,0x10,0x10,0xFF,0x10,0x10,0x10,0x00,

0x00,0xF8,0x01,0x06,0x00,0xF0,0x92,0x92,0x92,0x92,0xF2,0x02,0x02,0xFE,0x00,0x00,

0x10,0x30,0x18,0x08,0x04,0x7F,0x00,0x00,0x00,0x3F,0x40,0x40,0x40,0x40,0x78,0x00,

0x00,0x20,0x10,0x19,0x0D,0x41,0x81,0x7F,0x01,0x01,0x05,0x0D,0x38,0x10,0x00,0x00,

0x00,0x07,0x04,0x04,0x04,0x07,0x00,0x00,0x03,0x40,0x80,0x7F,0x00,0x00,0x00,0x00,

0x00,0xFF,0x00,0x00,0x00,0x07,0x04,0x04,0x04,0x04,0x07,0x40,0x80,0x7F,0x00,0x00

};

unsignedcharcodenum[17][16]=

{

//------------------------------------------------------------------------------

//源文件/文字:0,1,2,3,4,5,6,7,8,9,.,

//宽×高(像素):8×16

//字模格式/大小:单色点阵液晶字模,纵向取模,字节倒序/128字节

//数据转换日期:2004-5-1621:16:11

//------------------------------------------------------------------------------

{0x00,0xE0,0x10,0x08,0x08,0x10,0xE0,0x00,0x00,0x0F,0x10,0x20,0x20,0x10,0x0F,0x00},//0

{0x00,0x10,0x10,0xF8,0x00,0x00,0x00,0x00,0x00,0x20,0x20,0x3F,0x20,0x20,0x00,0x00},//1

{0x00,0x70,0x08,0x08,0x08,0x88,0x70,0x00,0x00,0x30,0x28,0x24,0x22,0x21,0x30,0x00},//2

{0x00,0x30,0x08,0x88,0x88,0x48,0x30,0x00,0x00,0x18,0x20,0x20,0x20,0x11,0x0E,0x00},//3

{0x00,0x00,0xC0,0x20,0x10,0xF8,0x00,0x00,0x00,0x07,0x04,0x24,0x24,0x3F,0x24,0x00},//4

{0x00,0xF8,0x08,0x88,0x88,0x08,0x08,0x00,0x00,0x19,0x21,0x20,0x20,0x11,0x0E,0x00},//5

{0x00,0xE0,0x10,0x88,0x88,0x18,0x00,0x00,0x00,0x0F,0x11,0x20,0x20,0x11,0x0E,0x00},//6

{0x00,0x38,0x08,0x08,0xC8,0x38,0x08,0x00,0x00,0x00,0x00,0x3F,0x00,0x00,0x00,0x00},//7

{0x00,0x70,0x88,0x08,0x08,0x88,0x70,0x00,0x00,0x1C,0x22,0x21,0x21,0x22,0x1C,0x00},//8

{0x00,0xE0,0x10,0x08,0x08,0x10,0xE0,0x00,0x00,0x00,0x31,0x22,0x22,0x11,0x0F,0x00},//9

{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x30,0x00,0x00,0x00,0x00,0x00},//.

{0x00,0x00,0x0C,0x12,0x12,0x0C,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},//符号度

{0x10,0x16,0x0E,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},//''(分)

{0x00,0x00,0x00,0xC0,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x30,0x00,0x00,0x00},//:

{0x10,0x16,0x0E,0x00,0x10,0x16,0x0E,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},//''''(秒)

{0x08,0xF8,0xF8,0x00,0xF8,0xF8,0x08,0x00,0x20,0x3F,0x00,0x3F,0x00,0x3F,0x20,0x00},//M

{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x01,0x01,0x01,0x01},//-

};

unsignedcharcodelevel[]=

{

/------------------------------------------------------------------------------

;源文件/文字:大地水准面高度:

;宽×高(像素):120×16

;字模格式/大小:单色点阵液晶字模,纵向取模,字节倒序/240字节

;数据转换日期:2004-5-217:36:49

------------------------------------------------------------------------------/

0x20,0x20,0x20,0x20,0x20,0x20,0xA0,0x7F,0xA0,0x20,0x20,0x20,0x20,0x20,0x20,0x00,

0x10,0x10,0x10,0xFE,0x10,0x50,0x40,0xFE,0x20,0x20,0xFF,0x10,0x10,0xF8,0x10,0x00,

0x00,0x10,0x10,0x10,0x90,0x70,0x00,0xFF,0x20,0x60,0x90,0x08,0x04,0x00,0x00,0x00,

0x00,0x02,0x1C,0xC8,0x20,0x10,0xFF,0x4A,0x48,0x49,0xFE,0x48,0x68,0x4C,0x08,0x00,

0x00,0x02,0xF2,0x12,0x12,0xFA,0x96,0x92,0x92,0xF2,0x12,0x12,0x12,0xF2,0x02,0x00,

0x04,0x04,0x04,0x04,0x74,0x54,0x55,0x56,0x54,0x54,0x74,0x04,0x04,0x04,0x04,0x00,

0x00,0x00,0xFC,0x04,0x24,0x24,0xFC,0xA5,0xA6,0xA4,0xFC,0x24,0x24,0x24,0x04,0x00,

0x00,0x00,0x00,0xC0,0xC0,0x00,0x00,0x00,0x00,0x80,0x40,0x20,0x10,0x0C,0x03,0x00,

0x01,0x06,0x08,0x30,0x60,0xC0,0x40,0x00,0x20,0x20,0x10,0x1F,0x08,0x08,0x00,0x3F,

0x40,0x40,0x4F,0x42,0x44,0x43,0x70,0x00,0x10,0x10,0x08,0x06,0x01,0x40,0x80,0x7F,

0x00,0x00,0x01,0x06,0x0C,0x18,0x08,0x00,0x02,0x02,0x7E,0x01,0x00,0x00,0x7F,0x22,

0x22,0x22,0x3F,0x22,0x23,0x32,0x20,0x00,0x00,0x00,0x7F,0x20,0x20,0x3F,0x24,0x24,

0x24,0x3F,0x20,0x20,0x20,0x7F,0x00,0x00,0x00,0xFF,0x01,0x01,0x3D,0x25,0x25,0x25,

0x25,0x25,0x3D,0x41,0x81,0x7F,0x00,0x00,0x80,0x60,0x1F,0x80,0x80,0x42,0x46,0x2A,

0x12,0x12,0x2A,0x26,0x42,0xC0,0x40,0x00,0x00,0x00,0x00,0x30,0x30,0x00,0x00,0x00

};



unsignedcharcodenosignal[]=

{

/------------------------------------------------------------------------------

;源文件/文字:无GPS接收信号!

;宽×高(像素):112×16

;字模格式/大小:单色点阵液晶字模,纵向取模,字节倒序/224字节

;数据转换日期:2004-5-217:48:48

------------------------------------------------------------------------------/

0x00,0x40,0x42,0x42,0x42,0x42,0x42,0xFE,0xC2,0x42,0x42,0x42,0x42,0x42,0x40,0x00,

0xC0,0x30,0x08,0x08,0x08,0x38,0x00,0x00,0x08,0xF8,0x08,0x08,0x08,0x08,0xF0,0x00,

0x00,0x70,0x88,0x08,0x08,0x08,0x38,0x00,0x08,0x08,0x08,0xFF,0x88,0x68,0x24,0x2C,

0xB4,0x25,0x26,0x34,0x2C,0x24,0x20,0x00,0x00,0xF8,0x00,0x00,0xFF,0x00,0x40,0x30,

0xDF,0x10,0x10,0x10,0xF0,0x10,0x10,0x00,0x80,0x40,0x30,0xFC,0x07,0x0A,0xA8,0xA8,

0xA9,0xAE,0xAA,0xA8,0xA8,0x08,0x08,0x00,0x40,0x40,0x40,0x5F,0xD1,0x51,0x51,0x51,

0x51,0x51,0x51,0x5F,0x40,0x40,0x40,0x00,0x00,0x00,0x00,0xF8,0x00,0x00,0x00,0x00,

0x40,0x40,0x20,0x10,0x08,0x04,0x03,0x00,0x3F,0x40,0x40,0x40,0x40,0x40,0x70,0x00,

0x07,0x18,0x20,0x20,0x22,0x1E,0x02,0x00,0x20,0x3F,0x21,0x01,0x01,0x01,0x00,0x00,

0x00,0x38,0x20,0x21,0x21,0x22,0x1C,0x00,0x02,0x42,0x81,0x7F,0x02,0x82,0x8A,0x4E,

0x53,0x32,0x12,0x2E,0x42,0xC2,0x02,0x00,0x00,0x0F,0x04,0x02,0xFF,0x40,0x40,0x20,

0x21,0x16,0x08,0x16,0x21,0x60,0x20,0x00,0x00,0x00,0x00,0x7F,0x00,0x00,0x7E,0x22,

0x22,0x22,0x22,0x22,0x7E,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x07,0x02,0x02,0x22,

0x42,0x82,0x42,0x3E,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x33,0x30,0x00,0x00,0x00

};



















浙江海洋学院东海科学技术学院本科生毕业论文









I





-23-







电源



LCD显示



TxD1



RxD1



GND



OEM板



RxD



TxD



GND



Q1



AT89C51



复位



图4.2aLCD液晶指令发送流程图图4.2bLCD数据发送流程图



开始



关从(主)芯片



开主(从)芯片



等待,直到不忙



A=1(发送数据)



发送显示数据



关主(从)芯片



返回



开始



关从(主)芯片



开主(从)芯片



等待,直到不忙



A=0(发送指令)



发送指令数据



关主(从)芯片



返回



RW=0写数据



RW=0写数据



开始



A=0(指令)



RW=1(读)



读出数据&0x80直到结果为0为止(不忙)



返回



图4.3芯片判忙流程图



开始



主(从)芯片复位



主(从)芯片动态显示



主(从)芯片1/32占空比



主(从)芯片时钟线模式



主(从)芯片更改指令结束



设置主(从)芯片

起始行0行起始列0列



结束返回



图4.4LCD液晶屏初始化子程序流程图



Y



N



Y



N



开始



0页开始,第4页?



结束返回



设置主从芯片的页地址



设置主从芯片的列地址为0



到61列?



发送0x00到主从芯片



图4.5清屏程序流程图



进入功能函数循环体



开串行口接收允许



开始定时器和串口中断



串口初始化



定时器初始化



液晶清屏



液晶屏幕初始化



开机延时



开始



开始



串口初始化



设置数据存储区



接收子程序



显示



是否退出



退出



Y







N



Y



N



Y



N



Y



N



Y



Y



N



Y



?开始

Layer=1?



从col画起画到col+width还完?



Col>60?



画右边窗口,起始列=col%61



起始列=col



画左窗?



画左上窗



画右上窗



设置画下半窗



画左窗?



画右下窗



画左下窗



第2页



返回



Col>121?



图4.6画图程序流程图



Y



Y



Y



N



N



N



返回



接收到(CR)(CF)?



接收数据



是GPRMC?



接收消息头



是$



接收一个字符



单片机开始初始化



开始



东经:XXX°XX′XX″



北纬:XX°XX′XX″



开始



将经度和纬度的.分分转换为秒



根据收到的“E(W)”判断东西经并显示“东(西)经:”



根据格式显示经度数据



根据收到的“S(N)”判断南北纬并显示“南(北):”



根据格式显示经度数据



返回



图4.8经纬度显示程序流程图



北京时间



XX:XX:XX



N



Y



开始



小时+8



超过24?



上层显示“北京时间“



小时-24



下层显示“XX:XX:XX”



返回



图4.9北京时间显示流程图







































N



测试点



Q3



Q2







献花(0)
+1
(本文系朽木轩首藏)