首页 > 编程语言 >51单片机语音识别STC89C52与LD3320语音模块源码分享

51单片机语音识别STC89C52与LD3320语音模块源码分享

时间:2024-06-10 08:59:39浏览次数:15  
标签:ASR LD scan STC89C52 void break 源码 语音 PrintCom

51单片机STC89C52与LD3320语音模块通信源码:

/************************************************************************************/
#include "config.h"


# include <stdio.h>
# include <stdlib.h>

/************************************************************************************/
//	nAsrStatus 用来在main主程序中表示程序运行的状态,不是LD3320芯片内部的状态寄存器
//	LD_ASR_NONE:		表示没有在作ASR识别
//	LD_ASR_RUNING:		表示LD3320正在作ASR识别中
//	LD_ASR_FOUNDOK:		表示一次识别流程结束后,有一个识别结果
//	LD_ASR_FOUNDZERO:	表示一次识别流程结束后,没有识别结果
//	LD_ASR_ERROR:		表示一次识别流程中LD3320芯片内部出现不正确的状态
/***********************************************************************************/
uint8 idata nAsrStatus=0;	
extern void   _nop_     (void); 
void MCU_init(); 
uint8 RunASR();

#if 1//按键
sbit key2=P3^4;
sbit key3=P3^5;
sbit key4=P3^6;
sbit key5=P3^7;
#endif

#if 1//led灯
sbit led1=P1^0;
sbit led2=P1^1;
sbit led3=P1^2;
sbit led4=P1^3;
sbit led5=P1^4;
sbit led6=P1^5;
sbit led7=P1^6;
sbit led8=P1^7;
#endif

#if 1//串口相关
#define jingzhen     11059200UL			 /*使用22.1184M晶体*/	 
#define botelv   9600UL		     /*波特率定义为9600*/
volatile unsigned char sending;
#endif//串口相关

void ProcessInt0(); //识别处理函数
void  delay(unsigned long uldata);
void UartIni();

#if 1//串口相关
void UartIni()
{
 EA=0; //暂时关闭中断
 TMOD&=0x0F;  //定时器1模式控制在高4位
 TMOD|=0x20;    //定时器1工作在模式2,自动重装模式
 SCON=0x50;     //串口工作在模式1
 TH1=256-jingzhen/(botelv*12*16);  //计算定时器重装值
 TL1=256-jingzhen/(botelv*12*16);
 PCON|=0x80;    //串口波特率加倍
 ES=1;         //串行中断允许
 TR1=1;        //启动定时器1
 REN=1;        //允许接收 
 EA=1;         //允许中断
}

void send(unsigned char d)		  //发送一个字节的数据,形参d即为待发送数据。
{
 
 SBUF=d; //将数据写入到串口缓冲
 sending=1;	 //设置发送标志
 while(sending); //等待发送完毕
}

//重写putchar函数
char putchar(char c)
{
	send(c);
	return c;
}


void PrintCom(unsigned char * pd)
{
 while((*pd)!='\0') //发送字符串,直到遇到0才结束
 {
  send(*pd); //发送一个字符
  pd++;  //移动到下一个字符
 }
}

void uart(void) interrupt 4		 //串口发送中断
{
 if(RI)    //收到数据
 {
  RI=0;   //清中断请求
 }
 else      //发送完一字节数据
 {
  TI=0;
  sending=0;  //清正在发送标志
 }
}

void delay_ms(unsigned int x) //延时 x ms
{
unsigned int i,j;
for(i=x;i>0;i--)
for(j=110;j>0;j--);
}
#endif//串口相关


#if 1
void delay10ms() //延时,软件去干扰
{
	delay_ms(10);
}

char key2_scan() //按键判断程序
{
    if(key2==0) //判断是否按下键盘
    {
    delay10ms(); //延时,软件去干扰
               if(key2==0) //确认按键按下
                {
					while(key2==0);
					return 1;
                }          
    }
	return 0;
}
char key3_scan() //按键判断程序
{
    if(key3==0) //判断是否按下键盘
    {
    delay10ms(); //延时,软件去干扰
               if(key3==0) //确认按键按下
                {
					while(key3==0);
					return 1;
                }          
    }
	return 0;
}

char key4_scan() //按键判断程序
{
    if(key4==0) //判断是否按下键盘
    {
    delay10ms(); //延时,软件去干扰
               if(key4==0) //确认按键按下
                {
					while(key4==0);
					return 1;
                }          
    }
	return 0;
}

char key5_scan() //按键判断程序
{
    if(key5==0) //判断是否按下键盘
    {
    delay10ms(); //延时,软件去干扰
               if(key5==0) //确认按键按下
                {
					while(key5==0);
					return 1;
                }          
    }
	return 0;
}
#endif

void test_data()
{
	LD_WriteReg(0xba, 0xf0);
	P1=0xff;//全灭
	delay_ms(1000);
	P1=LD_ReadReg(0xba);

}

/************************************************************************
功能描述: 主函数程序入口
入口参数:	none
返 回 值: 	none
其他说明:	none
**************************************************************************/
void  main()
{
	uint8 idata nAsrRes;
	uint8 i=0;
	uint8 temp=0;


	MCU_init();
	LD_Reset();
	UartIni(); /*串口初始化*/
	nAsrStatus = LD_ASR_NONE;		//	初始状态:没有在作ASR
	PrintCom("串口运行中....\n"); /*text.....*/
	PrintCom("口令:1、代码测试\n"); /*text.....*/
	PrintCom("	2、开发板验证\n"); /*text.....*/
	PrintCom("	3、检查完毕\n"); /*text.....*/
#if 0//串口测试
while(1)
	{
		PrintCom("hello world\r\n");
		delay_ms(500);
		if(key2_scan())PrintCom("key2_scan\r\n");
		if(key3_scan())PrintCom("key3_scan\r\n");
		if(key4_scan())PrintCom("key4_scan\r\n");
		if(key5_scan())PrintCom("key5_scan\r\n");
	}

#endif
#if 1
	P1=0xff;
	while(1)
	{
		//if(key3_scan())test_data();
		switch(nAsrStatus)
		{
			case LD_ASR_RUNING:led7=~led7;delay_ms(300);break;//运行时,led闪烁
			case LD_ASR_ERROR:PrintCom("LD_ASR_ERROR\r\n");break;
				break;
			case LD_ASR_NONE:
					//if(key2_scan()==1)
					//	{
							//PrintCom("启动运行语音识别\r\n");
							//delay_ms(1000);
							nAsrStatus=LD_ASR_RUNING;
							if (RunASR()==0)	/*	启动一次ASR识别流程:ASR初始化,ASR添加关键词语,启动ASR运算*/
							{
								nAsrStatus = LD_ASR_ERROR;
							}
							break;
					//	}
						break;

			case LD_ASR_FOUNDOK: /*	一次ASR识别流程结束,去取ASR识别结果*/
			{
				
				//delay_ms(1000);
				nAsrRes = LD_GetResult();		/*获取结果*/
				//PrintCom("\n识别码:"); /*text.....*/
       			 //UARTSendByte(nAsrRes+0x30); /*text.....*/				
				 switch(nAsrRes)		   /*对结果执行相关操作,客户修改*/
				  {
					  case CODE_QJ:	
					  	//	led1=0;
							PrintCom("CODE_QJ"); /*text.....*/
														 break;
						case CODE_HT:	 
						//	led2=0;
							PrintCom("CODE_HT"); /*text.....*/
														 break;
						case CODE_ZZ:		
						//	led3=0;
							PrintCom("CODE_ZZ"); /*text.....*/
														break;
						case CODE_YZ:
						//	led4=0;
							PrintCom("CODE_YZ"); /*text.....*/
														break;
						case CODE_TZ:
						//	led5=0;
							PrintCom("CODE_TZ"); /*text.....*/
														break;
						default:
							led6=0;	
							PrintCom("未识别\r\n");break;
					}				
				nAsrStatus = LD_ASR_NONE;
				break;
			}
			case LD_ASR_FOUNDZERO://匹配失败
						nAsrStatus = LD_ASR_NONE;
						PrintCom("speech_fail\r\n");
						break;
			default:
			{
				nAsrStatus = LD_ASR_NONE;
				break;
			}
		}// switch	 
	}// while
#endif
}

/************************************************************************
功能描述: 	单片机初始化
入口参数:
返 回 值: 
其他说明:
**************************************************************************/
void MCU_init()
{
	P0 = 0xff;
	P1 = 0xff;
	P2 = 0xff;
	P3 = 0xf7;
	IE0=1;
	EX0=1;
	EA=1;
}

/************************************************************************
功能描述: 延时函数
调用函数: 
入口参数: 
返回函数: 
**************************************************************************/
void  delay(unsigned long uldata)
{
	unsigned int j  =  0;
	unsigned int g  =  0;
	for (j=0;j<5;j++)
	{
		for (g=0;g<uldata;g++)
		{
			_nop_();
			_nop_();
			_nop_();
		}
	}
}
/************************************************************************
功能描述: 	运行ASR识别流程
入口参数:	none
返 回 值:  asrflag:1->启动成功, 0—>启动失败
其他说明:	识别顺序如下:
						1、RunASR()函数实现了一次完整的ASR语音识别流程
						2、LD_AsrStart() 函数实现了ASR初始化
						3、LD_AsrAddFixed() 函数实现了添加关键词语到LD3320芯片中
						4、LD_AsrRun()	函数启动了一次ASR语音识别流程					
						任何一次ASR识别流程,都需要按照这个顺序,从初始化开始??
**************************************************************************/
uint8 RunASR()
{
	uint8 i=0;
	uint8 asrflag=0;
	for (i=0; i<5; i++)			//	防止由于硬件原因导致LD3320芯片工作不正常,所以一共尝试5次启动ASR识别流程
	{
		LD_AsrStart();
		delay(100);
		if (LD_AsrAddFixed()==0)
		{
			LD_Reset();			//	LD3320芯片内部出现不正常,立即重启LD3320芯片
			delay(100);			//	并从初始化开始重新ASR识别流程
			//PrintCom("LD_AsrAddFixed芯片内部出现不正常\r\n");
		}
		delay(10);
		if (LD_AsrRun() == 0)
		{
			LD_Reset();			//	LD3320芯片内部出现不正常,立即重启LD3320芯片
			delay(100);			//	并从初始化开始重新ASR识别流程
			//PrintCom("LD_AsrRun芯片内部出现不正常\r\n");
			continue;
		}
		asrflag=1;
		break;					//	ASR流程启动成功,退出当前for循环。开始等待LD3320送出的中断信号
	}
	return asrflag;
}
/************************************************************************
功能描述: 中断处理函数
调用函数: 
入口参数: 
返回函数: 
**************************************************************************/
void ExtInt0Handler(void) interrupt 0  
{ 	
	led8=0;//进入中断用led8指示,观察状态
	ProcessInt0();				//	LD3320 送出中断信号,包括ASR和播放MP3的中断,需要在中断处理函数中分别处理
	led8=1;
}

完整源码下载:

STC89C52与LD3320语音模块.zip: https://url83.ctfile.com/f/45573183-1269764597-c479e5?p=7526 (访问密码: 7526)

标签:ASR,LD,scan,STC89C52,void,break,源码,语音,PrintCom
From: https://blog.csdn.net/lilihewo/article/details/139569843

相关文章