delayus(1);
for (nAsrAddLength=0; nAsrAddLength<30; nAsrAddLength++) {
if (sRecog[k][nAsrAddLength] == 0) break;
LD3320_write(0x5, sRecog[k][nAsrAddLength]); //写入列表 。 }
LD3320_write(0xb9, nAsrAddLength); //写入本字符串长度 。 LD3320_write(0xb2, 0xff);
LD3320_write(0x37, 0x04); // 通知写下一个识别词语 。 } return flag; }
// 开始启动语音识别。返回 0 标示失败。返回 1 成功 . unsigned char LD3320_Asr_Run(void) {
LD3320_write(0x35, MIC_VOL); //麦克风的音量设置 。 LD3320_write(0x1C, 0x09); //输入方式选择 LD3320_write(0xBD, 0x20); //启动ASR 或者 MP3 LD3320_write(0x08, 0x01); //清除 FIF0_DATA delayus( 1 );
LD3320_write(0x08, 0x00); delayus( 1 );
if(Check_ASR_Busy() == 0) {
return 0; }
LD3320_write(0xB2, 0xff);
LD3320_write(0x37, 0x06); // 开始准备识别 。 delayus(5);
30
LD3320_write(0x1C, 0x0b); //麦克风 LD3320_write(0x29, 0x10); //同步中断 。
LD3320_write(0xBD, 0x00); //启动识别。 return 1; }
//语音识别流程:1.芯片初始化-----》写入识别列表------》开始识别。 //每识别一次都需要进行一次这样的流程。 unsigned char Start_ASR_task(void) {
unsigned char i=0; unsigned char asrflag=0;
for (i=0; i<5; i++) // 防止由于硬件原因导致LD3320芯片工作不正常,所以一共尝试5次启动ASR识别流程 {
ASR_mode_init(); //芯片初始化 。 delayus(100);
if (LD3320_add_list()==0) {
LD3320_rest(); // LD3320芯片内部出现不正常,立即重启LD3320芯片
delayus(100); // 并从初始化开始重新ASR识别流程
continue; }
delayus(10);
if (LD3320_Asr_Run()==0) {
LD3320_rest(); // LD3320芯片内部出现不正常,立即重启LD3320芯片
delayus(100); // 并从初始化开始重新ASR识别流程
31
continue; } asrflag=1;
break; // ASR流程启动成功,退出当前for循环。开始等待LD3320送出的中断信号 }
return asrflag; //返回 1 标示成功,返回 0 标示失败。 }
//得到识别结果。
void ASR_get_reszult (void) {
unsigned char nAsrResCount=0; unsigned char ucRegVal = 0; if((PINC&0X04)==0X00) {
ucRegVal = LD3320_read(0x2B); // 语音识别产生的中断
// (有声音输入,不论识别成功或失败都有中断) LD3320_write(0x29,0); LD3320_write(0x02,0);
if((ucRegVal&0x10)&&(LD3320_read(0xb2)==0x21)&&(LD3320_read(0xbf)==0x35)) {
nAsrResCount = LD3320_read(0xba); if(nAsrResCount>0 && nAsrResCount<=4) {
nAsrStatus = LD_ASR_FOUNDOK; //识别成功 。 } else {
nAsrStatus = LD_ASR_FOUNDZERO; //识别失败 。
32
} } else {
nAsrStatus = LD_ASR_FOUNDZERO; //失败错误 。 }
LD3320_write(0x2b, 0); LD3320_write(0x1C,0); } }
//状态机的方式调度函数 。 void main(void) {
init_devices(); LD3320_mode_set(); LD3320_rest();
LD3320_read(0x06); LD3320_write(0x35, 0x55);
nAsrStatus = LD_ASR_NONE; // 初始状态:没有在作ASR led_red_on ; led_green_on ; delayms(2000);
while(LD3320_read(0x35)!=0x55); led_red_off; led_green_off; LD3320_rest(); while(1) {
switch(nAsrStatus) {
case LD_ASR_RUNING: //读识别结果。
33