毕业论文-基于STM32的公交车语音报站系统设计.doc_第1页
毕业论文-基于STM32的公交车语音报站系统设计.doc_第2页
毕业论文-基于STM32的公交车语音报站系统设计.doc_第3页
毕业论文-基于STM32的公交车语音报站系统设计.doc_第4页
毕业论文-基于STM32的公交车语音报站系统设计.doc_第5页
已阅读5页,还剩27页未读 继续免费阅读

下载本文档

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

文档简介

应用技术学院本 科 毕 业 论 文题 目:基于ARM的 年 级: 专 业: 班 号: 学 号: 学生姓名: 指导教师: 职 称: 论文提交日期: 年 月 日目 录摘 要3Abstract3前 言3第一章 总体设计41.1 系统概述41.2 系统设计4第二章 硬件模块介绍52.1控制电路设计模块52.1.1主芯片介绍52.1.2控制电路设计52.2 车站识别电路设计模块62.2.1 GPS硬件结构62.2.2 GPS设计72.3 语音播报电路设计模块82.4 显示电路设计模块82.4.1 串口显示介绍82.4.2 串口屏原理92.5 按键电路设计模块9第三章 系统软件设计93.1 主程序93.2 GPS数据解析程序103.3 串口触摸屏驱动程序153.4 语音合成驱动程序163.5 按键程序18第四章 测试分析20总结与展望20参考文献20致 谢20摘 要 随着国民经济的不断发展和城市人口的不断增长,城市中的公交车日益凸显出了其特有的优势:方便、快捷、价格低廉、运载量大、能耗低、低污染,因此公交车逐渐成为了广大人民出行首选的交通工具。近些年来手动按键报站方式仍然是公交车上比较普遍采用的报站方式,但其报站不准确,并且报站时需要由驾驶员进行手动操作,这给行驶中的车辆带来了一定的安全隐患。现阶段虽然国内已经有些大中城市的公交车上已经采用了基于GPS定位系统的自动报站方式,但其昂贵的成本,目前难以实现普及。本设计主要目的是针对目前公交车常见报站方式的主要缺陷,探索设计出一种物美价廉的公交报站器。本文介绍一种基于GPS模块和STM32单片机设计的自动语音报站系统。利用STM32F103C8T6串行口通信接收GPS模块输出的经纬度信息,通过对比存储经、纬度数据和相应的站点名字。确认公交车是否进入设定站台范围内,以达到自动报站的目的;再设计的过程中给出硬件电路的设计方案、主要软件流程图、数据处理及其程序设计的方法。本设计解决了以住公交车报站系统人工操作不便、误报站多、故障时不报站等问题。关键词:公交语音报站、GPS、STM32、单片机AbstractWith the continuous development of the national economy and the continuous growth of the city population, the city bus is increasingly protruding shows its unique advantages: convenient, fast, low cost, high carrying capacity, low energy consumption, low pollution, so the bus gradually become the majority of people travel the preferred means of transport. In recent years, the manual button station mode is still more commonly used in the bus station, but its newspaper station is not accurate, and the station is required to operate manually, which brings a certain security risks to the vehicle. Although there are already some large and medium cities in the domestic bus has been used based on the GPS positioning system to automatically stop way, but its expensive cost, is difficult to achieve universal. The main purpose of this design is to design a kind of cheap and good quality public transportation station, which is aimed at the main defects of the bus station.This paper introduces an automatic speech system based on GPS module and STM32 MCU. STM32F103C8T6 serial port communication to receive the output of the GPS module latitude and longitude information, through the comparison of storage, latitude data and the corresponding site name. Confirm whether the bus entered the platform to achieve the purpose of automatic reporting station. The design of hardware circuit, the main software flow chart, data processing and program design method are given in the process of design. This design solves the problem of the inconvenience of manual operation, the false alarm station and the station of the fault in the station system.Keywords: Public Transportation Voice Station, GPS, STM32, MicrocontrollersWritten by Zhu BiweiSupervised by Peng Jingyu 前 言 随着我国国民经济快速增长,人民生活水平不断提高,工业化、城镇化、机动化进程深入推进,公交车因其方便、快捷、价格低廉、运载量大、能耗低、低污染等特点逐渐成为了广大人民出行首选的交通工具。近些年来手动按键报站方式仍然是公交车上比较普遍采用的报站方式,但其报站不准确,并且报站时需要由驾驶员进行手动操作,这给行驶中的车辆带来了一定的安全隐患。现阶段虽然国内已经有些大中城市的公交车上已经采用了基于GPS定位系统的自动报站方式,但其昂贵的成本,目前难以实现普及。针对目前公交车常见报站方式的主要缺陷,本设计探索设计出一种运用GPS卫星定位与语音合成技术相结合的公交报站器。 目前,国内GPS语音自动报站系统处于试验阶段,仅有广州、青岛等几个城市有几条试验线路采用GPS语音自动报站技术。第一章 总体设计1.1 系统概述 该系统采用了更先进的卫星定位技术和语音合成技术相结合的办法,以前,必须有司机操控,公交车语音报站器才可以工作,现在本系统的实现改善了这一环节,能够实现自动播报站名及服务用语,进站和出站,且及时、准确、不要靠人工介入,实现了公交车报站器的完全智能化。本设计的主要特点有:(1采用GPS卫星定位技术,可以自动地、准确地播报当前所到达的站名、服务用语以及广告等等。(2)能够与显示屏直接连接,同步显示报站信息、当前经纬度位置以及速度等。(3)可存储多条线路,方便公交车临时更换运营线路。GPS总线自动站系统包括两部分硬件和软件两者。硬件是以STM32F013处理器核心,必要的外围配置存储器,I/O设备,通讯模块;软件则是以嵌入式软件为核心,以提供应用程序编程接口(API),能够向下屏蔽具体的硬件板级支持包BSP。嵌入式系统中,软件和与协调工作的硬件紧密配合,完成系统预定的功能。1.2 系统设计本本设计的一种比较先进的基于GPS的公交车语音报站系统的基本原理如下图所示。通过GPS模块获取GPS工作卫星的导航数据,通过对接收到的数据分析从而计算出公交车当前的经纬度信息、速度等数据;根据GPS定位数据计算出公交车的实时坐标,将其与站点坐标相比较,当公交车驶入站点一定距离范围内时,不用进行人工的干预,系统可以自动为乘客报站。将位置信息与数据库中电子矢量地图进行匹配,根据公交车位置的不同,显示屏上显示不同的站点信息等。在离站、到站阈值范围内语音提示的同时,在显示屏上显示同类信息,也可通过按键设置播报音量的大小。其硬件模块可分为电源、主控芯片、语音合成模块、按键模块、GPS模块和串口触摸屏模块,如下图所示。1.3 硬件选型主控芯片: 方案一:采用STM32F103C8T6芯片。STM32F103C8T6是一款由ST公司设计的低功耗、高度集成的32位RISC处理器,它采用64 脚LQFP 封装,为手持设备和一般类型应用提供了低价格、低功耗、高性能小型微控制器的解决方案。STM32F103C8T6的显著特性是其CPU核心为一个32位的CORTEX-M3处理器。通过提供一系列完整的系统外围设备,STM32F103C8T6可大大减少整个系统的成本,不需要为系统配置额外器件。方案二:利用MSP430微处理器作为主控芯片。MSP430微处理器称为混合信号处理器,它可以是一个数字模拟电路、数字集成电路模块和微处理器的单个芯片上的不同功能的,MSP430微控制器是德州仪器(TI)的1996年开始向市场投放了16位的超低功率,降低了指令集(RISC)混合信号处理器(混合信号处理器)。该设备需要电池供电,在便携式仪器仪表上的应用更好。所以在一些大型、昂贵的的设计上不宜使用。GPS模块: 方案一:采用SIRF公司最新SiRFstarIV GSD4e WLCSP 芯片。CPU内核为ARM7内核处理架构。采用ROM48通道“全视野”追踪卫星,提供最准确的定位数据。采用3.3V CMOS 通用串行接口,UART波特率默认4800bps, 最高1.25Mbps可调,预留 I2C 接口,方便扩展DR 功能,可通过外接GPS 天线实现 NMEA 输出模块定位精度高,-163dbm的灵敏度采用标准NMEA0183码,支持DGPS协议:WAAS,EGNOS 方案二:采用ublox公司GPS模块。LEA-4H/LEA-4S是目前u-blox推出的小型化的第四代GPS模块定位产品本年度主力品种,,模块体积竟然不到一元硬币大小,以突出的65mW的低功耗及竟达到-158db的高感度信号追踪,更重要的是它可以支持无源/有源天线,采用陶瓷无源天线的优势是整个可以做到很小,甚至可以内置于手机当中,也可以外接有源天线来扩展更强的外围信号,各项性能指标在同类GPS模块轻松胜出.显示模块:方案一:利用LED数码管动态扫描显示。LED数码管价格相对低廉,用于显示简单的字母和数字较为合适。但是采用动态扫描法所需单片机的IO口较多,然而因为单片机IO口输出的电流太小,所以还要设计一个驱动电路,利用驱动电路对电流放大后才能控制数码管,如果采用数码管显示的内容多了,电路的焊接的难度会增大比较容易发生错误。 方案二:采用串口屏。串口屏是由液晶屏+单片机+存储器三部分构成的,由计算机将图片和汉字点阵通过GpuMaker程序预先存储到串口屏的存储器中,然后由单片机通过串口发送指令调用显示就可以,单片机部分的编程就会变得异常简单。语音合成模块: 方案一:采用语音合成芯片SC805 。SC8065是一款单芯片CMOS一次性可编程语音芯片,该语音芯片采用最新的架构EPROM OTP(一次性可编程),具有输入PWM脚和两个I / O引脚,拥有准确性和抗干扰性,只有一组PWM输出的,因此无需多余的外部电路。 方案二:采用SYN6288语音合成模块。SYN6288是北京宇音天下科技有限公司于2010年初推出的采用PSOLA拼接合成技术的一款语音合成芯片。SYN6288通过异步串口(UART)通信方式,接收待合成的文本数据,实现文本到语音(或TTS语音)的转换,可直接通过PWM输出方式驱动扬声器或外接功率放大电路驱动扬声器,进行语音输出,并可以通过读取BUSY管脚的电平获取芯片当前的状态。综合上述的描述,最终根据本设计中的功能要求和成本考虑主控芯片采用STM32F103XC8T6,GPS模块采用Ublox公司GPS模块 ,显示模块采用串口屏以及语音合成模块采用SYN6288模块较合理。第二章 硬件模块介绍2.1控制电路设计模块2.1.1主芯片介绍核心处理器STM32F103C8T6是一款由ST公司设计的低功耗、高度集成的32位RISC处理器,它采用64 脚LQFP 封装,为手持设备和一般类型应用提供了低价格、低功耗、高性能小型微控制器的解决方案。STM32F103C8T6的显著特性是其CPU核心为一个32位的CORTEX-M3处理器。通过提供一系列完整的系统外围设备,STM32F103C8T6可大大减少整个系统的成本,不需要为系统配置额外器件。该STM32F103xx中等密度的高性能线系列结合了高性能在72 MHz的频率,高速ARMCortex-M3 32位RISC内核工作嵌入式存储器(闪存高达128 KB的SRAM和高达20千字节)和增强的I / O和外围设备的广泛连接到两个APB总线。所有器件提供了两个12位的ADC,三个通用16位定时器加一PWM定时器,如以及标准和先进的通信接口:多达两个个I2C和SPI,三USART接口,一个USB和一个CAN。该器件采用2.0至3.6 V电源供电。它们是在两个-40到可用+ 85C的温度范围和-40至+105C扩展级温度范围。一个全面的省电模式,可以让低功耗应用的设计。该STM32F103xx中等密度的高性能线系列产品包括六种不同的设备封装类型:从36针到100针。根据选择的设备上,不同组的外围设备包括,下面的描述给出的完整范围的概述在这个家庭提出的外设。这些特点使得STM32F103xx中等密度的高性能微控制器线家庭适用于广泛的应用范围,如电机驱动器,应用控制,医疗和手持设备,PC和游戏外设,GPS平台,工业应用的PLC,变频器,打印机,扫描仪,报警系统,视频对讲,和HVACs。2.1.2控制电路设计最小系统原理图如下所示:图2-1-2 控制电路原理图本设计将PA9和PA10引脚连接GPS的RX和TX端,单片机通过TX引脚给GPS发送指令,GPS模块由RX引脚反馈数据给单片机,单片机通过串口中断的方式接收。PA2和PA3引脚分别连接SY6288语音模块的RX和TX端,也同样单片机由TX端发送指令给语音合成模块从而完成语音播报的控制,RX端则负责处理反馈的数据。另外,还有PA4和PA5两个引脚连接了两个按键,代表音量的增高和降低,通过外部中断的方式触发并处理数据,以达到音量的控制。2.2 车站识别电路设计模块Ublox公司通过使用其他厂商的GPS芯片设计生产GPS模块的方式打入GPS行业,主攻车载GPS市场。小有成就之后,开始涉足芯片设计。此后和Atmel公司合作,U- blox公司提供GPS接收算法,Atmel则负责芯片的设计生产。这次合作使得U- blox成功转型为GPS芯片供应商,并采用自己的芯片继续生产GPS模块,在欧洲车载GPS市场获得巨大成功。当时的Atmel也非常看好U- blox,并考虑过收购U- blox,但当时由于价钱没谈拢,没有成功。转眼间U- blox已经成了一个壮汉,显然不再甘心芯片设计生产再受Atmel约制,开始自己设计芯片,2006成功推出U- blox5系列芯片组,前瞻性地具备兼容美国GPS卫星系统和欧盟伽利略卫星系统引擎,数据刷新频率可小于1秒,50毫瓦的超低功耗和高达-160 dBm的SuperSense跟踪灵敏度等领先性能而终成霸业。在公司成立10年后的2007年成功在瑞士证券交易所上市。如今,U- blox在GPS行业如同一个标杆,是欧洲汽车GPS导航委员会及伽利略委员会委员,参与制定欧洲汽车GPS导航专业标准制定及修正。2.2.1 GPS硬件结构 模块由两个功能部分组成:射频(RF)和基带(Baseband)部分。RF前端包括输入匹配元件、SAW(声表面波)带通滤波器、u-blox 6 RF-IC(带集成的LNA)和频率源。基带部分,包括u-blox 6基带处理器、RTC晶体振荡器和附加的元件如:用于扩展编程和灵活性的可选FLASH内存。其详细结构如下图所示:图2-2-1 GPS内部结构图 VCC:主电源主电源接到VCC脚。在运行期间,u-blox 6 GPS模块的消耗的电流变化非常大,特别是节电模式的时候。系统电源应该能提供短时的峰值电流。当从备份模式切换到正常模式或者启动时u-blox6模块先给内核域的内部电容充电,这时会产生一个很大的电流,对于低功耗的应用,使用节电或备份模式,电源或在模块输入的低ESR电容担负着这个充电电流。V_BCKP:备份电源在VCC失去的时候,实时时钟和备份RAM的供电通过V_BCKP脚。这个备份电源使得u_blox6接收器能够以若启动或温启动方式(取决于VCC掉电的时间长度)从掉电中恢复过来, 可以保持配置信息存储在备份RAM中不丢失。如果无备份电池连接,接收器上电的时候会执行冷启动。u-blox 6具有UART接口(RxD1/TxD1),支持波特率4.8到115.2kBit/s,但注意这个信号输入输出电平是0V到VCC范围,而不是标准的RS232接口电平,所以需要有电平转换IC,如MAX3232。不支持硬件握手信号和同步操作。更多的信息见LEA-6/NEO-6/MAX-6的数据手册。2.2.2 GPS设计通常GPS模块支持两种格式:二进制消息格式和NMEA-0183 ASCII消息格式。前者的通信协议为 9600b/s、无校验、8位数据位、1位停止位;后者的通信协议为4800b/s、无校验、8位数据位、1位停止位。由于NMEA-0183 ASCII格式直观、易于识别及应用,因此本设备采用ASCII格式。 系统接收到的GPS数据主要由帧头、帧尾和帧内数据组成。根据数据帧的不同,帧头也不相同,主要有GPGGA、GPGSA、GPGSV以及GPRMC等。这里选用推荐的GPRMC。各类数据帧分别包含了不同的信息,在此列举出GPRMC的各项含义: GPRMC,*hh 当前位置的格林威治时间,格式为hhmmss。 状态,A为有效位置,V为非有效接收警告,即当前天线视野上方的卫星个数少于颗。 纬度,格式为ddmm.mmmm。 标明南北半球,N为北半球、S为南半球。 径度,格式为dddmmmmmm。 标明东西半球,E为东半球、W为西半球。 地面上的速度,范围为000.0节999.9节(1节=1.852km/h)。 方位角,范围为000.0度359.9度。 日期,格式为ddmmyy。 地磁变化,从000.0度180.0度。 地磁变化方向,为E或W。 由于帧头由逗号分隔的,所以当处理高速缓存的数据每个数据段帧是通常通过搜索ASCII码“$” ,以确定是否首部。之后的类别进行标识的头,然后经通过计算逗号正在处理判断目前的数字是什么样的导航参数,并进行相应的处理。2.3 语音播报电路设计模块语音合成传输电路主要由SYN6288模块和扬声器组成。其中SYN6288负责实现文本到语音的转换(TTS),扬声器负责发出声音提示。SYN6288是北京宇音天下科技有限公司于2010年初推出的采用PSOLA拼接合成技术的一款语音合成芯片。SYN6288通过异步串口(UART)通信方式,接收待合成的文本数据,实现文本到语音(或TTS语音)的转换,可直接通过PWM输出方式驱动扬声器或外接功率放大电路驱动扬声器,进行语音输出,并可以通过读取BUSY管脚的电平获取芯片当前的状态。该芯片支持GB2312等格式的文本,支持标点符号、汉字、数字、英文字母及特殊字符处理,可正确识别数值、号码、时间日期及常用的度量衡符号,具备很强的多音字处理和中文姓氏处理能力。SYN6288 通过异步串口接收待合成的文本,实现文本到声音( TTS )的转换。功能特点: 支持 GB2312 、 GBK 、 BIG5 和 UNICODE 内码格式的文本; 清晰、自然、准确的中文语音合成效果;可合成任意的中文文本,支持英文字母的合成; 具有智能的文本分析处理算法,可正确识别数值、号码、时间日期及常用的度量衡符号; 具备很强的多音字处理和中文姓氏处理能力; 支持多种文本控制标记,提升文本处理的正确率; 每次合成的文本量最多可达 200 字节; 支持多种控制命令,包括:合成、停止、暂停合成、继续合成、改变波特率等; 支持休眠功能,在休眠状态下可降低功耗;支持多种方式查询芯片工作状态; 支持串行数据通讯接口,支持三种通讯波特率: 9600bps , 19200bps 、 38400bps ; 支持 16 级音量调整;播放文本的前景音量和播放背景音乐的背景音量可分开控制; 可通过发送控制标记调节词语语速,支持 6 级词语语速调整; 芯片内固化有多首和弦音乐、提示音效和针对某些行业领域的常见语音提示音; 内部集成 19 首声音提示音, 23 首和弦提示音, 15 首背景音乐; 最终产品提供 SSOP 贴片封装形式;体积业内最小; 芯片各项指标均满足室外严酷环境下的应用;2.4 显示电路设计模块2.4.1 串口显示介绍 串口是单片机中最普遍的一种接口,几乎99%的单片机系统都支持串口,串口开发在单片机开发中成为一种基础中的基础,具有广泛的用户基础和资料普及度;而另一方面,TFT彩色液晶屏的控制显示却复杂的多,不仅每家甚至每种屏接口都不一致,且还需要自己处理汉字点阵以及图形点阵,您看到的彩色界面实际上是一个点一个点绘制出来的,需要高档的单片机才能做到,且实现是非常复杂的;常言道,把复杂的事情变简单就是价值,串口屏正遵循了这个原则,您只需要通过串口发送一个命令字符串,比如CLS(1); 就可以将屏幕清成红色;同样发送其他的命令就可以完成汉字以及图片的显示。2.4.2 串口屏原理串口屏是由液晶屏+单片机+存储器三部分构成的,由计算机将图片和汉字点阵通过GpuMaker程序预先存储到串口屏的存储器中,然后由单片机通过串口发送指令调用显示就可以,单片机部分的编程就会变得异常简单;图2-4-2 串口屏原理图2.5 按键电路设计模块此次设计需要两个按键来控制语音播报的音量,采用高电平触发外部中断的方式,由STM32F103C8T6的PA4和PA5管脚控制,其电路设计如下图所示。图2-5 按键电路原理图第三章 系统软件设计3.1 主程序 系统的软件流程下图所示。上电后,首先完成系统初始化,然后创建GPS信号检测任务,并进入此任务执行GPS信号检测及解析,同时监测是否有GPS报站中断产生。若有中断产生,则启动更新GPS数据在显示屏上显示并且播放器播报站名;若没有,则检测是否有触摸屏中断产生。若有中断,则进入人机交互界面;否则继续检测GPS数据是否到达站点,同时检测、解析GPS信号以及按键中断信号。图3-1 主程序流程图3.2 GPS数据解析程序现在GPS的应用越来越广泛,已不仅仅应用于导航系统了。很多项目中,都用到了GPS。比如车载防盗系统。公交调度系统,自动气象仪等等。这里,我大致谈一下GPS数据的提取方法。GPS数据都是一条条的ASCII字符串。每个字符串的开头都是以$开头。以累加和校验(*后的两个字符)以及回车换行结束。$后跟的标识表示当前的字符的种类。如GPRMC,GPGGA等。每种字符串内所包含的数据以,分开。每种字符串所包含数据的格式,在GPS的手册中都有详细说明,这里不多说,主要是说一下,各种字符串的主要用处。$GPRMC,最常用的字符串,包含了时间,日期,定位,和航速航向信息。一般应用,只要有这些信息就可以了。$GPGGA,包含了定位信息相关的详细信息。如定位时用到的星数,定位的方式,天线的海拔高度,精度等等。$GPGSA,包含了定位,水平,海拔三种DOP信息,即精度信息,包含了定位所用到的卫星ID。$GPGSV,包含了GPS模块可以看到的星数(注意,只是能看到的星数,实际使用到的星数在GPGGA中),以及这些卫星的ID号,仰角,方位角,信噪比。关于这种字符串要特别说明的是,它可能会由几条GPGSV字符串组成,因此,每个字符串都包含了共几条字符串,本字串是第几条这样的信息。一般的GPS最多是三条。也有的GPS模块会超过3条。$GPVTG,包含了更详细的航向航速的信息,航向信息分为以真北为参考和以地磁北为参考(真北和地磁北是不一样的,两者相差几度),航速信息则给出了以节为单位和以公里/时为单位的数据。以上信息,一般GPS模块都会默认输出,也有的模块只输出其中几个。在C语言中提供了相关的字符串处理的一些功能,所以你要呈现在这些字符串,只要您可以使用这些功能中的数据。基本的方法是使用strchr函数,字符串被间隔开以读取的atoi函数的整数值与sscanf函数来读取浮点数。在微控制器,因为处理效率低浮动,考虑拆分成两个整数浮动,数字的小数部分和整数部分的数目。特别值得注意的是,通过串口读取GPS字符串时,通常是非常可靠的,但在实践中,有时似乎是错误或不完整的读取,因此,读取GPS字符串是最好的积累和验证,该方法是除“$”的“*”以前的数据后,计算累计总和,其结果与“*”被包括在累积和比较后。他们一致认为,检查通过。在这里,给我出使用的算法。#include gps.h#include stdlib.h#include string.h#include usart.h#include syn6288.hchar GPS_BUF50;char InputBuffer50;u8 rev_start = 0;GPS_INFO GPS_DATA;Site_Typedef Site1,Site2,Site3;u8 cnt=0;u8 Judge_Arrive(void)if(Site1.latitude_Min GPS_DATA.latitude_Degree & GPS_DATA.latitude_Degree Site1.latitude_Max)& (Site1.longitude_Min GPS_DATA.longitude_Degree & GPS_DATA.longitude_Degree Site1.longitude_Max)return 1;if(Site2.latitude_Min GPS_DATA.latitude_Degree & GPS_DATA.latitude_Degree Site2.latitude_Max)& (Site2.longitude_Min GPS_DATA.longitude_Degree & GPS_DATA.longitude_Degree Site2.longitude_Max)return 2;if(Site3.latitude_Min GPS_DATA.latitude_Degree & GPS_DATA.latitude_Degree Site3.latitude_Max)& (Site3.longitude_Min GPS_DATA.longitude_Degree & GPS_DATA.longitude_Degree Site3.longitude_Max)return 3;return 0;void Print_Data(void)GpuSend(CLS(1);rn);sprintf(InputBuffer,DS16(80,4,GPS数据,15);rn);GpuSend(InputBuffer);sprintf(InputBuffer,DS16(5,24,日期:,15);rn);GpuSend(InputBuffer);sprintf(InputBuffer,DS16(5,44,UTC时间:,15);rn);GpuSend(InputBuffer);sprintf(InputBuffer,DS16(5,64,经度:%d%d%d ,15);rn,GPS_DATA.latitude_Degree,GPS_DATA.latitude_Cent,GPS_DATA.latitude_Second);GpuSend(InputBuffer);sprintf(InputBuffer,DS16(5,84,纬度:%d%d%d ,15);rn,GPS_DATA.longitude_Degree,GPS_DATA.longitude_Cent,GPS_DATA.longitude_Second);GpuSend(InputBuffer);sprintf(InputBuffer,DS16(5,104,速度:%f,15);rn,GPS_DATA.speed);GpuSend(InputBuffer);sprintf(InputBuffer,DS16(5,124,到达站点情况,15);rn);GpuSend(InputBuffer);switch(Judge_Arrive()case 1:sprintf(InputBuffer,DS16(5,144,到达站点一,15);rn);GpuSend(InputBuffer);sprintf(InputBuffer,v%d到达站点一,vol_level);syn6288_SpeakStr(InputBuffer,0);break;case 2:sprintf(InputBuffer,DS16(5,144,到达站点二,15);rn);GpuSend(InputBuffer);sprintf(InputBuffer,v%d到达站点二,vol_level);syn6288_SpeakStr(InputBuffer,0);break;case 3:sprintf(InputBuffer,DS16(5,144,到达站点三,15);rn);GpuSend(InputBuffer);sprintf(InputBuffer,v%d到达站点三,vol_level);syn6288_SpeakStr(InputBuffer,0);break;default:sprintf(InputBuffer,DS16(5,144,未到达,15);rn);GpuSend(InputBuffer); break;int GetComma(int num,char *str) int i,j=0; int len=strlen(str); for(i=0;ilen;i+) if(stri=,) j+; if(j=num) return i+1; return 0;/将获取文本信息转换为double型double Get_Double_Number(char *s) char buf128; int i; double rev; i=GetComma(1,s); strncpy(buf,s,i); bufi=0; rev=atof(buf); return rev;/将获取文本信息转换为float型float Get_Float_Number(char *s) char buf128; int i; float rev; i=GetComma(1,s); strncpy(buf,s,i); bufi=0; rev=atof(buf); return rev;int GPS_RMC_Parse(char *line) u8 ch, status, tmp; float lati_cent_tmp, lati_second_tmp; float long_cent_tmp, long_second_tmp; float speed_tmp; char *buf = line; ch = buf5; status = bufGetComma(2, buf); if (ch = C) /如果第五个字符是C,($GPRMC) if (status = A) /如果数据有效,则分析 GPS_DATA.NS = bufGetComma(4, buf); GPS_DATA.EW = bufGetComma(6, buf); GPS_DATA.latitude = Get_Double_Number(&bufGetComma(3, buf); GPS_DATA.longitude = Get_Double_Number(&bufGetComma(5, buf); GPS_DATA.latitude_Degree = (int)GPS_DATA.latitude / 100; /分离纬度 lati_cent_tmp = (GPS_DATA.latitude - GPS_DATA.latitude_Degree * 100); GPS_DATA.latitude_Cent = (int)lati_cent_tmp; lati_second_tmp = (lati_cent_tmp - GPS_DATA.latitude_Cent) * 60; GPS_DATA.latitude_Second = (int)lati_second_tmp; GPS_DATA.longitude_Degree = (int)GPS_DATA.longitude / 100; /分离经度 long_cent_tmp = (GPS_DATA.longitude - GPS_DATA.longitude_Degree * 100); GPS_DATA.longitude_Cent = (int)long_cent_tmp; long_second_tmp = (long_cent_tmp - GPS_DATA.longitude_Cent) * 60; GPS_DATA.longitude_Second = (int)long_second_tmp; speed_tmp = Get_Float_Number(&bufGetComma(7, buf); /速度(单位:海里/时) GPS_DATA.speed = speed_tmp * 1.85; /1海里=1.85公里 GPS_DATA.direction = Get_Float_Number(&bufGetComma(8, buf); /角度 GPS_DATA.D.hour = (buf7 - 0) * 10 + (buf8 - 0); /时间 GPS_DATA.D.minute = (buf9 - 0) * 10 + (buf10 - 0); GPS_DATA.D.second = (buf11 - 0) * 10 + (buf12 - 0); tmp = GetComma(9, buf); GPS_DATA.D.day = (buftmp + 0 - 0) * 10 + (buftmp + 1 - 0); /日期 GPS_DATA.D.month = (buftmp + 2 - 0) * 10 + (buftmp + 3 - 0); GPS_DATA.D.year = (buftmp + 4 - 0) * 10 + (buftmp + 5 - 0) + 2000; /UTC2BTC(&GPS_DATA.D); Print_Data(); return 1; return 0;void USART1_IRQHandler(void)u8 rev;if(USART_GetITStatus(USART1,USART_IT_RXNE)!=RESET)USART_ClearITPendingBit(USART1,USART_IT_RXNE);rev=USART_ReceiveData(USART1);if(rev=$)cnt=0;/USART_SendData(USART1, (unsigned char) rev);rev_start=1;if(rev_start)if(rev!=n)GPS_BUFcnt+=rev;elserev_start=0;GPS_BUFcnt=0;GPS_RMC_Parse(GPS_BUF);3.3 串口触摸屏驱动程序接单片机的电路非常简单,+5V和GND不用说直接接电源,串口屏的RX接单片机的TX端,串口屏的TX接单片劫RX端;TTL电平是05V的电平,因此TTL串口不存在5V和3.3V单片机电平转换的问题,可以直接接入使用;但不可直接与RS232的串口接入,因为RS232的串口电平标准是12V以上,直接接入会烧掉GPU上的单片机。函数GpuSend中循环,将*buf对应的字符串循环将每个字符都发送到串口中,一直到这个字符串结束。然后由单片机通过串口发送指令调用显示就可以,单片机部分的编程就会变得异常简单。void GpuSend(ch

温馨提示

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

评论

0/150

提交评论