收藏 分销(赏)

公交车报站.docx

上传人:可**** 文档编号:949593 上传时间:2024-04-08 格式:DOCX 页数:77 大小:627.36KB 下载积分:11 金币
下载 相关 举报
公交车报站.docx_第1页
第1页 / 共77页
公交车报站.docx_第2页
第2页 / 共77页


点击查看更多>>
资源描述
目录 1 系统总体方案 3 1.1 公交车报站器可选方案 3 1.2 设计方案的可行性分析和选择 5 1.3 公交车报站器的硬件框图 5 2 系统硬件设计 6 2.1 SPCE061A简介 6 2.2 系统电源设计 10 2.3 语音存储电路设计 10 2.4 音频输出电路设计 12 2.5 显示电路设计 13 2.6 键盘电路设计 14 3 系统软件设计 15 3.1 语音处理 15 3.2 主函数流程图 17 3.3 初始化函数 24 3.4 语音播放的实现 29 3.5 更新时间 32 3.6 设置时间 33 参考文献 46 谢辞 47 附录一 公交车报站器电路图 49 附录二 公交车报站器程序 50 在当今社会,即使在私家车越来越多的今天,公交车仍然是人们出行的首选,因为公交车具有方便、快捷、车票便宜等优点。传统的公交车报站主要由售票员报站,但是有些售票员有着浓重的地方口音,给外地人乘坐公交车造成了困难,另外,随着无人售票车逐渐增多,公交车报站器就越显得重要了。 目前我国公交车辆己从原有的人工语音报站发展到现在的自动语音报站。就报站语音而论,绝大多数报站装置都采用IsD系列的语音芯片,部分报站产品也有采用最新的数字语音处理合成技术,两者各有优缺点。前者成本低,但音质较差,且更改报站信息不灵活,当公交车辆临时改道时必须重新对语音芯片编程;后者受信息容量、语音音质的限制,且更换信息仍需专业设备。因此设计一款能够方便地更换报站信息、播放高音质语音信息的公交车报站器愈显重要。 本方案利用单片机的语音处理功能,以及其强大的处理能力,完成语音的合成技术,再配合存储器 ,扩大存储容量,很容就可以实现公交车报站器,从而为市民提供了更加人性化的服务。这些优点使得本方案成为制作公交报站器一种最经济实用的选择。 1 系统总体方案 公交报站系统的设计要求报站系统可以完整地播放一条公交线路的站名。可以在显示屏上显示当前的时间,具有时间日期的设置功能,还可以播放音乐或广告。经过查阅资料,可选方案有基于MP3/U盘的公交车报站设计,基于GPS的公交车报站器系统设计和基于SPCE061A的公交车报站系统设计等. 1.1 公交车报站器可选方案 1.1.1 基于MP3/U盘的公交车报站设计方案 采用AT89C51SND1C单片机(内部集成MP3解码器)作为主控CPU及解码MP3数据,实现对报站信息播放、点阵字符显示、文件存储以及用作优盘功能时USB与PC机联机的控制。利用FAT16在K9F1208上实现文件系统,形成一个Windows可识别访问的64MB寻址区域。结合USB控制器,系统可作为优盘在Windows下使用,从而实现在Windows下对文件的管理以及数据存储功能。这样通过程序的设定,公交车可通过键盘实现MP3格式声音信号的报站以及各种信息的广播。列表文件在系统对闪存初始化时生成,系统在对闪存进行格式化的同时生成该名为SCHED-ULE.LST的列表文件。该列表文件可在Windows下利用记事本打开,编辑所需播放的MP3名称。播放报站信息的同时通过16个16×16的LED点阵显示相应的播放内容。系统框图如图1.1所示。 图1.1 方案一系统框图 1.1.2 基于GPS的公交车自动报站系统设计方案 GPS的公交车自动报站系统利用GPS,通过GPS接收单元接收卫星发送的信号确认车辆的动态位置(经度、纬度)、时间、状态等信息,与公交线路信息库中存储的车站的位置进行比较,根据预先设定的距离和规则向乘客通报车站和线路的语音信息;并且能把车辆运行的详细情况记录下来,对公共汽车的运营状况进行全程监控并记录。系统的组成见图1.2。 天线 图1.2 方案二系统框图 1.1.3 基于SPCE061A的公交车报站系统设计方案 系统以 SPCE061A 为核心,可以划分为键盘输入、数码管显示、SPR4096资源存储与语音播放等部分,如图1.3所示。SPCE061A作为整个系统的核心控制,并且负责语音的输出。SPR4096 作为语音资源的存储介质。LED键盘显示模组作为时间显示与用户输出设备.使用SPCE061A可以非常方便灵活的实现语音的录放。两路10位精度的DAC,只需要外接功放(SPY0030A)即可完成语音的播放。 图 1.3 方案三系统框图 1.2 设计方案的可行性分析和选择 这三种方案各有各的优势。基于MP3/U盘的公交报站系统能够作为U盘与电脑连接,可自行下载报站器的播放内容,也可方便地更改播放内容,播放高品质的音乐,无报站播放时可作为MP3播放器,提高公交车服务质量。但是MP3操作页面对于司机来说太小,分散过多的注意力,实用性不够。基于GPS的公交报站系统用先进的卫星定位,进站、出站自动播报站名及服务用语,准确、及时、完全不需要人工介入,实现了公交车报站器的完全智能化。国内GPS语音自动报站系统处于试验阶段,可行性太小。基于SPCE061A公交报站系统,SPCE061A芯片有语音处理能力使得系统设计简化,外围电路较少;另外具有一套指令系统和集成开发环境易学易用效率较高。SPR4096能够存储大量语音数据,符合任务书所给要求。 1.3 公交车报站器的硬件框图 查阅各种相关资料,设计出公交报站系统。系统电路原理图见附录一。 2 系统硬件设计 2.1 SPCE061A简介 SPCE061A型单片机是凌阳科技公司推出的一款16位微处理器,具有体积小、集成度高、易扩展、可靠性高、功耗低、结构简单、中断处理能力强等特点,内嵌32K字闪存FLASH,处理速度高,能够很方便的完成普通单片机的功能,尤其适应于数字语音播报和识别等应用领域,是数字语音识别与语音信号处理的理想产品,得到广泛的应用。 SPCE061A单片机的主要性能有: l 16位 u’nSP 微处理器 l 工作电压(CPU)VDD 为 3.0~3.6V,(I/O)VDDH为 3.0~5.5V l CPU时钟:0.32~49.152MHz l 内置 2K字 SRAM l 内置 32K字FLASH l 可编程音频处理 l 晶体振荡器 l 系统处于备用状态下(时钟处于停止状态),耗电仅为 2uA/3.6V l 2 个16 位可编程定时器/计数器(可自动预置初始计数值) l 2 个10位 DAC(数/模转换)输出通道 l 32 位通用可编程输入/输出通道 l 14 个中断源可来自定时器 A/B、时基、2 个外部时钟源输入和键唤醒 l 具备触键唤醒的功能 l 使用凌阳音频编码 SACM_S480 可以播放压缩的语音资源 l 锁相环 PLL 振荡器提供系统时钟信号 l 32768Hz 实时时钟 l 7 通道10 位电压模/数转换器(ADC)和单通道声音模/数转换器 l 声音模/数转换器输入通道内置麦克风放大器,并具有自动增益控制(AGC)功能 l 具备串行设备接口 l 具备低电压复位功能和低电压检测功能 l 内置在线仿真电路接口 l 具有 WatchDog 功能 图2.1为 SPCE061A单片机的内部结构框图: 图 2.1 SPCE061A 内部结构图 SPCE061A引脚排列如图2.2所示,引脚功能如表2.1所示 图2.2 SPCE061A引脚图 表 2.1 SPCE061A引脚功能表 引脚名称 类型 引脚功能 IOA[15:8] 输入输出 OA[15:8]:双向 IO 端口 IOA[7:0] 输入输出 IOA[7:0]:通过编程,可设置成唤醒管脚 IOA[6:0]:与 ADC Line_In 输入共用 IOB[15:11]   IOB10 IOB9 IOB8 IOB7 IOB6 IOB5 IOB4 IOB3 IOB2 IOB1 IOB0 输入输出 输入输出 输入输出 输入输出 输入输出 输入输出 输入输出 输入输出 输入输出 输入输出 输入输出 输出 IOB[15:11]:双向 IO 端口。IOB10-0 除用作普通的 IO端口,还可作为如下功能: IOB10:通用异步串行数据发送管脚 Tx IOB9:TimerB 脉宽调制输出管脚 BPWMO IOB8:TimerA 脉宽调制输出管脚 APWMO IOB7:通用异步串行数据接收管脚 Rx IOB6:双向 IO 端口 IOB5:外部中断源 EXT2 的反馈管脚 IOB4:外部中断源 EXT1 的反馈管脚 IOB3:外部中断源 EXT2 IOB2:外部中断源 EXT1 IOB1:串行接口的数据传送管脚 IOB0:串行接口的时钟信号 DAC1 输出 DAC1 数据输出管脚 DAC2 输出 DAC2 数据输出管脚 OSCI 输入 32768Hz晶振输入管脚 OSCO 输出 32768Hz晶振输出管脚 VCP 输入 PLL的 RC 滤波器连接管脚 AGC 输入 AGC 的控制管脚 MICN 输入 麦克风负向输入管脚 MICP 输入 麦克风正向输入管脚 VREF2 输出 电压源 2.0V产生5mA 的驱动电流,可用作外部 ADC Line_In 通道的最高参考输入电压,不可作为电压源使用 MICOUT 输出 麦克风 1 阶放大器输出管脚,管脚外接电阻决定AGC增益倍数 OPI 输入 麦克风 2 阶放大器输入管脚 VRTPAD 输入 ADC Line_In 通道的最高参考输入电压管脚 VMIC 输出 麦克风电源 VCM 输出 AD 参考电压(由内部 ADC 产生) VDD 输入 逻辑电源的正向电压 VSS 输入 逻辑电源和 IO 口的参考地 VDDIO 输入 IO 端口的正向电压管脚 VSSIO 输入 IO 端口的参考地 AVDD 输入 模拟电路(A/D、D/A 和 2V 稳压源)正向电压 AVSS 输入 模拟电路(A/D、D/A 和 2V 稳压源)参考地 RSETB 输入 低电平有效的复位管脚 SLEEP 输出 睡眠模式(高电平激活) ICE 输入 激活 ICE(高电平激活 ICECLK 输入 ICE 串行接口时钟管脚 ICESDA 输入输出 ICE 串行接口数据管脚 TEST 输入 测试模式时接高电平,正常模式时接地 GND 或悬浮 ROMT 输入 测试闪烁存储器,正常模式时悬浮 NC 输入 正常使用时接地 2.2 系统电源设计 图2.3是电源部分的电路,61单片机的内核工作电压是3.3V,而IO口电压可以是3.3V也可以是5V。公交蓄电池12V直流电压经过7805产生5V电压,再经过SPY0029后产生3.3V电压分别给系统供电。 是常用的三端正电源稳压电路,使用的是TO-220封装,能提供直流电源5V的输出电压,内含短路和热过载保护电路,应用范围非常广泛。带散热片时能持续提供1A的电流,如果使用外围器件,它还能提供不同的电压和电流。它有三个引脚,引脚1为输入电压,引脚2为+5V输出电压,引脚3接地。 SPY0029是凌阳公司设计的电压调整IC,采用CMOS工艺,具有静态电流低,驱动能力强,线性调整出色等特点。它有三个引脚,引脚1接地,引脚2为输入电压,引脚3为输出电压。 图2.3 2.3 语音存储电路设计 2.3.1 SPR4096芯片简介 3.3.2 语音存储电路 图2.4 SPR4096电路图 2.4 音频输出电路设计 SPCE061A内置2路10位精度的 DAC,芯片输出的音频信号功率较小,在报站时要求比较大的声音,就要对芯片输出的声音信号进行功率放大,因此电路选用了SPY0030音频功率放大电路。 图2.5为音频输出电路。SPCE061A的音频输出采用双通道数/模转换DAC方式,即数字信号通过10位DAC转换成3mA驱动的电流模拟信号输出。语音提示输出直接采用DAC通道,经信号放大后,由SPEAKER(扬声器)输出。 图2.5 音频输出电路 SPY0030芯片是一个音频驱动,其增益可以通过外部电阻(最长增益调整为20)。它的输出功率约700mW,电压可调范围很广(2.4V-6.8V),具有双端输出模式,低失真,低待机电流等特点。简单易用,仅需2.4V(两颗电池)即可工作。图2.6为SPY0030芯片的引脚图。表2.2为引脚功能表。 图 2.6 SPY0030芯片引脚图 表2.2 SPY0030芯片引脚功能表 引脚名称 引脚号 类型 引脚功能 VDD 8 输入 电源的正向电压 VSS 3 输入 电源地 SPP 2 输出 音频输出正极 SPN 1 输出 音频输出负极 ACIN 5 输入 信号输入正极 INN 4 输入 信号输入负极 CE 7 输入 芯片使能 VREF 6 输出 参考电压 2.5 显示电路设计 2.6 键盘电路设计 键盘输入电路如图2.8所示。各按键功能不同,根据各按键功能列出表2.3. 图 2.8 键盘输入电路 表2.3 键盘各按键功能表 按键 公交车报站状态 时间设置状态 S0 逐次播放上行各站提示语,每按一次按顺序播放一个 无效 S1 逐次播放下行各站提示语,每按一次按顺序播放一个 无效 S2 播放警告用语“车辆拐弯,请注意安全” 无效 S3 播放提示语“车上有老弱病残孕乘客,请让座” 无效 S4 播放娱乐音乐或广告 无效 S5 进入设置时间状态 设置切换 S6 显示在时间/日期/年之间切换 增加 S7 打开或关闭数码管 减小 3 系统软件设计 3.1 语音处理 语音处理是建立在语言学和数字信号处理基础之上的综合学科。语音处理大致可以分为 A/D 采样输入、编码处理、存储、解码处理以及 D/A 等。 SPCE061A 是16位单片机,有2个16位定时/计数器;CPU 时钟最高达49MHz ,16 位乘法器和内积运算,有能力执行复杂压缩算法,有完善的语音处理函数库支持等。这些都无疑为语音的播放、录放、合成及识别提供了条件。 3.1.1 压缩存储 采样输入是指音频采样和量化,将模拟的(连续的)声音波形数字化(离散化);语音信号的时域分析,直接利用语音信号的时域波形进行分析;语音信号的频域分析,对语音信号的频谱、功率谱等进行分析;语音信号的线性预测分析,把语音信号用一个模型来表示,利用模型的参数来描述语音信号的波形和频谱特性。 编码处理采用压缩编码,它具有高效存储和高速传输等特点。压缩编码可分为三类: 1. 波形编码:sub-band即SACM_A2000。特点:高质量、高码率,适于高保真语音/音乐。 2. 参数编码:声码器(vocoder)模型表达,抽取参数与激励信号进行编码。如:SACM_S240。特点:压缩比大,计算量大,音质不高,廉价! 3. 混合编码:CELP即SACM_S480。特点:综合参数和波形编码之优点。 本次系统设计方案采用混合编码方式。 压缩分无损压缩和有损压缩。无损压缩一般指:磁盘文件,压缩比低:2:1~4:1。而有损压缩则是指:音/视频文件,压缩比可高达 100:1。 凌阳音频压缩算法根据不同的压缩比分为以下几种: SACM_A2000:压缩比为8:1,8:1.25,8:1.5 SACM_S480: 压缩比为80:3,80:4.5 SACM_S240: 压缩比为80:1.5 按音质排序:A2000>S480>S240 压缩算法中SACM_A2000、 SACM_S480、 SACM_S240 主要是用来放音,可用于语音提示,而DVR则用来录放音。 3.1.2 语音识别 语音的识别可分为下列几个部分:预处理,语音信号数字化;特征提取,抽取反应语音本质的特征参数,形成特征矢量序列;语音模型库,从一个或多个讲话者多次重复讲话中提取的语音参数模板;模式匹配,把输入语音的特征参数与语音模型库进行比较分析,得到识别结果。识别的过程可用图3.1表示。 图3.1 语音的识别 3.1.3 语音合成 语音合成是将以其他方式表示或存储的信息转换成语音。最常见的语音合成技术是将文本转换为语音(TTS)。文本转换成语音如图3.2所示。 图3.2 文本转换成语音图 3.2 主函数流程图 在主函数中完成SPR4096 的初始化、键盘、显示的初始化,并且进行显示时间与播报公交车报站的站点,然后进入循环根据键盘的值执行相关的操作。 主函数流程图如图3.3所示。 图3.3 主函数流程图 主函数程序: 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模组,SPR4096 DIG_Init(); //初始化数码管 Key_Init(); //初始化键盘 Time_Init(); //初始化显示时间 DIG_Set(1,0); DIG_Set(2,0); DIG_Set(3,Data[uiHour_H]); DIG_Set(4,Data[uiHour_L]); DIG_Set(5,Data[uiMinite_H]); DIG_Set(6,Data[uiMinite_L]); Broadcast(52); //播放站点 while(1) { if(uiDisp == 0) //显示时间 { DIG_Set(1,0); DIG_Set(2,0); DIG_Set(3,Data[uiHour_H]); DIG_Set(4,Data[uiHour_L]); DIG_Set(5,Data[uiMinite_H]); DIG_Set(6,Data[uiMinite_L]); } if(uiDisp == 1) //显示月日 { DIG_Set(1,Data[uiMonth_H]); DIG_Set(2,Data[uiMonth_L]); DIG_Set(3,0x0077); DIG_Set(4,Data[uiDay_H]); DIG_Set(5,Data[uiDay_L]); DIG_Set(6,0x007f); } if(uiDisp == 2) //显示年 { DIG_Set(1,0x0040); DIG_Set(2,Data[uiYear_H]); DIG_Set(3,Data[uiYear_MH]); DIG_Set(4,Data[uiYear_ML]); DIG_Set(5,Data[uiYear_L]); DIG_Set(6,0x0040); } uiKey = Key_Get(); //得到键值,扫建程序在128Hz中断中调用 switch(uiKey) { case KEY1: uiA2000_S480 = 0; //选择S480放音,在中断FIQ uiKey = 0; if(uiflag < 1) { uiKey1_Count++; NextStation(uiKey1_Count); //播放提示下一站*** uiflag = 1; } else { uiflag = 0; ComingStation(uiKey1_Count);//****站到了*** } if(uiKey1_Count == 16) { uiKey1_Count = 0; //如果是终点站,重新初始化 } break; case KEY2: uiA2000_S480 = 0; if(uiflag == 0) { uiKey2_Count--; NextStation(uiKey2_Count); uiflag = 1; } else { uiflag = 0; ComingStation(uiKey2_Count); } if(uiKey2_Count == 0) { uiKey2_Count = 16; } break; case KEY3: uiA2000_S480 = 0; PlaySnd_S480(65,3); //播放提示语,车在运行中,请做好扶稳 break; case KEY4: uiA2000_S480 = 0; PlaySnd_S480(67,3); //请让座 break; case KEY5: //广告或娱乐 uiA2000_S480 = 1; PlaySnd_A2000(70,3); break; case KEY6: g_4Hz_On = 1; //进入4Hz中断代码,实现闪烁效果 uiSetflag++; Set_Time(); //设置时间 break; case KEY7: uiKey = 0; uiDisp++; //切换显示时间/月日/年 if(uiDisp == 3) uiDisp = 0; if(uiDisp == 0) { uiTemp = *P_INT_Ctrl_New; //打开2Hz中断,显示秒针 uiTemp |= C_IRQ5_2Hz; *P_INT_Ctrl_New = uiTemp; } else { uiTemp = *P_INT_Ctrl_New; //关闭2Hz中断,不显示秒针 uiTemp &= 0xfffb; *P_INT_Ctrl_New = uiTemp; uiTemp = *P_IOB_Buffer; uiTemp &= 0xfffb; *P_IOB_Data = uiTemp; } break; case KEY8: if(uiOn_Off == 0) { DIG_Off(); //关闭数码管 uiOn_Off = 1; } else { DIG_On(); //打开数码管 uiOn_Off = 0; } break; default: break; } *P_Watchdog_Clear = 0x0001; //清看门狗 } } 3.3 初始化函数 系统要对 SPR4096、键盘、显示、时间初始化。 SPR4096初始化流程图如图3.4所示。 图3.4 spr4096 初始化 SPR4096初始化程序如下: .PUBLIC _SP_SIOInitial _SP_SIOInitial: .PROC //系统时钟设定 r1 = 0x0098; //Fosc=49mHz [P_SystemClock] = r1; r1 = [P_IOB_Dir]; r1 |= 1; //set bit0 output for sck [P_IOB_Dir] = r1; r1 = [P_IOB_Attrib]; r1 |= 1; //buffer output [P_IOB_Attrib] = r1; r1 = [P_IOB_Buffer]; r1 |= 1; //output high [P_IOB_Data] = r1; retf .ENDP 键盘初始化流程图如图3.5所示, 图3.5 键盘初始化 键盘初始化程序如下: F_Key_Init: _Key_Init: push r1 to [sp] INT Off r1 = [P_Key_Dir] // 初始化IO为下拉输入 r1 &= ~Key_ALL [P_Key_Dir] = r1 r1 = [P_Key_Attrib] r1 &= ~Key_ALL [P_Key_Attrib] = r1 r1 = 0 [ScanCnt] = r1 // 初始化变量 [KeyCode] = r1 [KeyUp] = r1 r1 = C_TMB2_128Hz // 开启IRQ6_TMB2(128Hz)中断 [P_TimeBase_Setup] = r1 r1 = [P_INT_Mask] r1 |= C_IRQ6_TMB2 [P_INT_Mask] = r1 INT FIQ,IRQ pop r1 from [sp] Retf .ENDP 数码管初始化流程图如图3.6所示, 图3.6 数码管初始化 数码管初始化程序如下: _DIG_Init: F_DIG_Init: push r1,bp to [sp] INT Off r1 = DIG_Count r2 = 0x0000 bp = R_DIG_Buf ?DIG_InitBuf: //Clear Display Buffer [bp++] = r2 r1 -= 1 jnz ?DIG_InitBuf [R_CurDIG] = r2 //Reset Dig Pointer r1 = [P_SEG_Attrib] //Initial IO Ports for Seg r1 |= PIN_SEG_ALL [P_SEG_Attrib] = r1 r1 = [P_SEG_Buf] r1 &= ~PIN_SEG_ALL [P_SEG_Data] = r1 r1 = [P_SEG_Dir] r1 |= PIN_SEG_ALL [P_SEG_Dir] = r1 r1 = [P_DIG_Attrib] //Initial IO Ports for Dig r1 |= PIN_DIG_ALL [P_DIG_Attrib] = r1 r1 = [P_DIG_Buf] r1 &= ~PIN_DIG_ALL [P_DIG_Buf] = r1 r1 = [P_DIG_Dir] r1 |= PIN_DIG_ALL [P_DIG_Dir] = r1 r1 = [P_INT_Mask] //Enable IRQ4_4KHz Int r1 |= C_IRQ4_4KHz [P_INT_Mask] = r1 INT FIQ,IRQ pop r1,bp from [sp] retf .ENDP 时间初始化流程图如图3.7所示。 图3.7 时间初始化 时间初始化程序: void Time_Init(void) { unsigned int uiTemp; uiTemp = *P_IOB_Dir; //设置IOB2为高电平输出 uiTemp |= 0x0004; *P_IOB_Dir = uiTemp; uiTemp = *P_IOB_Attrib; uiTemp |= 0x0004; *P_IOB_Attrib = uiTemp; uiTemp = *P_IOB_Data; uiTemp |= 0x0004; *P_IOB_Data = uiTemp; uiTemp = *P_INT_Ctrl_New; //开2Hz、4Hz中断 uiTemp |= C_IRQ5_2Hz; uiTemp |= C_IRQ5_4Hz; *P_INT_Ctrl_New = uiTemp; } 3.4 语音播放的实现 由于语音资源存储在外廓的存储器 SPR4096 上面,要实现语音播放必须采用手动方式。需要获得语音资源,关键解决语音资源的起始地址,然后通过读取函数获得语音资源。函数流程图如图3.8所示。 图3.8 手动方式播放流程图 手动方式播放程序: void PlaySnd_A2000(unsigned int SndIndex,unsigned int DAC_Channal) { unsigned int uiStatus; // 语音播放状态 unsigned int uiRet; // 存储语音资源 unsigned long ulCon_AddrHighest; // 语音资源的最高字节地址 unsigned long ulCon_AddrHigh; // 语音资源的高字节地址 unsigned long ulCon_AddrLow; // 语音资源的低字节地址 unsigned long ulCon_AddrLowest; // 语音资源的最低字节地址 unsigned long ulCon_EndAddr; // 语音资源的末地址 unsigned long ulCon_StartAddr; unsigned int uiKey; ulCon_AddrHighest = SP_SIOReadAByte(BASE_START_ADDRESS + SndIndex*12); // 第一个播放文件地址 ulCon_AddrHighest = ulCon_AddrHighest << 24; ulCon_AddrHigh = SP_SIOReadAByte(BASE_START_ADDRESS + SndIndex*12+1); ulCon_AddrHigh = ulCon_AddrHigh << 16; ulCon_AddrLow = SP_SIOReadAByte(BASE_START_ADDRESS + SndIndex*12+2); ulCon_AddrLow = ulCon_AddrLow << 8; ulCon_AddrLowest = SP_SIOReadAByte(BASE_START_ADDRESS + SndIndex*12+3); ulCon_StartAddr = ulCon_AddrHighest | ulCon_AddrHigh // 开始地址 | ulCon_AddrLow | ulCon_AddrLowest; ulCon_AddrHighest = SP_SIOReadAByte(BASE_END_ADDRESS + SndIndex*12); ulCon_AddrHighest = ulCon_AddrHighest << 24; ulCon_AddrHigh = SP_SIOReadAByte(BASE_END_ADDRESS + SndIndex*12+1); ulCon_AddrHigh = ulCon_AddrHigh << 16; ulCon_AddrLow = SP_SIOReadAByte(BASE_END_ADDRESS + SndIndex*12+2); ulCon_AddrLow = ulCon_AddrLow << 8; ulCon_AddrLowest = SP_SIOReadAByte(BASE_END_ADDRESS + SndIndex*12+3); ulCon_EndAddr = ulCon_AddrHighest | ulCon_AddrHigh // 结束地址 | ulCon_AddrLow | ulCon_AddrLowest; 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_SIORea
展开阅读全文

开通  VIP会员、SVIP会员  优惠大
下载10份以上建议开通VIP会员
下载20份以上建议开通SVIP会员


开通VIP      成为共赢上传

当前位置:首页 > 包罗万象 > 大杂烩

移动网页_全站_页脚广告1

关于我们      便捷服务       自信AI       AI导航        抽奖活动

©2010-2025 宁波自信网络信息技术有限公司  版权所有

客服电话:4009-655-100  投诉/维权电话:18658249818

gongan.png浙公网安备33021202000488号   

icp.png浙ICP备2021020529号-1  |  浙B2-20240490  

关注我们 :微信公众号    抖音    微博    LOFTER 

客服