基于SPCE061A和SPR4096的公交车自动报器的研究_第1页
基于SPCE061A和SPR4096的公交车自动报器的研究_第2页
基于SPCE061A和SPR4096的公交车自动报器的研究_第3页
基于SPCE061A和SPR4096的公交车自动报器的研究_第4页
基于SPCE061A和SPR4096的公交车自动报器的研究_第5页
已阅读5页,还剩44页未读 继续免费阅读

下载本文档

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

文档简介

本科毕业设计(论文)基于SPCE061A和SPR4096的公交车自动报器的研究摘 要凌阳十六位单片机SPCE061A采用凌阳最新推出的nSP 16 位微处理器内核(以下简称nSP)。SPCE061A内嵌32K字(Word)闪存(FLASH),2K字(Word)SRAM,有多达十四个的中断源等丰富的片内资源。CPU最高可工作在49MHz的主频下,较高的处理速度使nSP能够非常容易地、快速地处理复杂的数字信号,这使得SPCE061A具有灵活的语音处理能力。因此,本设计应用此单片机,公交车自动报站器主要实现了自动报站和时间显示的功能。本文主要讨论了应用SPCE061A精简开发板61板、LED键盘显示模组、SPR模组_4096实现简易的公交车报站器系统中软件部分的实现。 关键词:SPCE061A,SPR4096,语音,自动报站本科毕业设计(论文)The software process of system to realize the bus announcing station automaticallyAbstract: The spec016a is a 16-bit SCM of sunplus, which uses the newest nsp-16 MPU kernel of sunplus( abbreviated nSP). The spec016a is available with both 32k-word flash and 2k-word SRAM with fourteen interrupt port. The CPU can work under the condition of the maximum main frequency 49MHz. The higher processing speed makes it easy and rapid that the nSP process complex digital signals. Therefore the spec016a can process sound flexibly. Automatic announcing bus station system that is designed based on the spce016a realizes announcing bus station and time display. This paper discusses the software process of system to realize the bus announcing station automatically, which is based on the SPCE061A version 61、 LED、 key display mode and SPR4096 mode.Keywords: SPCE061A ,SPR4096 ,Sound ,Automatic announced station本科毕业设计(论文)目 录1.绪论011.1 自动报站系统现状与发展011.2 可行性分析011.3 研究背景和意义022. 基于 SPCE061A 的公交车自动报站系统032.1 方案设计简介032.1.1 功能简介032.1.2 硬件框图032.1.3 硬件功能模块连接说明032.1.4 操作说明功能操作流程042.1.5 注意事项052.2 函数及流程图052.2.1 系统主程序062.2.2 主程序流程图133.报站语音功能的实现133.1.凌阳语音133.1.1 凌阳音频压缩算法的编码标准133.1.2 压缩分类133.1.3 凌阳常用的音频形式和压缩算法133.1.4 常用的应用程序接口 API143.1.5 语音播放的实现153.1.6 C 语言格式的 SACM_A2000 和 SACM_S480 的语音播放程序17 3.2 SPCE061A 单片机与 SPR4096 之间的数据通信193.2.1 串行设备输入输出端口 SIO193.2.2 从串行 flash 读取一个字节的汇编程序223.2.3 获得语音资源的起始地址233.3.键盘程序253.3.1 键盘初始化程序流程图26本科毕业设计(论文)3.3.2 128Hz 中断调用部分263.3.3 F_Key_Scan 子程序273.3.4 获取键值子程序 Key_Get284.时间显示和设置功能的实现304.1.时间的设置和更新304.1.1 更新时间304.1.2 设置时间304.1.3C 语言格式的时间设置函数314.2.凌阳中断应用35 4.2.1 中断响应的过程354.2.2 SPCE061A 中断系统364.2.3 中断源374.2.4 中断控制384.3. C 语言调用汇编语言394.3.1 参数传递404.3.2 堆栈维护及排列40 4.3.3 返回值414.3.4 寄存器数据暂存方式414.3.5 指针414.3.6 以系统软件中一个子程序说明415.结论43参考文献44致谢46外文文献译文1 绪论1.1 自动报站系统现状与发展在我国的大中型城市,公交车自动报站器已经得到广泛使用,而且技术也比较成熟。但本科毕业设计(论文)随着单片机、电子技术的发展,以及更多的科技应用(如:GPS)公交车自动报站系统将更加完善和智能化。下面是国产的最新公交车自动报站系统。AOER GPS 自动语音报站器,是深圳奥尔科技发展有限公司开发的定位自动报站的新产品,它采用 GPS 全球卫星定位系统测量技术与大规模语音合成技术相结合的方式,完全智能化、人性化。彻底改变了传统公交车等语音报站器必须由司机操控才能工作的落后方式,进站、出站自动播报预报站名及服务用语,准确、及时、完全不需要人工介入,是公交车等报站的一项技术革命,为公交车等管理人员和乘客带来了方便。主要功能:1.利用 GPS 全球卫星定位技术,通过系统对经度,纬度的测量准确定位站点,从而实现自动语音报站功能。2.通过主机上的汉字显示器,可显示当前的车站站次,达到站次指示功能。1. 在待机状态下,汉字显示器可显示当前时间。2. 通过主机屏幕的显示,可直观的观察到 GPS 信号的接受状态。3. 通过按键,可轻松的测量新建车站的经度、纬度,并将其快速存储,并利用。4. U 盘存储 GPS 地理信息、站点语音信息、司机行驶记录 1。1.2 可行性分析本设计的核心是凌阳的 16 位单片机(SPCE061A) 。该单片机采用凌阳最新推出的 nSP 16 位微处理器内核(以下简称 nSP) 。SPCE061A 内嵌 32K 字(Word)闪存(FLASH) ,2K 字(Word)SRAM,有多达十四个的中断源等丰富的片内资源。CPU 最高可工作在 49MHz 的主频下,较高的处理速度使 nSP 能够非常容易地、快速地处理复杂的数字信号,这使得SPCE061A 具有灵活的语音处理能力。可以播放 SACM A2000 和 SACM S480 等格式的语音资料,而且还可以配置外部存储器,可以存储很长的声音段。其两个音频 DAC 输出口可以接喇叭,发声系统很容易实现。该单片机拥有两个 16 位的 I/O 口,对于系统要求的显示时间、外接键盘、外接存储器完全可以满足。拥有 14 个中断源,9 个中断向量,2 个中断优先级是SPCE061A 可以完成大量中断子程序,方便系统软件的设计。以上所述 SPCE061A 可以满足该设计的要求。SPR4096 有 512K 的 Flash,可以存储大量的声音资料,足够一条工交路线使用,如果要本科毕业设计(论文)改变工交路线,只需把 SPR4096 中的语音资料擦除,重新烧写。凌阳公司提供了语音压缩软件和语音烧写软件,可以很方便的录音压缩烧写。本单片机的 IDE 开发环境可以编译 C 语言和汇编语言。支持 C 语言和汇编语言的相互调用,以及该单片机丰富的指令集给软件的编写带来很多的自由和方便。1.3 研究背景和意义随着中国经济的高速发展,中国的城市化建设步伐在加快,城市越来越大,人口越来越多。同时城市居民也越来越有钱,私家车迅猛增长。这些都导致了城市交通拥挤。所以在城市居民私家车快速普及的今天,公共交通系统公交车在城市交通中仍然扮演着主要的地位。所以提高公交车的运行效率是现在每个城市面临的问题。传统的人员报站,由于报站员地方口音重,普通话不标准,导致很多外乡人坐错或下错站。而且报站员还容易出错,这对乘客造成很大的不便,严重影响了工交车运输效率。这时急需一种准确的自动化报站形式代替传统的人员报站。单片机的发展,尤其是可以处理语音单片机的出现解决了这个问题。键盘、语音存储模块、单片机和喇叭就够成了一个简易的公交车自动报站系统。而且操作简单,可以有司机在开车的同时很容易的操作,省却了一个报站人员,报站语音是准确的普通话,而且不会出错。极大的提高了公交车运输效率。2. 基于 SPCE061A 的公交车自动报站系统2.1 方案设计简介2.1.1 功能简介 利用SPCE061A单片机、SPR4096模组,LED键盘显示模组制作简易公交车报站器,要求具有下述功能:1.可以完整地播放一条公交线路的站名,包括上行线路与下行线路。 2.可以在LED的键盘显示模组上显示当前的时间(日期),具有时间日期的设 置功能。本科毕业设计(论文)3.可以播放音乐或广告。2.1.2 硬件框图系统以SPCE061A为核心,可以划分为键盘输入、数码管显示、SPR4096资源存储与61板语音播放等部分,如2.1图所示。图2.1 硬件框图2.1.3 硬件功能模块连接说明 LED 键盘显示模组、SPR 模组与 61 板连线图如 2.2 图:可以使用10Pin排线将IOB口高8位与LED键盘显示模组的键盘相连,注意键盘的公共端ROW与高电源相连,使用10Pin排线将IOA低8位与LED键盘显示的段选相连,IOA高8位与LED键盘显示的位选相连。其他按照2.2图相连即可。注意:SPR模组_4096需要外接电源,可以从61板上接。 语音播放SIOSPCE061A存储数据显示数据输入数据61 板 SPR4096LED 键盘显示IOB0IOB1IOA0IOA7IOA8IOA15IOB2IOB8IOB153VSCKSDASEG(a g)DIG1DIG8D_dp1*8KeyROW(Key)SPR4096本科毕业设计(论文)图2.2 模组连接图2.1.4. 操作说明 功能操作流程在第一次开机上电状态,播放一段提示音,并且初始化显示时间 2005 年 1 月 1 日,00时 00 分 00 秒,默认报站按上行处理。按动报站器开始按键,进行报站操作。 主要功能参考 2.3 图: 在公交车报站状态:图 2.3 报站状态各个键的功能逐次播放上行各站提示语,每按一次顺序播放一个逐次播放下行各站提示语,每按一次顺序播放一个播放“车辆转弯,请注意安全”播放“车上有老弱病残孕乘客,请让座播放音乐或广告进入时间设置状态显示在时间/年/月日之间切换打开或关闭数码管显示本科毕业设计(论文)在时间设置状态:图2.4 时间设置状态各个键的功能在设置时间时,按下Key6键(图中右数第三个键)进入设置状态,数码管闪烁。继续按下Key6键逐次切换分钟、小时、日、月、年的设置,按Key7键增加数值,按Key8键减小数值。 在播放语音时,按任意键可以停止播放。2.1.5. 注意事项 在硬件接线的时候注意关闭电源,61 板上的 I/O 输出选择 3.3V。2.2 函数及流程图2.2.1 系统主程序(C 语言格式)#include dig.h /声明数码管相关操作函数#include key.h /声明键盘相关操作函数#include spce061a.h /声明 spce061a 的寄存器#include speech.h /声明语音相关操作函数#include SPR4096_User.h /声明 spr4096 相关操作函数#include show_and_set_time.h /声明设置时间相关操组函数extern unsigned int uiYear_H; /声明全局变量-年extern unsigned int uiYear_MH;extern unsigned int uiYear_ML;extern unsigned int uiYear_L;extern unsigned int uiMonth_H; /声明全局变量-月无效无效无效无效无效设置切换增加减小本科毕业设计(论文)extern unsigned int uiMonth_L;extern unsigned int uiDay_H; /声明全局变量-日extern unsigned int uiDay_L;extern unsigned int uiHour_H; /声明全局变量-小时extern unsigned int uiHour_L;extern unsigned int uiMinite_H;/声明全局变量-分extern unsigned int uiMinite_L;extern unsigned int g_uiSecond_half; /半秒extern unsigned int Data11; /声明外部数组unsigned int uiA2000_S480; /定义全局变量 1:播放 A2000,0:播放 S480unsigned int g_4Hz_On; /闪烁控制,是否进入 4Hz 代码标志unsigned int g_Light; /闪烁标志unsigned int uiSetflag = 0; /设置键标志(Key6)unsigned int uiDisp = 0; /显示年/月/日 切换int main(void)unsigned int uiKey; /键盘值unsigned int uiOn_Off; /数码管显示或不显示标志unsigned int uiKey1_Count; /key1 按下次数unsigned int uiKey2_Count; /key2 按下次数unsigned int uiflag; /按键 key1、key2 的奇偶标志unsigned int uiTemp; /临时变量uiOn_Off = 0; /局部变量初始化uiKey1_Count = 0; /uiKey2_Count = 16;uiflag = 0;SP_SIOInitial(); /初始化 SPR 模组,SPR4096DIG_Init(); /初始化数码管Key_Init(); /初始化键盘本科毕业设计(论文)Time_Init(); /初始化显示时间DIG_Set(1,0);DIG_Set(2,0);DIG_Set(3,DatauiHour_H);DIG_Set(4,DatauiHour_L);DIG_Set(5,DatauiMinite_H);DIG_Set(6,DatauiMinite_L);Broadcast(52); /播放站点while(1)if(uiDisp = 0) /显示时间DIG_Set(1,0);DIG_Set(2,0);DIG_Set(3,DatauiHour_H);DIG_Set(4,DatauiHour_L);DIG_Set(5,DatauiMinite_H);DIG_Set(6,DatauiMinite_L);if(uiDisp = 1) /显示月日DIG_Set(1,DatauiMonth_H);DIG_Set(2,DatauiMonth_L);DIG_Set(3,0x0077);DIG_Set(4,DatauiDay_H);DIG_Set(5,DatauiDay_L);DIG_Set(6,0x007f);if(uiDisp = 2) /显示年本科毕业设计(论文)DIG_Set(1,0x0040);DIG_Set(2,DatauiYear_H);DIG_Set(3,DatauiYear_MH);DIG_Set(4,DatauiYear_ML);DIG_Set(5,DatauiYear_L);DIG_Set(6,0x0040);uiKey = Key_Get(); /得到键值,扫建程序在 128Hz 中断中调用switch(uiKey)case KEY1:uiA2000_S480 = 0;/选择 S480 放音,在中断 FIQuiKey = 0;if(uiflag S480S240 3.1.3 凌阳常用的音频形式和压缩算法1) 波形编码:sub-band即SACM-A2000 特点:高质量、高码率,适于高保真语音音乐。 2) 参数编码:声码器(vocoder)模型表达,抽取参数与激励信号进行编码。如:SACM-S240。 特点:压缩比大,计算量大,音质不高,廉价! 3) 混合编码:CELP即SACM-S480 特点:综合参数和波形编码之优点。 除此之外,还具有FM音乐合成方式即SACM-MS0 常用的应用程序接口API语音和音乐与我们的生活有着非常密切的关系,而单片机对语音的控制如录放音、合成及辨识也广泛应用在现实生活中。我们知道对于语音处理大致可以分为A/D、编码处理、存储、解码处理以及D/A等见图3.1所示。然而,通过前面介绍我们知道麦克风输入所生成的WAVE文件,其占用的存储空间很大,对于单片机来说想要存储大量的信息显然是不可能的,而凌阳的SPCE061A提出了解决的方法,即SACM-LIB,该库将A/D、编码、解码、存储及D/A作成相应的模块,对于每个模块都有其应用程序接口API,所以您只需了解每个模块所要实现的功能及其参数的内容,然后调用该API函数即可实现该功能,例如在程序中插入语音提示,或连续播放一段语音或音乐,也可以根据自己需要的空间或使用范围选择适合自己的算法 12本科毕业设计(论文)图3.1 单片机对语音处理过程在公交车自动报站系统中只用到了 SACM_A2000 和 SACM_S480 两种压缩算法,所以下面只列出了 SACM_A2000 和 SACM_S480 和 API 函数。 SACM_A2000该压缩算法压缩比较小(8:1)所以具有高质量、高码率的特点适用于高保真音乐和语音。其相关API函数如下所示: void SACM_A2000_Initial(int Init_Index) /初始化 void SACM_A2000_ServiceLoop(void) /获取语音资料,填入译码队列 void SACM_A2000_Play(int Speech_Index, int Channel, int Ramp_Set) /播放 void SACM_A2000_Stop(void) /停止播放 void SACM_A2000_Pause (void) /暂停播放 void SACM_A2000_Resume(void) /暂停后恢复 void SACM_A2000_Volume(Volume_Index) /音量控制 unsigned int SACM_A2000_Status(void) /获取模块状态 void SACM_A2000_InitDecode(int Channel) /译码初始化 void SACM_A2000_Decode(void) /译码 void SACM_A2000_FillQueue(unsigned int encoded-data)/填充队列 unsigned int SACM_A2000_TestQueue(void) /测试队列 Call F_FIQ_Service_ SACM_A2000 /中断服务函数 SACM_S480 该压缩算法压缩比较大80:3, 存储容量大,音质介于A2000和S240之间,适用于语音播放, 如“文曲星”词库。 其相关API函数如下所示:存储编解码处理A/D 转换麦克风 D/A 转换 喇叭本科毕业设计(论文)int SACM_S480_Initial(int Init_Index) /初始化void SACM_ S480_ServiceLoop(void) /获取语音资料,填入译码队列 void SACM_ S480_Play(int Speech_Index, int Channel, int Ramp_Set)/播放 void SACM_ S480_Stop(void) /停止播放 void SACM_S480_Pause (void) /暂停播放 void SACM_S480_Resume(void) /暂停后恢复 void SACM_S480_Volume(Volume_Index) /音量的控制 unsigned int SACM_S480_Status(void) /获取模块的状态 Call F_FIQ_Service_ SACM_S480 /中断服务函数 23.1.5 语音播放的实现由于语音资源存储在外廓的存储器SPR4096上面,要实现语音播放必须采用手动方式。需要获得语音资源,关键解决语音资源的起始地址,然后通过读取函数获得语音资源。函数流程图参考图3.2。本科毕业设计(论文)开 始获取语音的起始地址和结束地址初始化放音,列队与解码是否播放语音语音播放结束是否有键按下清看门狗YN判断列队是否为空获得语音资源YN语音资源解码NY结束放音图 3.2 手动方式播放函数流程图3.1.6 C语言格式的SACM_A2000和SACM_S480的语音播放程序 SACM_S480算法:本科毕业设计(论文)SACM_S480_Initial(0);SACM_S480_InitQueue();SACM_S480_InitDecoder(DAC_Channal);uiStatus = 1;while(uiStatus)while(SACM_S480_TestQueue() != 1)if(ulCon_StartAddr = ulCon_EndAddr)uiStatus = 0;break;uiRet = SP_SIOReadAWord(ulCon_StartAddr);SACM_S480_FillQueue(uiRet);ulCon_StartAddr+;ulCon_StartAddr+;if(uiStatus)SACM_S480_Decoder();elseSACM_S480_Stop();uiKey = Key_Get();if(uiKey != 0)本科毕业设计(论文)uiStatus = 0;SACM_S480_Stop();*(unsigned int *)0x7012 = 0x0001; SACM_A2000算法SACM _A2000_Initial(0); /初始化放音SACM_A2000_InitQueue(); /初始化队列SACM_A2000_InitDecoder(DAC_Channal); /初始化解码uiStatus = 1; /初始化放音状态while(uiStatus)while(SACM_A2000_TestQueue() != 1) /解码队列是否为空if(ulCon_StartAddr = ulCon_EndAddr) /文件结束?uiStatus = 0; /如果文件结束,结束放音break;uiRet = SP_SIOReadAWord(ulCon_StartAddr);/取得语音资源SACM_A2000_FillQueue(uiRet); /填充解码队列ulCon_StartAddr+; /移动资源指针ulCon_StartAddr+;if(uiStatus) /解码SACM_A2000_Decoder();本科毕业设计(论文)else /停止放音SACM_A2000_Stop();uiKey = Key_Get();if(uiKey != 0)uiStatus = 0;*(unsigned int *)0x7012 = 0x0001;3.2 SPCE061A 单片机与 SPR4096 之间的数据通信由于语音资源存储在外廓的存储器SPR4096上面,要实现语音播放必须采用手动方式。需要获得语音资源,关键解决语音资源的起始地址,然后通过读取函数获得语音资源。3.2.1 串行设备输入输出端口SIO 2串行输出入端口SIO提供了一个1位的串行接口,用于与其它设备进行数据通讯。在SPCE061A内通过IOB0和IOB1这2个口来实现与设备进行串行交换数据的功能。其中,IOB0用来作为时钟口(SCK), IOB1则 用来作为数据端口(SDA),用于串行数据的接收或发送。要启用串行输出入,除了要设定好P_SIO_Ctrl (701EH)(读/写)单元,还得通过P_IOB_Dir(7007H),P_IOB_Attrib(7008H),P_IOB_Data(7005H) 这三个IOB向量,将 IOB0(SCK)设定为输出引脚。SIO传输速率最快可设为CPUCLK/4,默认值为CPUCLK/16。SPCE061A的SIO速率最快可达12288KHz。SIO可根据外设的差别来选择不同的寻址模式,有8/16/24位三种寻址模式可选择。用户通过写入P_SIO_Start (701FH)单元,来启动数据交换的过程。串行传输的起始地址是由P_SIO_Addr_Low、P_SIO_Addr_Mid 和 P_SIO_Addr_High 这3个单元所指定。 进行写入操作时,必须先向P_SIO_Start(写)单元写入任一数值,以启动数据传输,再来将要传送的八位数据写入P_SIO_Data (写) (701AH)。这时SIO会开始向串行外设传送起始地址,接着传送P_SIO_Data单元中的8位数据。再来我们必须连续检查P_SIO_Start(读)的内容,以得知目前传送的状态,当传送完成时,就可以再次对P_SIO_Data (写) 写入下一个八本科毕业设计(论文)位数据。最后对P_SIO_Stop(写)(7020H)写入数据,结束这一次传输。 进行读取操作时,必须先向P_SIO_Start(写)单元写入任一数值,以启动数据传输,再来就可以从P_SIO_Data (读) (701AH)单元读取传送过来的数据。这时SIO会开始向串行外设传送起始地址,接着接收串行外设传回的8位数据。再来我们必须连续检查P_SIO_Start(读)的内容,以得知目前传送的状 态,当 传送完成时,就可以再次对P_SIO_Data (读) 读取下一个八位数据。最后对P_SIO_Stop( 写)(7020H)写入数据,结束这一次传输。 P_SIO_Ctrl(读/写)(701EH) 用户必须设置P_SIO_Ctrl (701EH) (读/写)单元的第7位,将 IOB0、IOB1分别设置为SCK引脚和SDA引脚。第6位用来决定串行接口是 处于读取或是写入模式。第3、 4位的作用是让用户自行指定数据传输速度;而通过设置第0、1位,可以指定串行设备的寻址宽度。表3.2 P_SIO_Ctrl单元B7 B6 B5 B4 B3 B2 B1 B0SIO_Config R/W EN Clock_Set - Addr_Set 设置功能说明X X X X X - 0 0 16位寻址模式(A0-A15)X X X X X - 0 1 无寻址模式X X X X X - 1 0 8位寻址模式(A0-A7)X X X X X - 1 1 24位寻址模式(A0-A23)X X X 0 0 - X X 数据传输率为CPUCLK/16X X X 0 1 - X X 数据传输率为CPUCLK/4X X X 1 0 - X X 数据传输率为CPUCLK/8X X X 1 1 - X X 数据传输率为CPUCLK/321 X X X X - X X 设置 IOB0=SCK,IOB1=SDA0 X X X X - X X 用做普通的I/O口X 1 X X X - X X 设置SIO为写入模式X 0 X X X - X X 设置SIO为读取模式X X 1 X X - X X 不加入控制位control_bit本科毕业设计(论文) P_SIO_Data(读/写)(701AH) 该单元为收发串行数据的缓冲单元。向该单元写入或读出数据,就可使串行端口发送或接收数据字节。B7 B6 B5 B4 B3 B2 B1 B0D7 D6 D5 D4 D3 D2 D1 D0P_SIO_Data P_SIO_Start(读/写)(701FH) 向P_SIO_Start(写)(701FH)单元写入任一数值,就可以启动数据传输。接着对P_SIO_Data (701AH)单元进行的读写操作,会使得 SIO根据P_SIO_Addr_Low、 P_SIO_Addr_Mid和P_SIO_Addr_High来送出起始地址。之后再读写P_SIO_Data单元时,SIO将不再传送此起始地址。 如果需要传输数据到另一个地址,就必须重新指定起始地址。用户必须先向 P_SIO_Stop (7020H)单元写入任一数值,以停止 SIO 操作,然后向 P_SIO_Addr_Low、 P_SIO_Addr_Mid 和 P_SIO_Addr_High 写入新的地址;最后向 P_SIO_Start(写)(701FH)单元写入任一数值以重新启动 SIO 操作。读P_SIO_Start(701FH)单元可获取SIO的数据传输状态,该单元的第7位为Busy占用标志位,Busy=1 表示正在传输 数据, 传输操作完成后, 该 位将被清为0,可以开始传输新的字节。B7 B6 B5 B4 B3 B2 B1 B0Busy - - - - - - -P_SIO_Start读时状态 P_SIO_Stop(写)(7020H) 向P_SIO_Stop(写)(7020H)单元写入任一数值,可以停止数据传输。通常停止数据传输应出现在启用数据传输之前。但上电复位后的第一个启动命令之前不需要终止命令。 由于SIO口P_SIO_Data只有8bit,所以每次只能读1byte。3.2.2 从串行flash读取一个字节的汇编程序: .public _SP_SIOReadAByte本科毕业设计(论文)_SP_SIOReadAByte: .PROCF_SIOReadAByte:PUSH BP,BP TO SP;BP = SP + 1;R1 = BP+3;P_SIO_Addr_Low=r1; / input SFLASH low addressr1=r1 lsr 4;r1=r1 lsr 4;P_SIO_Addr_Mid=r1; / input SFLASH mid addressR1 = BP+4; / Port directionr1=r1 / input SFLASH hi addressP_SIO_Addr_High=r1;r1=0x0083+C_SIOCLOCK;P_SIO_Ctrl=r1; / clk=CPUclk/16, 24 bit address ;readP_SIO_Start=r1; / enable read moder2=P_SIO_Data; / Clear SFLASH bufferL_WaitSIOReadReady1:r1=P_SIO_Start;test r1,0x0080jnz L_WaitSIOReadReady1r1=P_SIO_Data; / Read exact DataL_WaitSIOReadReady2: / Wait read stopr2=P_SIO_Start;test r2,0x0080jnz L_WaitSIOReadReady2P_SIO_Stop=r2; / disable read modePOP BP,BP FROM SP;retf;.ENDP;本科毕业设计(论文)3.2.3 获得语音资源的起始地址 3 因为语音资源是通过ResWriter工具烧写进SPR4096存储器的,所以要获得语音资源的起始地址必须先了解ResWriter工具烧写后在SPR4096中的资源索引表格。资源索引表格式: 考虑到存储语音资源的实际使用情况,索引表包括4个字节的特定码,整合后文档的起始地址、结束地址、整合前文件的总个数、整合前每个文件的起始地址、结束地址。这些项目依次排列。4个字节的特定码为SPRW(Sunplus Read Write)的ASCII码。特定码的作用主要是从芯片读回的数据保存成文件后,在使用ResWriter工具打开时进行检测。如果文件中存在特定码说明芯片中的数据是使用ResWriter工具烧录的,这样的文件可以在ResWriter工具中正确显示如果没有特定码,那么芯片中的数据就不是通过ResWriter进行烧录的(SPR1024/SPR4096可以通过SPCE061A等单片机进行读写操作,也可以使用AllWriter工具进行读写操作),那么数据文件在ResWriter工具中显示是没有意义的。整合后文件的起始地址便于引用,结束地址便于检查资源是否超出存储范围。整合前文件的起始、结束地址便于直接访问整合前的文件。考虑到文件名实际用处不大,整合后资源长度可以通过结束地址与起始地址计算得出,在索引表中没有保留。如图3.3所示:在地址0x00000-0x00003为4字节的特定码,在地址0x00004-0x00007为4字节的整合后文件的起始地址,在地址0x00008-0x0000B为4字节的整合后文件的结束地址,在地址0x0000C-0x0000D为2字节的整合前文件总数。然后每4字节分别为整合前第一个文件的长度、起始地址、结束地址,一直到最后一个整合前文件的长度、起始地址、结束地址。索引表结束,然后是文件的数据。本科毕业设计(论文)图3.3 索引表图示 从索引表可见,第一个文件的起始地址存储在0x00012,0x00013,0x00014和0x00015四个存储单元中。所以设置 #DEFINE BASE_START_ADDRESS 0X0012#DEFINE BASE_END_ADDRESS 0X0016第一个文件的开始地址和第二个地址相差12个地址所以第N个语音资源的起始地址存储地址的起始位表示为:BASE_START_ADDRESS + (N-1)*12。同理第N个语音资源的结束地址存储地址的起始位表示为:BASE_END_ADDRESS + (N-1)*12。下面是读取第N个语音文件的起始和结束地址的C语言程序:unsigned long ulCon_AddrHighest;unsigned long ulCon_AddrHigh;unsigned long ulCon_AddrLow;unsigned long ulCon_AddrLowest;本科毕业设计(论文)unsigned long ulCon_StartAddr; /语音地址unsigned long ulCon_EndAddr;ulCon_AddrHighest = SP_SIOReadAByte(BASE_START_ADDRESS + (N-1)*12); /第一个播放文件地址ulCon_AddrHighest = ulCon_AddrHighest 24;ulCon_AddrHigh = SP_SIOReadAByte(BASE_START_ADDRESS + (N-1)*12+1);ulCon_AddrHigh = ulCon_AddrHigh 16;ulCon_AddrLow = SP_SIOReadAByte(BASE_START_ADDRESS + (N-1)*12+2)ulCon_AddrLow = ulCon_AddrLow 8;ulCon_AddrLowest = SP_SIOReadAByte(BASE_START_ADDRESS + (N-1)*12 + 3);ulCon_StartAddr = ulCon_AddrHighest | ulCon_AddrHigh| ulCon_AddrLow | ulCon_AddrLowest;ulCon_AddrHighest = SP_SIOReadAByte(BASE_END_ADDRESS + (N-1)*12);ulCon_AddrHighest = ulCon_AddrHighest 24;ulCon_AddrHigh = SP_SIOReadAByte(BASE_END_ADDRESS + (N-1)*12 + 1);ulCon_AddrHigh = ulCon_AddrHigh 16;ulCon_AddrLow = SP_SIOReadAByte(BASE_END_ADDRESS + (N-1)*12 + 2);ulCon_AddrLow = ulCon_AddrLow 8;ulCon_AddrLowest = SP_SIOReadAByte(BASE_END_ADDRESS + (N-1)*12 + 3);ulCon_EndAddr = ulCon_AddrHighest | ulCon_AddrHigh| ulCon_AddrLow | ulCon_AddrLowest;3.3. 键盘程序键盘程序主要分为初始化,中断服务和获取键值三块。3.3.1 键盘初始化程序流程图开始本科毕业设计(论文)图3.4 初始化程序流程图初始化程序比较简单,这里不再讲述。3.3.2 128Hz中断调用部分.public _IRQ6_IRQ6:push r1,r5 to spr1 = C_IRQ6_TMB2test r1,P_INT_Ctrljnz L_IRQ6_TMB2L_IRQ6_TMB1:r1 = C_IRQ6_TMB1P_INT_Clear = r1pop r1,r5 from spretiL_IRQ6_TMB2:call F_Key_Scan /在128Hz中调用扫描键盘r1 = C_IRQ6_TMB2P_INT_Clear = r1pop r1,r5 from sp初始化 IOB8IOB15 为下拉电阻输入口初始化键盘变量打开 128Hz 中断结束本科毕业设计(论文)reti3.3.3 F_Key_Scan子程序 6F_Key_Scan子程序主要是用来防止键盘抖动。F_Key_Scan:_Key_Scan:push r1,r2 to spr2 = P_Key_Data / 获取IO端口状态r2 &= Key_ALLjnz ?L_ScanKey_Down / 判断当前是否有键按下?L_ScanKey_Up:r1 = 1 / 如果按键处于抬起状态则KeyUp置1KeyUp = r1jmp ?L_ScanKey_Exit?L_ScanKey_Down:r1 = 0 / KeyUp置0KeyUp = r1.if Key_IO_HighByter2 = r2 lsr 4r2 = r2 lsr 4.endifcmp r2,KeyCode / 本次得到的键值与上次得到的键值比较je ?L_ScanKey_Cont?L_ScanKey_New: / 如果与上次键值不同则重置键值KeyCode = r2r1

温馨提示

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

评论

0/150

提交评论