📄 main.c
字号:
//*************************************************************************
//声控翻书系统==========freela========08年10月26日=========================
//*************************************************************************/
#include "s480.h"
#include "bsrsd.h"
#include "spce061v004.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 C_ONE_ID 0x100 //第一条命
#define C_TWO_ID 0x101 //第二条命令
#define C_THREE_ID 0x102 //第三条
#define C_FOUR_ID 0x103 //第四条
#define C_FIVE_ID 0x104 //第五条
#define S_ZU2 0 //第二组命令
#define S_ONE 1 //第一个命令
#define S_TWO 2 //第二个命令
#define S_THREE 3 //
#define S_FOUR 4 //
#define S_FIVE 5 //第五个命令
#define S_AGAIN 6 //请在说一遍
#define S_BQ 7 //不清楚,请再说一遍
#define S_WELCOME 8 //欢迎使用
#define S_DENGDAI 9 //翻书中请等待
#define S_NOSONG 10 //没有听到任何声音
#define S_DQ 11 //大强在
#define S_XQ 12 //小强在
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 Team=0; // 标记组
//********************************************
//uart_init() 串行口初始化函数
//********************************************
void uart_init() //uart初始化
{
__asm("INT OFF");
*P_IOB_Attrib = 0x0480; //初始化IOB7、IOB10端口
*P_IOB_Dir = 0x0400;
*P_IOB_Data = 0x0000;
*P_UART_BaudScalarLow = 0x00; //设置波特率为9600
*P_UART_BaudScalarHigh = 0x05;
*P_UART_Command1 = 0x0080; //使能接收中断,,0x00c0为发射接和收中断
*P_UART_Command2 = 0x00c0; //使能发送、接收通道
// *P_INT_Ctrl=C_IRQ3_EXT1|C_IRQ3_EXT2; //开中断EXT1
__asm("INT IRQ");
}
//=============================================================
// 语法格式: 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); //初始化识别器
BSR_EnableCPUIndicator();
}
//=============================================================
// 语法格式: 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_NOSONG,3);
return -1;
case -2: //需要训练第二次
PlaySnd(S_AGAIN,3);
break;
case -3: //环境太吵
PlaySnd(S_BQ,3);
return -3;
case -4: //数据库满
PlaySnd(S_DENGDAI,3);
return -4;
case -5: //检测出声音不同
PlaySnd(S_BQ,3); // 都用了NOSONG代替
return -5;
case -6: //序号错误
return -6;
default:
break;
}
}
return 0;
}
//=============================================================
// 语法格式: void TrainSD();
// 实现功能: 训练函数
// 参数: 无
// 返回值: 无
//=============================================================
void TrainSD()
{
BSR_DeleteSDGroup(0);
while(TrainWord(C_ONE_ID,S_ONE) != 0) ; //第一条
while(TrainWord(C_TWO_ID,S_TWO) != 0) ; //第二条
while(TrainWord(C_THREE_ID,S_THREE) != 0) ; //
while(TrainWord(C_FOUR_ID,S_FOUR) != 0) ; //
while(TrainWord(C_FIVE_ID,S_FIVE) != 0) ; //
}
void FormatFlash(void)
{
F_FlashErase(0xe000); //存储第一组命令的Flash空间
F_FlashErase(0xe000+100); //每条命令占用96个字,用函数导出占用100个字
F_FlashErase(0xe000+200);
F_FlashErase(0xe000+300);
F_FlashErase(0xe000+400);
F_FlashErase(0xe400); //存储第一组命令的Flash空间
F_FlashErase(0xe400+100); //每条命令占用96个字,用函数导出占用100个字
F_FlashErase(0xe400+200);
F_FlashErase(0xe400+300);
F_FlashErase(0xe400+400);
}
//=============================================================
// 语法格式: void StoreSD();
// 实现功能: 存储语音模型函数
// 参数: 无
// 返回值: 无
//=============================================================
void StoreSD(unsigned int ulAddr)
{ unsigned int i,commandID,g_Ret;
F_FlashWrite1Word(0xef00,0xaaaa);
// ulAddr=0xe000;//********
for(commandID=0x100;commandID<0x105;commandID++)
{
g_Ret=BSR_ExportSDWord(commandID);
while(g_Ret!=0) //模型导出成功?
g_Ret=BSR_ExportSDWord(commandID);
for(i=0;i<100;i++) //保存语音模型SD1(0xe000---0xe063)
{
F_FlashWrite1Word(ulAddr,BSR_SDModel[i]);
ulAddr+=1;
}
}
}
//=============================================================
// 语法格式: void ImportFiveCommand(unsigned int uiAddr_Import);
// 实现功能: 装载语音模型函数
// 参数: 无
// 返回值: 无
//=============================================================
void ImportFiveCommand(unsigned int uiAddr_Import)
{
unsigned int uiCommand_Import;
unsigned int uiCount;
unsigned int uiRes_Import;
unsigned int *p_Import;
BSR_DeleteSDGroup(0); //清除内存
p_Import = (unsigned int *)uiAddr_Import;
for(uiCommand_Import = 0;uiCommand_Import < 5;uiCommand_Import++)
{
for(uiCount = 0;uiCount < 100;uiCount++)
{
uiRes_Import = *p_Import;
BSR_SDModel[uiCount] = uiRes_Import;
p_Import += 1;
*(unsigned int *)0x7012 = 1;
}
uiRes_Import = BSR_ImportSDWord();
while(uiRes_Import)
uiRes_Import = BSR_ImportSDWord();
*(unsigned int *)0x7012 = 1;
}
}
//=============================================================
// 语法格式: void BSR(void);
// 实现功能: 辨识子函数
// 参数: 无
// 返回值: 无
//=============================================================
void BSR(void)
{
int Result; //辨识结果寄存
Result = BSR_GetResult(); //获得识别结果
if(Result>0) //有语音触发?
{
switch(Result)
{
case C_ONE_ID: //
switch(Team)
{
case 0:
PlaySnd(S_XQ,3);
ImportFiveCommand(0xe400); // 载入第二组命令
Team=1;
break;
case 1:
PlaySnd(S_DQ,3);
ImportFiveCommand(0xe000); // 载入第一组命令
Team=0;
break;
}
break;
case C_TWO_ID: //
switch(Team)
{
case 0:
*P_UART_Data=0x01;
PlaySnd(S_DENGDAI,3);
break;
case 1:
PlaySnd(S_ONE,3);
break;
}
break;
case C_THREE_ID:
switch(Team)
{
case 0:
*P_UART_Data=0x11;
PlaySnd(S_DENGDAI,3);
break;
case 1:
PlaySnd(S_TWO,3);
break;
}
break;
case C_FOUR_ID:
switch(Team)
{ case 0:
*P_UART_Data=0x02;
PlaySnd(S_DENGDAI,3);
break;
case 1:
PlaySnd(S_THREE,3);
break;
}
break;
case C_FIVE_ID:
switch(Team)
{
case 0:
*P_UART_Data=0x12;
PlaySnd(S_DENGDAI,3);
break;
case 1:
PlaySnd(S_FOUR,3);
break;
}
break;
default:
break;
}
}
}
//=======================================================
//main.c
//=======================================================
int main()
{
unsigned int BS_Flag; //Train标志位
uart_init(); //串口初始化
// BSR_DeleteSDGroup(0); //初始化存储器RAM
BS_Flag=*(unsigned int *)0xe000; //读存储单元0xe000
if(BS_Flag==0xffff) //没有经过训练(0xe000内容为0xffff)
{
FormatFlash();
TrainSD(); //训练
StoreSD(0xe000);
PlaySnd(S_ZU2,3);
TrainSD();
StoreSD(0xe200);
PlaySnd(S_WELCOME,3); //存储训练结果(语音模型)
}
else //经过训练(0xe000内容为0x0055)
{
ImportFiveCommand(0xe000); //语音模型载入识别器
}
ImportFiveCommand(0xe000);
PlaySnd(S_WELCOME,3); //开始识别提示
BSR_InitRecognizer(BSR_MIC); //初始化识别器
while(1)
{
BSR();
if((*P_IOA_Data)&0x0004) //是否重新训练
{
F_FlashErase(0xe000);
while(1);
}
*P_Watchdog_Clear=0x0001;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -