第五章 系统软件设计与研究 5.4 语音播报程序设计
由于语音资源存储在SPR4096上面,需要获得语音资源,关键解决语音资源的起始地址及相关信息的获取,然后通过读取函数调用相关语音资源。语音播报流程图如图5.7所示。眯毆蠐謝银癩唠阁跷贗。 开始获取相关信息及语音开始地址和结束地址初始化放音队列与解码N判断解码队列为空?Y获取语音资源Y是否播放结束?语音播放结束N语音解码是否有按键按下?NY结束播放清看门狗
图5.7 语音播报程序
31
第五章 系统软件设计与研究 5.5 GPS 自动报站程序设计
串口IRQ7中断程序就是利用串口接收GPS数据,根据NMEA0183协议提取公交车的经纬度、运动的方向和速度等信息。程序的流程图如图5.8所示闵屢螢馳鑷隽劍颂崗鳳。 开始N是’$’吗?YN是’G’吗?YN是’P’吗?YN是’R’吗?Y是’M’吗?NY是’C’吗?YN提取GPS中的经纬度、方向等定位信息返回
图5.8 GPS接收数据流程图
GPS自动报站的实现就是依靠GPS采集公交车实时运行的数据(x,y,n),与预存的数据(xi,yi,ni)进行比较,有单片机控制是否要播报语音和显示,并调用相应的操作。判断标准可按照表5.1进行相应操作。程序流程图如图5.9、图所示,其中公交车
32
第五章 系统软件设计与研究 当前运行位置(x,y),站点位置(xi,yi),公交车与第i站的距离的平方为d=
(x?x2i)2?(y?yi)。檁傷葦开阈灯伞馑諧粮。 表5.1
状态 判断依据 动作(语音播报) 靠站 距离站点由很远接近200m 前方到站? 进站 距离站点在50m以内 ××站到了? 出站 距离站点大于60m,速度>0 下一站提示? 运行 距离上站大于100m,距离下站大于200m 广告信息 开始关闭串口通信GPS首次报站?d<462 ?GPS正常报站程序站站站站点点点点123N将下行的下一站信息存入下一站信息next存储单元并保存下行标志将站点i的信息存入当前站Current单元播报和显示:xxx车站到了GPS方向变量与站点i的上行方向相同?打开串口,并清看门狗将上行的下一站信息存入下一站信息next存储单元,并保存上行标志结束
图5.9 GPS自动报站流程图
33
第五章 系统软件设计与研究 5.6 主程序清单
Main函数(main.c): #include \#include \
//声明LCD驱动相关操作函数 //声明键盘相关操作函数
//声明spce061a的寄存器 //声明语音相关操作函数 //声明spr4096相关操作函数
#include \#include \
#include \
#include \//声明设置时间相关操组函数 //以下变量在show_and_set_time.c文件中定义,并且在2Hz中断中改变 unsigned int uiA2000_S480;
绊頎鎦鹧鲕嘤錳。 //定义全局变量1:播放A2000,0:播放S480鄭饩腸//闪烁控制,是否进入4Hz代码标志 //闪烁标志
//设置键标志(Key6) //显示年/月/日 切换
unsigned int g_4Hz_On; unsigned int g_Light;
unsigned int uiSetflag = 0; unsigned int uiDisp = 0; unsigned int gpsflag; int main(void) {
unsigned int uiKey;
//GPS报站标志(Key7)
//键盘值
//显示或不显示标志 //key1按下次数 //key2按下次数
unsigned int uiOn_Off;
unsigned int uiKey1_Count; unsigned int uiKey2_Count; unsigned int uiflag; unsigned int uiTemp; uiOn_Off = 0;
uiKey1_Count = 0; uiKey2_Count = 16; uiflag = 0; SP_SIOInitial(); DIG_Init(); Key_Init(); Time_Init();
// //
//按键key1、key2的奇偶标志 //临时变量
//局部变量初始化
//初始化SPR模组,SPR4096
//初始化LCD //初始化键盘
//初始化显示时间
*P_IOA_Attrib=0xffff; //IOA为带数据缓冲低电平输出 *P_IOA_Dir=0xffff;
34