毕业设计常用模块之语音模块MY1680使用

MY1680U-12P是一款由迈优科技研发的MP3模块,支持MP3和WAV格式解码,内置Flash存储,可外接U盘。模块具备UART串口控制,支持播放、暂停等操作,并内置3W功放。此外,它还具有音量和曲目记忆功能,以及USB下载和SD卡扩展能力。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

MY1680模块介绍

MY1680U-12P 是深圳市迈优科技有限公司自主研发的一款小巧的集成MP3模块。采用MY1680U-16S MP3主控芯片,支持MP3、WAV格式双解码,模拟U盘下载。模块内置FLASH存储芯片,1-16M容量可选;也可外接U盘或USB数据线连接电脑更换FLASH的音频文件。该模块内置3W功放,可以直接驱动3W的喇叭,使用更方便。

产品特性

  • 支持 MP3 、WAV 高品质音频格式文件,声音优美。
  • 24 位 DAC 输出,动态范围支持 93dB,信噪比支持 85dB。
  • 完全支持FAT16、FAT32 文件系统,最大支持 16M FLASH,32G 的 U 盘。
  • 支持 UART异步串口控制:支持播放、暂停、上下曲、音量加减、选曲播放、插播等。 ADKEY 功能,通过电阻选择可实现标准 MP3 功能的 5按键控制和其他功能。 内置音量、曲目掉电记忆功能。
  • 支持 USB 连接电脑下载声音。 自带 3W的功放,直接外接喇叭即可完成播放;音量不够客户也可外接功放。
  • MY1690-12P 插 SD卡模块与这款管脚兼容,需要升级大存储空间方便更换

MY1690-12P是MY1680-12P的升级版

使用接线说明

在这里插入图片描述
常用接线说明:
喇叭两根线:发出声音
电源两根线:提供能量
串口两根线:发送指令
在这里插入图片描述
一般都是模块上直接插上杜邦线连接如果需要自己设计电路,注意方向
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

串口控制协议

MY1690-12P内置标准UART异步串口接口,为3.3V TTL电平接口。可通过MAX3232芯片转换成RS232电平或者通
过 USB转TTL模块与PC通讯进行调试。通讯数据格式是:起始位:1位;数据位:8位;奇偶位:无;停止位:1位。
下图有USB转TTL模块与MY1690-12P的连接图,使用电脑串口调试助手,需要正确设置串口的参数,设置如下图
在这里插入图片描述

协议命令帧格式

在这里插入图片描述
格式说明:
数据全部为十六进制数。
长度”是指:长度+操作码+参数(有些没有参数,有些有两位参数)+校验码的个数;
校验码”是指:长度<异或>操作码<异或>参数的值,既按顺序分别异或的值。

举例子说明

校验码客户可通过程序计算得到:例如,设置音量指令为
7E 04 31 19 2C EF
7E代表是起始码是一个字节的十六进制数据
长度 04 是这样得到:就是“04”,“31”,“19”,“2C”4 个数
长度+操作码(31)+参数(1个参数是19)+校验码(2C)
校验码如何计算呢?
校验码 2C 是这样得到 04 XOR 31 XOR 19 = 2C
在这里插入图片描述

指令列表

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

高频指令详细说明

在这里插入图片描述
播放指令可以播放音乐,没有参数只有操作码11
暂停指令可以暂停播放音乐,没有参数只有操作码12
下一曲指令可以播放下一曲,如果最后一曲可以回到第一区(支持循环播放)操作码13
上一曲指令该指令能够触发播放下一曲音乐,在播放第一曲音乐时,发送该指令可触发播放最后一曲音乐也支持循环播放 操作码14

在这里插入图片描述
音量加:芯片的音量总共有三十个等级,发一次等级加1,最大30 操作码15
音量减:芯片的音量总共有三十个等级,发一次等级减1, 最小是0 操作码16
复位指令:发送该指令则复位芯片,所有参数回复出厂设置(
量最大,回到第一首
),一般情况下不需要使用该命令 操作码19
在这里插入图片描述

快进指令:发送一次指令快进一段时间 操作码1A
快退指令:发送一次指令音乐快退一段时间 操作码1B
播放暂停切换指令:发送一次是播放 再发一次是暂停 操作码1C
停止指令音乐在播放或者暂停状态下发送该指令可停止音乐 操作码1E
设置音量指令:音量为 0-30 级可调,该指令可以实时修改调节音量,范例中发送的音量 级为 25
25解析:0x19 = 1*16+9 = 25十进制
设置EQ指令:发送该指令可以改变 EQ
EQ是什么?
0-5(NO\POP\ROCK\JAZZ\CLASSIC\BASS)
在这里插入图片描述
设置循环循环模式:
发送该指令可设置循环模式,范例中为设置单曲循环模式
02参数代表循环模式
在这里插入图片描述

在这里插入图片描述
文件夹切换指令:
发送该指令可以切换文件夹播放,发送 1 为下一文件夹,0 为上一文件夹。

设备切换指令:
当系统存在多个设备时,可发送该指令选择要读取的设备,范例为选择 TF 卡播放
在这里插入图片描述
BUSY电平切换:当用到 BUSY 信号控制功放使能脚,而需要播放时是低电平工作可以发以上命令
为什么是低电平?低电平是暂停或停止状态
在这里插入图片描述
选择播放指定编号曲目:需要在根目录设置音乐名称
选择播放指定文件夹指定编号曲目:需要设置文件夹名称跟曲目名称
在这里插入图片描述
插播功能:当接收到本条指令时,就暂停正在播放的曲目,然后执行本条指令所指定的播放曲目,当播放完后,接着播放原来暂停的曲目。

插播指定文件夹里指定曲目歌曲:当接收到本条指令时,就暂停正在播放的曲目,然后执行本条指令所指定的文件里的对应曲目播放,当播放完后,接着播放原来暂停的曲目。高8位为文件夹号,低8位为歌曲曲目。

注意事项:如要使用到该功能,文件夹必须命名为 00-99,歌曲必须命名为 001 XXX.MP3-255 XXX.MP3, XXX 可以为中文也可以没有,否则会出错无法播放。

组合播放指令:
连续发送:
7E 05 41 00 01 45 EF
7E 05 41 00 03 47 EF
7E 05 41 00 02 46 EF
7E 05 41 00 04 40 EF
播放第 1,3,2,4 曲,播完停止,最多连续播放 20 曲。
两个命令时间间隔小于 6MS。 指令跟指令之间相差时间不能太大

查询指令

在这里插入图片描述
例如:发送查询播放状态命令 7E 03 20 23 EF,返回 OK 0001 表示处于正在播放状态。
发送查询指令之后都会返回上面查询命令表的相应参数,不做详细说明

命令注意事项

注意事项:连续发送两条命令之间间隔在 20MS 以上,组合播放功能两条命令间隔在 6MS 以内

曲目命名注意事项

  1. 存根目录时按以下方式命名,四位数字开头命名,后面可以带中文也可以不带
    在这里插入图片描述

  2. 建文件夹时按以下方式命名,文件夹以两位数字开头命名,文件夹内歌曲以三位数字命名 后面可以带中文也可以不带
    在这里插入图片描述

纯硬件模拟按键应用电路图(不常用)

在这里插入图片描述

跟单片机如何接在一起

如果是单片机不是3.3V电平标准 不能直接连接 需要加上拉电阻 1K
如果是3.3V电平标准 那么可以直接连接。
在这里插入图片描述

其它用法

在这里插入图片描述

/*********** TM1680 参考程序: 1、A1\A0 采用MCU进行控制,实际使用时,可以将A1\A0任意接高低电平,TM1680 ID改为相应指令即可; 2、该程序采用STC15W 芯片模拟IIC协议,IO口为双向IO口(无需设置输入与输出),如果MCU的IO口需要设置输入和输出,则在ACK时需要设置为输入 3、该芯片支持标准IIC协议 ************/ #include #include "intrins.h" #include /****命令宏定义****/ #define TM1680ID 0xe7 #define SYSDIS 0x80 #define SYSEN 0x81 #define LEDOFF 0x82 #define LEDON 0x83 #define BLINKOFF 0x88 #define BLINK2HZ 0x89 #define BLINK1HZ 0x8A #define BLINK0_5HZ 0x8B #define SLAVEMODE 0x90 #define RCMODE0 0x98 #define RCMODE1 0x9A #define EXTCLK0 0x9C #define EXTCLK1 0x9E #define COM8NMOS 0xA0 #define COM16NMOS 0xA4 #define COM8PMOS 0xA8 #define COM16PMOS 0xAC #define PWM01 0xB0 #define PWM02 0xB1 #define PWM03 0xB2 #define PWM04 0xB3 #define PWM05 0xB4 #define PWM06 0xB5 #define PWM07 0xB6 #define PWM08 0xB7 #define PWM09 0xB8 #define PWM10 0xB9 #define PWM11 0xBA #define PWM12 0xBB #define PWM13 0xBC #define PWM14 0xBD #define PWM15 0xBE #define PWM16 0xBF /******命令宏定义******/ /***端口定义***/ sbit SDA=P1^4; //TM1680通讯端口设置 sbit SCL=P1^5; sbit MA1=P1^6; sbit MA0=P1^7; /***按键功能设置***/ sbit KEY0=P3^2; sbit KEY1=P3^3; sbit KEY2=P3^6; /***LED指示灯定义***/ sbit RED=P3^4; sbit GREEN=P3^5; sbit WHITE=P3^7; /***显示数据***/ unsigned char TM1680perseg[8]={0x10,0x20,0x40,0x80,0x01,0x02,0x04,0x8}; unsigned char DispA[8]={0x10,0xFE,0x92,0x92,0xFE,0x92,0x10,0x10}; /*** 函数功能:延时函数 ***/ void delayms(unsigned int n) { unsigned int i; while(n--) { for(i=0;i<550;i++); } } void delayus(unsigned char n) //256 { while (--n) { _nop_(); } } /**************************底层函数*****************************/ void TM1680start(void) { SDA=1; SCL=1; SDA=1; delayus(4); delayus(10); SDA=0; delayus(10); //起始信号,必须大于4.7us SCL=0; } void Ack(void) { SCL = 0; delayus(8); SCL = 1; delayus(8); while(SDA); SCL=0; delayus(15); } void TM1680SetAck(bit ack) { SCL=0; delayus(5); SDA = ack; //写应答信号 SCL = 1; //拉高时钟线 delayus(5); //延时 SCL = 0; //拉低时钟线 delayus(5); //延时 } void TM1680stop(void) { SDA=0; SCL=1; delayus(10); SDA=1; //停止信号,大于5us delayus(10); SCL=1; SDA=1; } void TM1680SendByte(unsigned char sbyte) { unsigned char i=0; for(i=0; i<8; i++) { SCL=0;delayus(2); if(sbyte&0x80;) { SDA=1; //高位先发 }else{ SDA=0; } delayus(3); SCL=1; delayus(5); //高电平的时间大于4us sbyte<<=1; delayus(2); } SCL=0; delayus(3); SDA=0; delayus(3); } unsigned char TM1680RecvByte(void) { unsigned char i=0, sbyte; SDA=1;delayus(6); for(i=0; i<8; i++) { SCL=0;delayus(6); if(SDA) { sbyte |= 0x01 ; //置1 }else{ sbyte &= 0xfe; //置0 } delayus(3); SCL=1; delayus(5); //高电平的时间大于4us sbyte<<=1; } SCL=0; return sbyte; } /******************************底层函数结束**************************/ /******************************功能函数**************************/ /***单字节写操作函数***/ /***写命令函数:开始--ID-ACK--命令-ACK--结束***/ void TM1680WriteCmd(unsigned char scmd) { TM1680start(); TM1680SendByte(TM1680ID); Ack(); TM1680SendByte(scmd); Ack(); TM1680stop(); } /***写一个字节数据: 开始--ID-ACK-内部地址-ACK--数据-ACK-结束 ***/ void TM1680WriteOneByte(unsigned char faddr, unsigned char sdate) { TM1680start(); TM1680SendByte(TM1680ID); //写TM1680器件地址 Ack(); TM1680SendByte(faddr); //eeprom 地址 Ack(); TM1680SendByte(sdate); //写数据 Ack(); TM1680stop(); } /*** 函数功能:页操作 ***/ void TM1680PageWrite(unsigned char faddr, unsigned char *pdate,unsigned char cnt) { unsigned char i=0; TM1680start(); TM1680SendByte(TM1680ID); //写TM1680器件地址 Ack(); TM1680SendByte(faddr); //eeprom 地址 Ack(); for(i=0; i<cnt; i++) { TM1680SendByte(*pdate); //写数据 Ack(); pdate++; } TM1680stop(); } void TM1680PageAllWrite(unsigned char faddr, unsigned char sdate,unsigned char cnt) { unsigned char i=0; TM1680start(); TM1680SendByte(TM1680ID); Ack(); TM1680SendByte(faddr); //eeprom 地址 Ack(); for(i=0; i<cnt; i++) { TM1680SendByte(sdate); //写数据 Ack(); } TM1680stop(); } /*** 函数功能: 写命令+写数据 ***/ void TM1680WriteCmdDate(unsigned char faddr, unsigned char sdate, unsigned char cnt) { unsigned char i=0; TM1680start(); TM1680SendByte(TM1680ID); Ack(); TM1680SendByte(SYSDIS); Ack(); TM1680SendByte(COM8NMOS); Ack(); TM1680SendByte(RCMODE1); Ack(); TM1680SendByte(SYSEN); Ack(); TM1680SendByte(LEDON); Ack(); TM1680SendByte(PWM16); Ack(); TM1680SendByte(BLINKOFF); Ack(); TM1680SendByte(faddr); Ack(); for(i=0; i<cnt; i++) { TM1680SendByte(sdate); Ack(); } TM1680stop(); } /******************************************函数功能结束****************************************/ /*** 函数功能: TM1680 初始化 ***/ void TM1680Init(void) { TM1680start(); TM1680SendByte(TM1680ID); Ack(); TM1680SendByte(SYSDIS); Ack(); TM1680SendByte(COM8NMOS); //根据需求进行选择 Ack(); TM1680SendByte(RCMODE1); Ack(); TM1680SendByte(SYSEN); Ack(); TM1680SendByte(LEDON); Ack(); // TM1680SendByte(LEDOFF); // Ack(); TM1680SendByte(PWM16); Ack(); TM1680SendByte(BLINKOFF); Ack(); TM1680stop(); } /***PWM调节测试***/ void PWMTest(unsigned char sTime) { unsigned char i=0; for(i=0;i<16;i++) { TM1680WriteCmd(PWM01 | i); delayms(sTime); delayms(sTime); } } /***TM1680ID判断***/ void TM1680IDChange(void) { switch(TM1680ID) { case 0xe4: MA1=0; MA0=0; break; case 0xe5: MA1=0; MA0=1; break; case 0xe6: MA1=1; MA0=0; break; case 0xe7: MA1=1; MA0=1; break; default:break; } } /**** 函数功能:逐渐点亮每一段 ****/ void TM1680PerDisp(void) { unsigned char i=0,j=0; unsigned char faddr=0x00, fdate=TM1680perseg[0]; for(i=0;i<32; i++) { for(j=0;j<8;j++) { fdate=fdate|TM1680perseg[j]; TM1680WriteOneByte(faddr,fdate); delayms(20); } faddr+=2; fdate=TM1680perseg[0]; } } void main(void) { unsigned char i=0,j=0,fdate=0x10; TM1680IDChange(); TM1680Init(); TM1680PageAllWrite(0x00, 0x00, 32); //上电清零 delayms(100); TM1680PageAllWrite(0x00, 0xff, 32); //上电全部显示 TM1680PerDisp(); //每一段显示 while(1) { ; } }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值