實物圖如下:
- 一般這種模塊的資料廠家都會給,需要的話可以私信我發郵箱,下面介紹該模塊的各種參數。
- 型號: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.....*/#endifwhile(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_NONEbreak;}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 IOfd=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 IOfd=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;
}