學習目標
- 學習ISD1820語音芯片的使用方法
- 學習STM32 GPIO的輸入輸出
- 按鍵掃描功能實現
- 工作電壓3~5V;
- 單段錄放控制簡單;
- 帶話筒放大直通功能——可用作喊話器模塊;
- 邊沿/電平觸發(fā)放音;
- 內置8Ω喇叭驅動放大電路,即可直接驅動8歐0.5W小喇叭;
- 無需單片機參與即可實現錄放音功能;
- 取樣率和錄放音時間可以由外部振蕩電阻調節(jié)。外接電阻調整錄音時間,可以實現8~20秒語音錄放。錄入的時間越短音質越好,錄入的時間越長音質越差;
振蕩電阻(ROSC): 此端接振蕩電阻至VSS,由振蕩電阻的阻值決定錄放音的時間。
- 錄音喊話器
- 錄音門鈴
- 留言
- 播放固定歡迎語
- 1腳為錄音端(REC),高電平有效。只要REC變高電平(不管芯片處在節(jié)電狀態(tài)還是正在放音),芯片即開始錄音。錄音期間,REC必須保持為高電平。REC變低電平或內存錄滿后,錄音周期結束,芯片自動寫入一個信息結束標志(EOM),使以后的重放操作可以及時停止。
如果用戶只需要電路做放音用,可以在芯片錄好音測試無誤后,將芯片的REC端長期接地,取消REC按鍵,這樣可以防止意外抹音。
- 2腳為邊沿觸發(fā)放音端(PLAYE),此端出現上升沿時,芯片開始放音。放音持續(xù)到EOM標志或內存結束。開始放音后,可以釋放PLAYE。
- 3腳為電平觸發(fā)放音端(PLAYL),此端從低電平變高電平時,芯片開始放音。放音持續(xù)至此端回到低電平,或遇到EOM標志,或內存結束。
- 4腳為話筒輸入端(MIC)。
- 5腳為話筒參考端(MICREF)。
- 6腳為自動增益控制端(AGC)。通常4.7μF的電容器在多數場合下可獲得滿意的效果。
- 7腳、9腳為喇叭輸出端(SP+、SP-),這對輸出端可直接驅動8Ω以上的喇叭。
ISD1820能夠直接推動喇叭,但音量不是很大。如果用戶需要更大音量的輸出,可以外加集成功率放大器。
- 8腳、14腳為地線(VSSA,VSSD),芯片內部的模擬和數字電路的不同地線匯合在這兩個引腳。
- 10腳為振蕩電阻端(ROSC),此端接振蕩電阻至VSS,由振蕩電阻的阻值決定錄放音的時間。
- 11腳為電源端(VCC),芯片內部的模擬和數字電路使用的不同電源總線在此引腳匯合,這樣使得噪聲最小。去耦電容應盡量靠近芯片。
- 12腳為直通模式端(FT),此端允許接在MIC輸入端的外部語音信號經過芯片內部的AGC電路、濾波器和喇叭驅動器而直接到達喇叭輸出端,形成話筒擴音機功能。平時FT端為低電平,要實現直通功能,需將FT端接高電平,同時REC、PLAYE和PLAYL保持低電平。
- 13腳為錄音指示端(/RECLED),處于錄音狀態(tài)時,此端為低電平,可驅動LED。此外,放音遇到EOM標志時,此端輸出一個低電平脈沖。此脈沖可用來觸發(fā)PLAYE,實現循環(huán)放音。
按鍵控制或者單片機IO控制;
- 按下松開按鍵PLAYE可以邊沿觸發(fā)播放語音;
- 持續(xù)按下按鍵PLAYL可以電平觸發(fā)播放語音;
- 持續(xù)按下按鍵REC實現錄音;
以上功能實現不需要單片機參與。
- 按下松開按鍵REC,LED1點亮,相當于指示有錄音留言;
- 按下松開按鍵PLAYE,LED1熄滅,相當于指示留言已讀。
- 按鍵BTN_PLAYE和BTN_REC初始化
//按鍵初始化函數
//PB12 設置成輸入
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
- 實現按鍵掃描函數
//按鍵處理函數
//返回按鍵值
//mode:0,不支持連續(xù)按;1,支持連續(xù)按;
//返回值:
//0,沒有任何按鍵按下
//BTN_PLAYE_PRES,BTN_PLAYE按下
//BTN_REC_PRES,BTN_REC按下
//注意此函數有響應優(yōu)先級,PLAYE>REC!!
u8 KEY_Scan(u8 mode)
{
static u8 key_up=1;//按鍵按松開標志
if(mode)
key_up=1; //支持連按
if(key_up&&(BTN_PLAYE==1||BTN_REC==1))
{
delay_ms(10);//去抖動
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;// 無按鍵按下
}
- LED1聲明
#define LED1 PAout(15) // PA15
- LED1初始化,根據原理圖設計,LED1為低電平的時候,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);
}
- 主函數實現,實現按鍵掃描,當得到BTN_PLAYE按鍵按下后,LED1熄滅;當得到BTN_REC按鍵按下后,LED1點亮。
#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);
}
}