百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术教程 > 正文

简单好用的ISD1820语音录放芯片

csdh11 2025-01-20 11:54 26 浏览

学习目标

· 学习ISD1820语音芯片的使用方法

· 学习STM32 GPIO的输入输出

· 按键扫描功能实现


芯片特点

1. 工作电压3~5V;

2. 单段录放控制简单;

3. 带话筒放大直通功能——可用作喊话器模块;

4. 边沿/电平触发放音;

5. 内置8Ω喇叭驱动放大电路,即可直接驱动8欧0.5W小喇叭;

6. 无需单片机参与即可实现录放音功能;

7. 取样率和录放音时间可以由外部振荡电阻调节。外接电阻调整录音时间,可以实现8~20秒语音录放。录入的时间越短音质越好,录入的时间越长音质越差;

振荡电阻(ROSC): 此端接振荡电阻至VSS,由振荡电阻的阻值决定录放音的时间。

推荐应用电路

应用场景

· 录音喊话器

· 录音门铃

· 留言

· 播放固定欢迎语

封装及引脚功能:

· 1脚为录音端(REC),高电平有效。只要REC变高电平(不管芯片处在节电状态还是正在放音),芯片即开始录音。录音期间,REC必须保持为高电平。REC变低电平或内存录满后,录音周期结束,芯片自动写入一个信息结束标志(EOM),使以后的重放操作可以及时停止。

如果用户只需要电路做放音用,可以在芯片录好音测试无误后,将芯片的REC端长期接地,取消REC按键,这样可以防止意外抹音。

· 2脚为边沿触发放音端(PLAYE),此端出现上升沿时,芯片开始放音。放音持续到EOM标志或内存结束。开始放音后,可以释放PLAYE。

· 3脚为电平触发放音端(PLAYL),此端从低电平变高电平时,芯片开始放音。放音持续至此端回到低电平,或遇到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),处于录音状态时,此端为低电平,可驱动LED。此外,放音遇到EOM标志时,此端输出一个低电平脉冲。此脉冲可用来触发PLAYE,实现循环放音。


录放音控制方式

按键控制或者单片机IO控制;


实例分析

实现的功能

· 按下松开按键PLAYE可以边沿触发播放语音;

· 持续按下按键PLAYL可以电平触发播放语音;

· 持续按下按键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,不支持连续按;1,支持连续按;
//返回值:
//0,没有任何按键按下
//BTN_PLAYE_PRES,BTN_PLAYE按下
//BTN_REC_PRES,BTN_REC按下
//注意此函数有响应优先级,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();

        //主循环
        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);
        }

}


推荐阅读:

STM32单片机最小系统详解

STM32F103 串口的使用方法

STM32中精确延时函数的实现

DHT11及DHT21温湿度传感器时序图解析(STM32)

LD3320语音识别模块:LDV7模块使用详解

基于STM32固件库的MDK5工程建立

修改Keil工程名称并添加其他模块文件

Keil环境下STM32工程加入cJSON

常用电路板制作方法

让步进电机动起来——L298N驱动步进电机



喜欢请关注微信公众号:程序员小哈

公众号内容面向在校大学生、电子爱好者、嵌入式工程师;

涉及电子制作、模块使用、单片机技术、物联网相关知识分享;

玩模块,学硬件,带你从0走到1


若觉得本次分享的文章对您有帮助,随手关注、收藏并转发分享,也是对我的支持。

相关推荐

探索Java项目中日志系统最佳实践:从入门到精通

探索Java项目中日志系统最佳实践:从入门到精通在现代软件开发中,日志系统如同一位默默无闻却至关重要的管家,它记录了程序运行中的各种事件,为我们排查问题、监控性能和优化系统提供了宝贵的依据。在Java...

用了这么多年的java日志框架,你真的弄懂了吗?

在项目开发过程中,有一个必不可少的环节就是记录日志,相信只要是个程序员都用过,可是咱们自问下,用了这么多年的日志框架,你确定自己真弄懂了日志框架的来龙去脉嘛?下面笔者就详细聊聊java中常用日志框架的...

物理老师教你学Java语言(中篇)(物理专业学编程)

第四章物质的基本结构——类与对象...

一文搞定!Spring Boot3 定时任务操作全攻略

各位互联网大厂的后端开发小伙伴们,在使用SpringBoot3开发项目时,你是否遇到过定时任务实现的难题呢?比如任务调度时间不准确,代码报错却找不到方向,是不是特别头疼?如今,随着互联网业务规模...

你还不懂java的日志系统吗 ?(java的日志类)

一、背景在java的开发中,使用最多也绕不过去的一个话题就是日志,在程序中除了业务代码外,使用最多的就是打印日志。经常听到的这样一句话就是“打个日志调试下”,没错在日常的开发、调试过程中打印日志是常干...

谈谈枚举的新用法--java(java枚举的作用与好处)

问题的由来前段时间改游戏buff功能,干了一件愚蠢的事情,那就是把枚举和运算集合在一起,然后运行一段时间后buff就出现各种问题,我当时懵逼了!事情是这样的,做过游戏的都知道,buff,需要分类型,且...

你还不懂java的日志系统吗(javaw 日志)

一、背景在java的开发中,使用最多也绕不过去的一个话题就是日志,在程序中除了业务代码外,使用最多的就是打印日志。经常听到的这样一句话就是“打个日志调试下”,没错在日常的开发、调试过程中打印日志是常干...

Java 8之后的那些新特性(三):Java System Logger

去年12月份log4j日志框架的一个漏洞,给Java整个行业造成了非常大的影响。这个事情也顺带把log4j这个日志框架推到了争议的最前线。在Java领域,log4j可能相对比较流行。而在log4j之外...

Java开发中的日志管理:让程序“开口说话”

Java开发中的日志管理:让程序“开口说话”日志是程序员的朋友,也是程序的“嘴巴”。它能让程序在运行过程中“开口说话”,告诉我们它的状态、行为以及遇到的问题。在Java开发中,良好的日志管理不仅能帮助...

吊打面试官(十二)--Java语言中ArrayList类一文全掌握

导读...

OS X 效率启动器 Alfred 详解与使用技巧

问:为什么要在Mac上使用效率启动器类应用?答:在非特殊专业用户的环境下,(每天)用户一般可以在系统中进行上百次操作,可以是点击,也可以是拖拽,但这些只是过程,而我们的真正目的是想获得结果,也就是...

Java中 高级的异常处理(java中异常处理的两种方式)

介绍异常处理是软件开发的一个关键方面,尤其是在Java中,这种语言以其稳健性和平台独立性而闻名。正确的异常处理不仅可以防止应用程序崩溃,还有助于调试并向用户提供有意义的反馈。...

【性能调优】全方位教你定位慢SQL,方法介绍下!

1.使用数据库自带工具...

全面了解mysql锁机制(InnoDB)与问题排查

MySQL/InnoDB的加锁,一直是一个常见的话题。例如,数据库如果有高并发请求,如何保证数据完整性?产生死锁问题如何排查并解决?下面是不同锁等级的区别表级锁:开销小,加锁快;不会出现死锁;锁定粒度...

看懂这篇文章,你就懂了数据库死锁产生的场景和解决方法

一、什么是死锁加锁(Locking)是数据库在并发访问时保证数据一致性和完整性的主要机制。任何事务都需要获得相应对象上的锁才能访问数据,读取数据的事务通常只需要获得读锁(共享锁),修改数据的事务需要获...