实物图如下:
在这里插入图片描述

  • 一般这种模块的资料厂家都会给,需要的话可以私信我发邮箱,下面介绍该模块的各种参数。
  • 型号:YS-LDV7
  • 名称:一体化语音识别模块
  • 规格:43*29.7MM
  • 供电电压:5V (内部工作电压 3.3V)
  • 待机电流:30MA 识别时电流:45MA
  • IO 口输出:高电平为 3.3V
  • 通信方式:串口通信(5V TTL 电平,不可直接接 RS232、RS485)
  • 单片机参数:型号–>STC11L08XE 、flash–>8k、SRAM–>1280、eeprom–>32k
  • 识别词条个数:50 句
  • 工作温度:-20 至 60℃
  • 本模块实际原理为 1 片 STC11 单片机+1 片 LD3320 组合形成的一款语音 识别模块,语音识别部分已写好驱动程序,用于只需要对 STC 单片机进行编 程加入自己的识别语句和控制程序即可,语音识别部分无需理会和做编程处 理。
  • 实物连接图
    在这里插入图片描述
  • 模块下载程序需要用到STC-ISP这个软件,本模块的程序下载实际为 STC 单片机的程序下载方法,首先我们需要安装 USB 转 TTL 驱动(如已安装无需再安装),然后接好 USB 转 TTL。按照下图进行选择各个选项。
    在这里插入图片描述
  • 这里使用一个代码阅读器——sourceInsight(需要的私信)
  • 首先在源代码(是为了让这些代码产生关联)那里新建一个文件夹,然后进入新建的文件夹然后,复制路径。
    在这里插入图片描述
  • 打开sourceInsight新建一个工程,工程存放的路径就是我们刚才复制的路径(放在这个路径下方便添加和查找代码,注意路径不要有中文)
    在这里插入图片描述
  • 点击ok再点击ok,然后出现下图,这时我们需要将源代码添加到我们新建的工程中,点击源代码所在文件夹(code),然后再点击Add all,点击ok,确定,然后关闭即可。
    在这里插入图片描述
  • 如果右侧已经出现代码结构,则不需要下面的操作,如果没有出现则按下图操作。
    在这里插入图片描述
  • 接下来如果乱码则继续往下走,点击file然后选择Reload Encoding然后选择编码格式为Chinese Simplified(GB2312),然后点击Load即可。

在这里插入图片描述

  • 还有一种在方法可以永久解决乱码问题,点击Options,然后点击preference,然后点击file,将Default encoding改成SystemDefault(Windows ANSI)或者Chinese Simplified(GB2312)936
    在这里插入图片描述
  • 然后如果想修改代码大小和格式,点击Options下面的File Type Options,选择自己喜欢的字体。

在这里插入图片描述

  • 那么如何让代码关联起来呢?点击Project选择同步文件Synchrogaze File,同步文件后想要查找某个函数的函数体就很方便了只需要按住Ctrl此时鼠标变为小手,点击即可跳转,现在基本所有的代码编辑软件都带有这个功能。还可以选中你想要查找的目标,然后按住ctrl加斜杠再点击sercher即可在整个工程中查找你选中的目标。
    在这里插入图片描述

LD3320语音模块代码阅读(以下只是main函数部分代码):

void  main(void)
{
	uint8 idata nAsrRes;
	uint8 i=0;
	Led_test();//开机闪烁3次
	MCU_init();//单片机本身初始化,开启中断
	LD_Reset();//LD3320初始化
	UartIni(); //串口初始化,上电后让串口打印东西
	nAsrStatus = LD_ASR_NONE;		//	初始状态:没有在作ASR
	
	#ifdef TEST	//这里的意思是,在代码里有TEST这个宏,下面一段代码参与编译,否则不参与编译
   PrintCom("一级口令:小杰\r\n"); /*text.....*/
	PrintCom("二级口令:1、代码测试\r\n"); /*text.....*/
	PrintCom("	2、开发板验证\r\n"); /*text.....*/
	PrintCom("	3、开灯\r\n"); /*text.....*/
	PrintCom("	4、关灯\r\n"); /*text.....*/
	PrintCom("  5、北京\r\n"); /*text.....*/
	PrintCom("	6、上海\r\n"); /*text.....*/
	PrintCom("	7、广州\r\n"); /*text.....*/
	#endif

	while(1)
	{
		switch(nAsrStatus)
		{
			case LD_ASR_RUNING:/*表示LD3320正在作ASR识别中*/
			case LD_ASR_ERROR:	/*表示一次识别流程中LD3320芯片内部出现不正确的状态*/
				break;
			case LD_ASR_NONE:/*	表示没有在作ASR识别*/
			{
				nAsrStatus=LD_ASR_RUNING;
				if (RunASR()==0)	/*启动一次ASR识别流程:ASR初始化,ASR添加关键词语,启动ASR。RunASR运算功能描述:运行ASR识别流程,入口参数:none,返 回 值:asrflag:1->启动成功, 0—>启动失败*/
				{
					nAsrStatus = LD_ASR_ERROR;
				}
				break;
			}
			case LD_ASR_FOUNDOK: /*	一次ASR识别流程结束,去取ASR识别结果*/
			{				
				nAsrRes = LD_GetResult();		/*获取结果*/
				User_handle(nAsrRes);//用户执行函数,根据返回值进行串口输出
				nAsrStatus = LD_ASR_NONE;//完成一次识别后,将nAsrStatus置为LD_ASR_NONE
				break;
			}
			case LD_ASR_FOUNDZERO:
			default:
			{
				nAsrStatus = LD_ASR_NONE;
				break;
			}
		}// switch	 			
	}// while
}

分析完整体的代码,如果只需要指令是在LDChip.c这个文件里面的LD_AsrAddFixed()这个函数里面去修改,主要是下图部分:(注意不要忘记将LDChip.h里面的宏修改一下,还要有要改main.c里面的User_handle()里面的代码)
在这里插入图片描述单片机C语言code是什么作用?

  • code的作用是告诉单片机,我定义的数据要存储在ROM(程序存储区)里面,写入后就不能再更改,其实是相当与汇编里面的寻址MOVC(好像是),因为C语言中没办法详细描述存入的是ROM还是RAM(存储器),所以在软件中添加了这一个语句起到代替汇编指令的作用,对应的还有data是存入RAM(存储器)的意思。
  • 程序可以简单的分为code(程序)区,和data
    (数据)区,code区在运行的时候是不可以更改的,data区放全局变量和临时变量,是要不断的改变的,cpu从code区读取指令,对data区的数据进行运算处理,因此code区存储在什么介质上并不重要,象以前的计算机程序存储在卡片上,code区也可以放在rom里面,也可以放在ram里面,也可以放在flash里面(但是运行速度要慢很多,主要读flash比读ram要费时间),因此一般的做法是要将程序放到flash里面,然后load到
    ram里面运行的;DATA区就没有什么选择了,肯定要放在RAM里面,放到rom里面改动不了。

附:

  • c51中的存储类型
  • code :程序存储区(64KB)
  • data :可直接寻址的内部数据存储区(128B)
  • idata:不可直接寻址的内部数据存储区(256B)
  • bdata:可位寻址内部数据存储区(16B)
  • xdata:外部数据存储区(64KB)
  • pdata:分页的外部数据存储区

树莓派和电脑之间的串口通信(基于WringPi库,使用时需要包含头文件:#include <wiringSerial.h>):

  • 初次使用树莓派串口编程,需要配置。
  • 修改 cmdline.txt文件 ,cd /boot/sudo vim cmdline.txt,删除【】之间的部分dwc_otg.lpm_enable=0 【console=ttyAMA0,115200】 kgdboc=ttyAMA0,115200 console=tty1 root=/dev/mmcblk0p2 rootfstype=ext4 elevator=deadline rootwai
  • 修改 inittab文件 ,cd /etc/sudo vim inittab注释掉最后一行内容:,在前面加上 # 号,我这里没有找到这个文件,查找文件命令可以使用sudo find -name inittab
  • sudo reboot 重启

在linux下面一切皆文件,进入到dev这个文件下面,如下图所示(串口就是在下面的那一个文件夹): 其中fb0是显示器、mem是内存、rem是磁盘、input是输入系统的一些设备。
在这里插入图片描述
树莓派电脑串口通信代码(树莓派串口一次只能接受8个字节,如果超出8个字节就分多次接收):

#include<stdio.h>
#include<wiringSerial.h>
#include<wiringPi.h>
#include <unistd.h>
#include<stdlib.h>
#include<string.h>
int main()
{
        int fd;
        int readsize;
        char* readbuf;
        readbuf=(char*)malloc(128);
        wiringPiSetup();//init IO
        fd=serialOpen("/dev/ttyAMA0",115200);//open serial,("file adress")
        while(1){
                memset(readbuf,'\0',128);
                //serialPutchar(fd,'h');                
                //serialPuts(fd,"ello\r\n");
                while(serialDataAvail(fd)>0){
                        memset(readbuf,'\0',128);
                        readsize=read(fd,readbuf,128);
                        serialFlush(fd);
                        printf("read %d,context is %s\n",readsize,readbuf);
                }
                delay(1000);
                //serialClose(fd);
        }
        return 0;
}

树莓派和LD3320语音模块之间的通信:

  • 首先是接线:rxd和trd交叉连接,将语音模块的VCC和GND连接到树莓派,VCC接5V,查看树莓派引脚功能指令:gpio readall,read函数在没有数据的时候会阻塞,但是在这里没有阻塞,可能是因为串口底层驱动的设置问题。
#include<stdio.h>
#include<wiringSerial.h>
#include<wiringPi.h>
#include <unistd.h>
#include<stdlib.h>
#include<string.h>
int main()
{
        int fd;
        int readsize;
        char* readbuf;
        readbuf=(char*)malloc(8);
        wiringPiSetup();//init IO
        fd=serialOpen("/dev/ttyAMA0",115200);//open serial,("file adress")
        while(1){
                while(serialDataAvail(fd)>0){
                        memset(readbuf,'\0',8);
                        readsize=read(fd,readbuf,8);
                        printf("cmd is %s",readbuf);//readbuf里面存放的是语音模块串口发送的指令。  
                }
        }
        return 0;
}
Logo

CSDN联合极客时间,共同打造面向开发者的精品内容学习社区,助力成长!

更多推荐