基于LD3320芯片的声电密码门设计 下载本文

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