
//TG2 、TG1 分别语音芯片键尘的两个控制管脚
TG2 = 0
for(i=0i<250i++) // 延时750us
TG2 = 1
for(i=0i<250i++) // 延时750us
TG1 = 1
for(j=0j<360j++) // 延时 2 ms
TG1 = 0
就这几条语句,就可以发音了。希望对你有所帮助。
并且不同的语音芯片,控制方法也不一样,你应该把你的语音芯片的型号告诉我们,也许正好有人用过呢,或者正在用,大家可以一起交流一下的,
// 工程名称: Car_Demo// 功能描述: 实现小车的语音控制
// 涉及的库: CMacro1016.lib
// bsrv222SDL.lib
//sacmv26e.lib
// 组成文件:纤手 main.c
//Flash.asm, hardware.asm,ISR.asm
//hardware.h,s480.h, hardware.inc
// 硬件连接: IOA0-----KEY1
//IOA1-----KEY2
//IOA2-----KEY3
//IOB8-----前毁颤嫌进
//IOB9-----倒车
//IOB10----左拐
//IOB11----右拐
// 维护记录: 2005-12-12 v1.0
//========================================================
#include "s480.h"
#include "bsrsd.h"
#define P_IOA_Data(volatile unsigned int *)0x7000
#define P_IOA_Dir(volatile unsigned int *)0x7002
#define P_IOA_Attrib (volatile unsigned int *)0x7003
#define P_IOB_Data (volatile unsigned int *)0x7005
#define P_IOB_Dir (volatile unsigned int *)0x7007
#define P_IOB_Attrib (volatile unsigned int *)0x7008
#define P_TimerA_Data (volatile unsigned int *)0x700A
#define P_TimerA_Ctrl (volatile unsigned int *)0x700B
#define P_TimerB_Data (volatile unsigned int *)0x700C
#define P_TimerB_Ctrl (volatile unsigned int *)0x700D
#define P_Watchdog_Clear (volatile unsigned int *)0x7012
#define P_INT_Mask (volatile unsigned int *)0x702D
#define P_INT_Clear (volatile unsigned int *)0x7011
#define NAME_ID0x100
#define COMMAND_GO_ID 0x101
#define COMMAND_BACK_ID 0x102
#define COMMAND_LEFT_ID 0x103
#define COMMAND_RIGHT_ID 0x104
#define S_NAME0 //给我取个名字吧
#define S_ACT11 //前进
#define S_ACT22 //倒车,请注意
#define S_ACT33 //左拐
#define S_ACT44 //右拐
#define S_RDY5 //Yeah
#define S_AGAIN6 //请再说一遍
#define S_NOVOICE 7 //没有听到任何声音
#define S_CMDDIFF 8 //说什么暗语呀
#define S_NOISY8 //说什洞镇么暗语呀
#define S_START9 //准备就绪,开始辨识
#define S_GJG10 //拐就拐
#define S_DCZY11 //倒车,请注意
extern unsigned int BSR_SDModel[100]//外部变量BSR_SDModel[100],辨识器自带
extern void F_FlashWrite1Word(unsigned int addr,unsigned int Value)
extern void F_FlashErase(unsigned int sector)
unsigned int uiTimeset = 3 //运行时间定时,调整该参数控制运行时间
unsigned int uiTimecont//运行时间计时
//=============================================================
// 语法格式: void Delay()
// 实现功能: 延时
// 参数: 无
// 返回值: 无
//=============================================================
void Delay()
{
unsigned int i
for(i=0i<0x3Fffi++)
{
*P_Watchdog_Clear=0x0001
}
}
//=============================================================
// 语法格式: void PlaySnd(unsigned SndIndex,unsigned DAC_Channel)
// 实现功能: 语音播放函数
// 参数: SndIndex-播放语音资源索引号
//DAC_Channel-播放声道选择
// 返回值: 无
//=============================================================
void PlaySnd(unsigned SndIndex,unsigned DAC_Channel)
{
BSR_StopRecognizer() //停止识别器
SACM_S480_Initial(1) //初始化为自动播放
SACM_S480_Play(SndIndex, DAC_Channel, 3) //开始播放一段语音
while((SACM_S480_Status()&0x0001)!= 0)//是否播放完毕?
{
SACM_S480_ServiceLoop() //解码并填充队列
*P_Watchdog_Clear=0x0001 //清看门狗
}
SACM_S480_Stop()//停止播放
BSR_InitRecognizer(BSR_MIC) //初始化识别器
}
//=============================================================
// 语法格式: int TrainWord(int WordID,int SndID)
// 实现功能: 训练一条指令
// 参数: WordID-指令编码
//SndID-指令提示音索引号
// 返回值: 无
//=============================================================
int TrainWord(unsigned int WordID,unsigned int SndID)
{
int Result
PlaySnd(SndID,3)//引导训练,播放指令对应动作
while(1)
{
Result = BSR_Train(WordID,BSR_TRAIN_TWICE) //训练两次,获得训练结果
if(Result==0)break
switch(Result)
{
case -1: //没有检测出声音
PlaySnd(S_NOVOICE,3)
return -1
case -2: //需要训练第二次
PlaySnd(S_AGAIN,3)
break
case -3: //环境太吵
PlaySnd(S_NOISY,3)
return -3
case -4: //数据库满
return -4
case -5://检测出声音不同
PlaySnd(S_CMDDIFF,3)
return -5
case -6://序号错误
return -6
default:
break
}
}
return 0
}
//=============================================================
// 语法格式: void TrainSD()
// 实现功能: 训练函数
// 参数: 无
// 返回值: 无
//=============================================================
void TrainSD()
{
while(TrainWord(NAME_ID,S_NAME) != 0) //训练名称
while(TrainWord(COMMAND_GO_ID,S_ACT1) != 0)//训练第1个动作
while(TrainWord(COMMAND_BACK_ID,S_ACT2) != 0) //训练第2个动作
while(TrainWord(COMMAND_LEFT_ID,S_ACT3) != 0) //训练第3个动作
while(TrainWord(COMMAND_RIGHT_ID,S_ACT4) != 0) //训练第4个动作
}
//=============================================================
// 语法格式: void StoreSD()
// 实现功能: 存储语音模型函数
// 参数: 无
// 返回值: 无
//=============================================================
void StoreSD()
{ unsigned int ulAddr,i,commandID,g_Ret
F_FlashWrite1Word(0xef00,0xaaaa)
F_FlashErase(0xe000)
F_FlashErase(0xe100)
F_FlashErase(0xe200)
ulAddr=0xe000//********
for(commandID=0x100commandID<0x105commandID++)
{
g_Ret=BSR_ExportSDWord(commandID)
while(g_Ret!=0) //模型导出成功?
g_Ret=BSR_ExportSDWord(commandID)
for(i=0i<100i++)//保存语音模型SD1(0xe000---0xe063)
{
F_FlashWrite1Word(ulAddr,BSR_SDModel[i])
ulAddr+=1
}
}
}
//=============================================================
// 语法格式: void StoreSD()
// 实现功能: 装载语音模型函数
// 参数: 无
// 返回值: 无
//=============================================================
void LoadSD()
{ unsigned int *p,k,jk,Ret,g_Ret
p=(int *)0xe000
for(jk=0jk<5jk++)
{
for(k=0k<100k++)
{
Ret=*p
BSR_SDModel[k]=Ret//装载语音模型
p+=1
}
g_Ret=BSR_ImportSDWord()
while(g_Ret!=0) //模型装载成功?
g_Ret=BSR_ImportSDWord()
}
}
//=============================================================
// 语法格式: void GoAhead()
// 实现功能: 前进子函数
// 参数: 无
// 返回值: 无
//=============================================================
void GoAhead() //前进
{
PlaySnd(S_ACT1,3) //提示
*P_IOB_Data=0x0100 //前进
*P_INT_Mask |= 0x0004 //以下为中断定时 *** 作
__asm("int fiq,irq")
uiTimecont = 0
}
//=============================================================
// 语法格式: void BackUp()
// 实现功能: 后退子函数
// 参数: 无
// 返回值: 无
//=============================================================
void BackUp() //倒退
{
PlaySnd(S_DCZY,3) //提示
*P_IOB_Data=0x0200 //倒退
*P_INT_Mask |= 0x0004 //以下为中断定时 *** 作
__asm("int fiq,irq")
uiTimecont = 0
}
//=============================================================
// 语法格式: void TurnLeft()
// 实现功能: 左转子函数
// 参数: 无
// 返回值: 无
//=============================================================
void TurnLeft() //左转
{
PlaySnd(S_GJG,3)
*P_IOB_Data=0x0900 //右转
Delay()//延时
*P_IOB_Data=0x0500 //左转
*P_INT_Mask |= 0x0004 //以下为中断定时 *** 作
__asm("int fiq,irq")
uiTimecont = 0
}
//=============================================================
// 语法格式: void TurnRight()
// 实现功能: 右转子函数
// 参数: 无
// 返回值: 无
//=============================================================
void TurnRight() //右转
{
PlaySnd(S_GJG,3) //语音提示
*P_IOB_Data=0x0500 //左转
Delay()//延时
*P_IOB_Data=0x0900 //右转
*P_INT_Mask |= 0x0004 //以下为中断定时 *** 作
__asm("int fiq,irq")
uiTimecont = 0
}
//=============================================================
// 语法格式: void Stop()
// 实现功能: 停车子函数
// 参数: 无
// 返回值: 无
//=============================================================
void Stop() //停车
{
*P_IOB_Data=0x0000 //停车
PlaySnd(S_RDY,3) //语音提示
}
//=============================================================
// 语法格式: void BSR(void)
// 实现功能: 辨识子函数
// 参数: 无
// 返回值: 无
//=============================================================
void BSR(void)
{
int Result//辨识结果寄存
Result = BSR_GetResult()//获得识别结果
if(Result>0)//有语音触发?
{
*P_IOB_Data=0x0000 //临时停车
switch(Result)
{
case NAME_ID: //识别出名称命令
Stop() //停车待命
break
case COMMAND_GO_ID: //识别出第一条命令
GoAhead() //执行动作一:直走
break
case COMMAND_BACK_ID: //识别出第二条命令
BackUp() //执行动作二:倒车
break
case COMMAND_LEFT_ID: //识别出第三条命令
TurnLeft() //执行动作三:左转
break
case COMMAND_RIGHT_ID: //识别出第四条命令
TurnRight() //执行动作四:右转
break
default:
break
}
}
}
//=============================================================
// 语法格式: void IRQ5(void)
// 实现功能: 中断服务子函数
// 参数: 无
// 返回值: 无
//=============================================================
void IRQ5(void)__attribute__((ISR)) //运动定时控制
void IRQ5(void)
{
if(uiTimecont++ == uiTimeset)
{
*P_IOB_Data = 0x0000
}
*P_INT_Clear = 0x0004
}
//=============================================================
// 语法格式: int main(void)
// 实现功能: 主函数
// 参数: 无
// 返回值: 无
//=============================================================
int main(void)
{ unsigned int BS_Flag //Train标志位
*P_IOA_Dir=0xff00 //初始化IOA,IOA0~7下拉输入
*P_IOA_Attrib=0xff00
*P_IOA_Data=0x0000
*P_IOB_Dir=0x0f00 //初始化IOB,IOB8~11同向输出
*P_IOB_Attrib=0x0f00
*P_IOB_Data=0x0000
BSR_DeleteSDGroup(0) //初始化存储器RAM
BS_Flag=*(unsigned int *)0xe000 //读存储单元0xe000
if(BS_Flag==0xffff) //没有经过训练(0xe000内容为0xffff)
{
TrainSD() //训练
StoreSD() //存储训练结果(语音模型)
}
else //经过训练(0xe000内容为0x0055)
{
LoadSD() //语音模型载入识别器
}
PlaySnd(S_START,3) //开始识别提示
BSR_InitRecognizer(BSR_MIC) //初始化识别器
while(1)
{
BSR()
if((*P_IOA_Data)&0x0004)//是否重新训练
{
F_FlashErase(0xe000)
while(1)
}
}
}
//============================================================
// 文件名称:flash.asm
// 实现功能: SPCE061 32K flash 的读写
// 维护记录: 2003-6-9 V1.0
//============================================================
.INCLUDE hardware.inc
.DEFINE C_FLASH_SIZE 0x8000
.DEFINE C_FLASH_BLOCK_SIZE 0x100
.DEFINE C_FLASH_MATCH 0xAAAA
.DEFINE C_FLASH_PAGE_ERASE 0x5511 //擦除一页
.DEFINE C_FLASH_MASS_ERASE 0x5522 //
.DEFINE C_FLASH_1WORD_PGM 0x5533 //写一个字
.DEFINE C_FLASH_SEQUENT_PGM 0x5544 //写多个字
.DEFINE C_FLASH_MAIN_BLOCK 0x5555
.DEFINE C_FLASH_INFORM_BLOCK 0x5566
.CODE
//============================================================================================
//语法:void F_FlashWrite1Word(int addr,int Value )
//描述:写一个字到FLASH中
//参数:addr-被写数据的存储地址 Value-被写数据
//返回:无
//===============================================================================================
.PUBLIC _F_FlashWrite1Word
.DEFINE P_Flash_Ctrl 0x7555
_F_FlashWrite1Word: .proc
push bp to [sp]
bp = sp+1
r1 = C_FLASH_MATCH//AAAA
[P_Flash_Ctrl] = r1
r1 = C_FLASH_1WORD_PGM //5533
[P_Flash_Ctrl] = r1
r1 = [bp+3] //flash address
r2 = [bp+4] //data
[r1] = r2
pop bp from [sp]
retf
.ENDP
//=============================================================================================
//语法:F_FlashWrite(int sector,int &num, int size)
//描述:顺序写多个字
//参数:sector-被写数据的起始地址 &num-被写数据 size-写数据的数量
//返回:无
//=============================================================================================
.PUBLIC _F_FlashWrite
_F_FlashWrite: .proc
push bp to [sp]
bp = sp+1
r1 = [bp+3] //flash base address
r2 = [bp+4] //data
r3 = [bp+5] //多个字节
r4 = C_FLASH_MATCH//AAAA
[P_Flash_Ctrl] = r4
L_FlashWriteLoop:
r4 = C_FLASH_SEQUENT_PGM //5544
[P_Flash_Ctrl] = r4
r4 = [r2++]
[r1++] = r4
r3 -= 1
jnz L_FlashWriteLoop
[P_Flash_Ctrl] = r3//写结束
pop bp from [sp]
retf
.ENDP
// ============================================================================================
//语法:void F_FlashErase(sector)
//描述:擦除256字节
//参数: sector-擦除页的起始地址
//返回:无
// ============================================================================================
.PUBLIC _F_FlashErase
_F_FlashErase: .proc
push bp to [sp]
bp = sp + 1
r1 = C_FLASH_MATCH//AAAA
[P_Flash_Ctrl] = r1
r1 = C_FLASH_PAGE_ERASE //5511
[P_Flash_Ctrl] = r1
r1 = [bp+3] //擦除一页
[r1] = r1
pop bp from [sp]
retf
.ENDP
.END
//============================================================
// 文件名称:ISR.asm
// 实现功能: 语音播放/识别中断服务
// 维护记录: 2003-9-9 V1.0
//============================================================
.include hardware.inc
.public _FIQ
.external _BSR_FIQ_Routine
.external F_FIQ_Service_SACM_S480
.text
_FIQ:
push R1,R5 to [sp] // 寄存器压栈保护
R1 = C_FIQ_TMA
[P_INT_Clear] = R1
call _BSR_FIQ_Routine //语音识别中断服务
call F_FIQ_Service_SACM_S480//语音播放中断服务
pop R1,R5 from [sp]
reti
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)