单片机语音播放程序8个输入端,当多个 输入端同时有信号时,如何实现语音顺序播放,如1,2有信号,先1后2

如题所述

第1个回答  2011-07-26
搞得很复杂嘛。
首先,现在的语音芯片,多数也能叫语音单片机,都是MCU+FLASH的结构,这种结构下,提供8个输入端(也可以认为是按键接口),其本身就有个简单的优先级判断程式,一般都是最后触发的是最高优先级,即最后触发的会马上播放,如果触发当时正在播放其他声音,那就会中断当前声音播放最后触发的声音。这样的代表芯片有PM66系列语音芯片,PM50(已停产)。
如果你给的输入信号是给直接给到语音芯片的输入端上,那么据我了解,还没有一款芯片可以自己保持输入信号的状态,来完成先1后2,若1撤销2保持,还能再让2播放。
如果需要检测多路信号的状态并保持,选择优先级最高的输入点进行处理,需要你MCU来处理输入信号。本回答被网友采纳
第2个回答  2011-07-12
那还不简单...只要任一输入口有信号就检测其它几个端口,看同时哪几个端口有信号,然后根据需要按序输出语音不就好了
第3个回答  2011-07-13
头文件自己会加吧 在例子工程里找 s480格式的语音要自己录
你没有邮箱,我也没法给你发,将就看吧
ISR.asm 要自己见一个文件

#include "spce061a.h" //声明spce061a的寄存器
#include "s480.h"
#define KEY_ALL 0xff00

void PlaySnd_Auto(unsigned int uiSndIndex,unsigned int uiDAC_Channel);

unsigned int GetKey(void) ;

int main(void)
{

while(1)
{
KeyCode = GetKey();
switch(KeyCode)
{
case KEY1:
PlaySnd_Auto(1,3);
break;
case KEY2:
PlaySnd_Auto(2,3);
break;
case KEY3:
PlaySnd_Auto(15,3); //语音资源序号自己改
break;
case KEY4:
PlaySnd_Auto(15,3);
break;
case KEY5:
PlaySnd_Auto(15,3);
break;
case KEY6:
PlaySnd_Auto(15,3);
break;
case KEY7:
PlaySnd_Auto(15,3);
break;
case KEY8:
PlaySnd_Auto(15,3);
break;
default:
break;

}
}
}

//========================================================
// 语法格式: void PlaySnd_Auto(unsigned int uiSndIndex,
// unsigned int uiDAC_Channel)
// 实现功能: 通过自动方式播放语音资源
// 参数: 1.uiSndIndex:语音资源序号
// 2.uiDAC_Channel:语音播放通道
// 返回值: 无
//========================================================

void PlaySnd_Auto(unsigned int uiSndIndex,unsigned int uiDAC_Channel)
{
SACM_S480_Initial(1); //初始化为自动播放方式
SACM_S480_Play(uiSndIndex,uiDAC_Channel,3); //播放
while((SACM_S480_Status() & 0x0001) != 0)
{ //判断播放状态,如还在播放则继续循环
SACM_S480_ServiceLoop(); //播放系统服务程序
*P_Watchdog_Clear = 0x0001;
}
SACM_S480_Stop(); //停止播放
}

unsigned int GetKey(void) //使用IOA8~IOA15作为键盘输入口
{
unsigned KeyValue=0;

//初始化IOA的相应端口为上拉输入
*P_IOA_Dir &= ~KEY_ALL;
*P_IOA_Attrib &= ~KEY_ALL;
*P_IOA_Buffer |= KEY_ALL;

//等待有键按下,即有端口变为0
//while(!(((*P_IOA_Data) & KEY_ALL) ^ KEY_ALL))
//{
// *P_Watchdog_Clear=1; //清看门狗
//}

while(KeyValue==0)
{
KeyValue=(*P_IOA_Data & KEY_ALL)^KEY_ALL;
*P_Watchdog_Clear=1;
}

KeyValue = ((*P_IOA_Data) & KEY_ALL) ^ KEY_ALL;
//等待按键抬起
while(((*P_IOA_Data)&KEY_ALL)^KEY_ALL)
{
*P_Watchdog_Clear=1;
}
return KeyValue;
}

////////////////////////////////////////ISR.asm///////////////////////////////////

//========================================================
// 文件名称: isr.asm
// 功能描述: 将解码队列的语音资源送到DAC进行播放
// 维护记录: 2005-09-12 v1.0
//========================================================

.INCLUDE s480.inc
.INCLUDE hardware.inc

.TEXT
.PUBLIC _FIQ
_FIQ:
push r1,r5 to [sp]
r1 = C_FIQ_TMA
test r1,[P_INT_Ctrl]
jnz L_FIQ_TimerA
r1 = C_FIQ_TMB
test r1,[P_INT_Ctrl]
jnz L_FIQ_TimerB
L_FIQ_PWM:
r1 = C_FIQ_PWM
[P_INT_Clear] = r1
pop r1,r5 from [sp]
reti
L_FIQ_TimerA:
[P_INT_Clear] = r1
call F_FIQ_Service_SACM_S480
pop r1,r5 from [sp]
reti
L_FIQ_TimerB:
[P_INT_Clear] = r1
pop r1,r5 from [sp]
reti

相关了解……

你可能感兴趣的内容

大家正在搜

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 非常风气网