簡(jiǎn)單好用的ISD1820語(yǔ)音錄放芯片
掃描二維碼
隨時(shí)隨地手機(jī)看文章
學(xué)習(xí)目標(biāo)
-
學(xué)習(xí)ISD1820語(yǔ)音芯片的使用方法
-
學(xué)習(xí)STM32 GPIO的輸入輸出
-
按鍵掃描功能實(shí)現(xiàn)
芯片特點(diǎn)
-
工作電壓3~5V;
-
單段錄放控制簡(jiǎn)單;
-
帶話筒放大直通功能——可用作喊話器模塊;
-
邊沿/電平觸發(fā)放音;
-
內(nèi)置8Ω喇叭驅(qū)動(dòng)放大電路,即可直接驅(qū)動(dòng)8歐0.5W小喇叭;
-
無(wú)需單片機(jī)參與即可實(shí)現(xiàn)錄放音功能;
-
取樣率和錄放音時(shí)間可以由外部振蕩電阻調(diào)節(jié)。外接電阻調(diào)整錄音時(shí)間,可以實(shí)現(xiàn)8~20秒語(yǔ)音錄放。錄入的時(shí)間越短音質(zhì)越好,錄入的時(shí)間越長(zhǎng)音質(zhì)越差;
振蕩電阻(ROSC): 此端接振蕩電阻至VSS,由振蕩電阻的阻值決定錄放音的時(shí)間。
推薦應(yīng)用電路
應(yīng)用場(chǎng)景
-
錄音喊話器
-
錄音門(mén)鈴
-
留言
-
播放固定歡迎語(yǔ)
封裝及引腳功能
-
1腳為錄音端(REC),高電平有效。只要REC變高電平(不管芯片處在節(jié)電狀態(tài)還是正在放音),芯片即開(kāi)始錄音。錄音期間,REC必須保持為高電平。REC變低電平或內(nèi)存錄滿后,錄音周期結(jié)束,芯片自動(dòng)寫(xiě)入一個(gè)信息結(jié)束標(biāo)志(EOM),使以后的重放操作可以及時(shí)停止。
如果用戶只需要電路做放音用,可以在芯片錄好音測(cè)試無(wú)誤后,將芯片的REC端長(zhǎng)期接地,取消REC按鍵,這樣可以防止意外抹音。
-
2腳為邊沿觸發(fā)放音端(PLAYE),此端出現(xiàn)上升沿時(shí),芯片開(kāi)始放音。放音持續(xù)到EOM標(biāo)志或內(nèi)存結(jié)束。開(kāi)始放音后,可以釋放PLAYE。
-
3腳為電平觸發(fā)放音端(PLAYL),此端從低電平變高電平時(shí),芯片開(kāi)始放音。放音持續(xù)至此端回到低電平,或遇到EOM標(biāo)志,或內(nèi)存結(jié)束。
-
4腳為話筒輸入端(MIC)。
-
5腳為話筒參考端(MICREF)。
-
6腳為自動(dòng)增益控制端(AGC)。通常4.7μF的電容器在多數(shù)場(chǎng)合下可獲得滿意的效果。
-
7腳、9腳為喇叭輸出端(SP+、SP-),這對(duì)輸出端可直接驅(qū)動(dòng)8Ω以上的喇叭。
ISD1820能夠直接推動(dòng)喇叭,但音量不是很大。如果用戶需要更大音量的輸出,可以外加集成功率放大器。
-
8腳、14腳為地線(VSSA,VSSD),芯片內(nèi)部的模擬和數(shù)字電路的不同地線匯合在這兩個(gè)引腳。
-
10腳為振蕩電阻端(ROSC),此端接振蕩電阻至VSS,由振蕩電阻的阻值決定錄放音的時(shí)間。
-
11腳為電源端(VCC),芯片內(nèi)部的模擬和數(shù)字電路使用的不同電源總線在此引腳匯合,這樣使得噪聲最小。去耦電容應(yīng)盡量靠近芯片。
-
12腳為直通模式端(FT),此端允許接在MIC輸入端的外部語(yǔ)音信號(hào)經(jīng)過(guò)芯片內(nèi)部的AGC電路、濾波器和喇叭驅(qū)動(dòng)器而直接到達(dá)喇叭輸出端,形成話筒擴(kuò)音機(jī)功能。平時(shí)FT端為低電平,要實(shí)現(xiàn)直通功能,需將FT端接高電平,同時(shí)REC、PLAYE和PLAYL保持低電平。
-
13腳為錄音指示端(/RECLED),處于錄音狀態(tài)時(shí),此端為低電平,可驅(qū)動(dòng)LED。此外,放音遇到EOM標(biāo)志時(shí),此端輸出一個(gè)低電平脈沖。此脈沖可用來(lái)觸發(fā)PLAYE,實(shí)現(xiàn)循環(huán)放音。
錄放音控制方式
按鍵控制或者單片機(jī)IO控制;
實(shí)例分析
實(shí)現(xiàn)的功能
-
按下松開(kāi)按鍵PLAYE可以邊沿觸發(fā)播放語(yǔ)音;
-
持續(xù)按下按鍵PLAYL可以電平觸發(fā)播放語(yǔ)音;
-
持續(xù)按下按鍵REC實(shí)現(xiàn)錄音;
以上功能實(shí)現(xiàn)不需要單片機(jī)參與。
-
按下松開(kāi)按鍵REC,LED1點(diǎn)亮,相當(dāng)于指示有錄音留言;
-
按下松開(kāi)按鍵PLAYE,LED1熄滅,相當(dāng)于指示留言已讀。
原理圖
代碼實(shí)現(xiàn)
-
按鍵BTN_PLAYE和BTN_REC初始化
-
//按鍵初始化函數(shù)//PB12 設(shè)置成輸入void KEY_Init(void){ GPIO_InitTypeDef GPIO_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC,ENABLE); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10|GPIO_Pin_11; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD; GPIO_Init(GPIOC, &GPIO_InitStructure);}
-
按鍵聲明
#define BTN_PLAYE GPIO_ReadInputDataBit(GPIOC,GPIO_Pin_11)#define BTN_REC GPIO_ReadInputDataBit(GPIOC,GPIO_Pin_10) #define BTN_PLAYE_PRES 1#define BTN_REC_PRES 2
-
實(shí)現(xiàn)按鍵掃描函數(shù)
-
//按鍵處理函數(shù)//返回按鍵值//mode:0,不支持連續(xù)按;1,支持連續(xù)按;//返回值://0,沒(méi)有任何按鍵按下//BTN_PLAYE_PRES,BTN_PLAYE按下//BTN_REC_PRES,BTN_REC按下//注意此函數(shù)有響應(yīng)優(yōu)先級(jí),PLAYE>REC!!u8 KEY_Scan(u8 mode){ static u8 key_up=1;//按鍵按松開(kāi)標(biāo)志 if(mode) key_up=1; //支持連按 if(key_up&&(BTN_PLAYE==1||BTN_REC==1)) { delay_ms(10);//去抖動(dòng) key_up=0; if(BTN_PLAYE==1)return BTN_PLAYE_PRES; else if(BTN_REC==1)return BTN_REC_PRES; } else if(BTN_PLAYE==0&&BTN_REC==0) { key_up=1; } return 0;// 無(wú)按鍵按下}
-
LED1聲明
#define LED1 PAout(15) // PA15
-
LED1初始化,根據(jù)原理圖設(shè)計(jì),LED1為低電平的時(shí)候,LED1亮。
//LED IO初始化void LED_Init(void){ GPIO_InitTypeDef GPIO_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_AFIO,ENABLE); GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable, ENABLE); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_15; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOA, &GPIO_InitStructure); GPIO_SetBits(GPIOA,GPIO_Pin_15);}
-
主函數(shù)實(shí)現(xiàn),實(shí)現(xiàn)按鍵掃描,當(dāng)?shù)玫紹TN_PLAYE按鍵按下后,LED1熄滅;當(dāng)?shù)玫紹TN_REC按鍵按下后,LED1點(diǎn)亮
-
#include "sys.h"#include "delay.h"#include "usart.h" #include "led.h" #include "key.h" int main(void){ u8 key=0XFF; uart_init(115200); delay_init(); LED_Init(); KEY_Init(); //主循環(huán) while(1) { key = KEY_Scan(0); if(key) { switch(key) { case BTN_PLAYE_PRES: { LED1 = 1; printf("BTN_PLAYE_PRES \r\n"); } break; case BTN_REC_PRES: { LED1 = 0; printf("BTN_REC_PRES \r\n"); } break; } } delay_ms(10); } }
?