我是靠谱客的博主 默默刺猬,最近开发中收集的这篇文章主要介绍ESP32+TFTLCD实现WiFi天气语音播报(六)ESP32+MY1680U实现语音播报前言一、MY1680U-12P 语音模块二、代码实现总结,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

ESP32+MY1680U实现语音播报


文章目录

  • ESP32+MY1680U实现语音播报
  • 前言
  • 一、MY1680U-12P 语音模块
    • 1、概述
    • 2、参数说明
  • 二、代码实现
    • 1.MY1690.c
    • 2.MY1690.h
    • 3.main.c
  • 总结


前言

在这一章将实现MY1680U语音模块播放MP3,语音播报存入的语句。
需要用到的资料 提取码:lwm2


一、MY1680U-12P 语音模块

1、概述

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 卡模块与这款管脚兼容,需要升级大存储空间方便更换

2、参数说明

在这里插入图片描述
在这里插入图片描述
MY1680U-12P内置标准UART异步串口接口,为3.3V TTL电平接口,波特率9600。可通过MAX3232芯片转换成RS232电平或者通过 USB转TTL模块与PC通讯进行调试。通讯数据格式是:
起始位:1位;数据位:8位;奇偶位:无;停止位:1位。
向语音模块里面传入音频文件可以通过USB连接电脑传输也可以通过USB转TTL模块,使用电脑串口调试助手,传输音频文件
USB转TTL模块与MY1680U-12P的连接图
在这里插入图片描述
这里是串口调试助手的下载地址 提取码:lwm2

使用普通安卓手机数据线连接模块,第一次连接会自动安装驱动。安装成功后电脑弹出可移动磁盘,直接将声音命名好然后拖进磁盘内便可
在这里插入图片描述

照歌曲命名规则

  • 存根目录时按以下方式命名,四位数字开头命名,后面可以带中文也可以不带。
  • 建文件夹时按以下方式命名,文件夹以两位数字开头命名,文件夹内歌曲以三位数字命名后面可以带中文也可以不带。

朗读女 提取码:lwm2
这个软件可以把你输入的文本合成语音生成音频文件

二、代码实现

1.MY1690.c

代码如下:

#include "MY1690.h"

VOICE_DEV voice1={.frame_head = 0x7E,.frame_end = 0xEF};
//0 1 2 3 4 5 6 7 8 9 10 100 1000 10000
u8 Voice_Table[] = {1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21};
	
//MY1690通信接口初始化
void MY1690_UARTConfig(u32 brr)
{
	GPIO_InitTypeDef GPIO_InitStructure;
	USART_InitTypeDef USART_InitStructure;
	//开时钟
	RCC_APB2PeriphClockCmd(MY1690_TX_CLK | MY1690_RX_CLK, ENABLE);
	MY1690_UART_CLKCMD(MY1690_UART_CLK, ENABLE);
	//结构体赋值
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;	
	GPIO_InitStructure.GPIO_Pin = MY1690_TX_PIN;
	GPIO_Init(MY1690_TX_PORT, &GPIO_InitStructure);
	
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
	GPIO_InitStructure.GPIO_Pin = MY1690_RX_PIN;
	GPIO_Init(MY1690_RX_PORT, &GPIO_InitStructure);
	
	//初始化USART  波特率brr 打开发送和接收器  无奇偶校验  一个停止位  8个数据位
	USART_InitStructure.USART_BaudRate = brr;
	USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
	USART_InitStructure.USART_Parity = USART_Parity_No;
	USART_InitStructure.USART_StopBits = USART_StopBits_1;
	USART_InitStructure.USART_WordLength = USART_WordLength_8b;
	USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
	USART_Init(MY1690_USART, &USART_InitStructure);
	USART_Cmd(MY1690_USART,ENABLE);//使能USART
}

//MY1690发送数据函数
void MY1690_SendString(u8 *str,u8 lenth)
{
	for(u8 i=0; i<lenth; i++)
	{
		while(USART_GetFlagStatus(MY1690_USART,USART_FLAG_TC) == RESET);
		USART_SendData(MY1690_USART, str[i]);		
	}
}


/********************************************************
函数名称:MY1690_Init
函数功能:MY1690初始化
函数传参:无
函数返回值:无
*******************************************************/
void MY1690_Init(void)
{
	//BUSY管脚初始化
	GPIO_InitTypeDef GPIO_InitStructure;
	RCC_APB2PeriphClockCmd(MY1690_BUSY_CLK, ENABLE);
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_InitStructure.GPIO_Pin = MY1690_BUSY_PIN;
	GPIO_Init(MY1690_BUSY_PORT, &GPIO_InitStructure);
	//USART初始化
	MY1690_UARTConfig(9600);
	Voice_SendCmd(0x38,0x01,0x00,1);
}

/********************************************************
 *函数名称:Voice_XorCheck
 *函数功能:^检测 
 *函数传参:
 *			*pdata -- 校准参数
 *			lenth  -- 参数的个数
 *函数返回值:^后的数
 ********************************************************/
u8 Voice_XorCheck(u8 *pdata,u8 lenth)
{
	u8 r_value = *pdata;
	u8 i = 0;
	for(i=1;i<lenth;i++)
	{
		r_value ^= pdata[i];
	}
	return r_value;
}

/**********************************************************
 *函数名称:Voice_SendCmd
 *函数功能:发送命令 
 *函数传参:
 *				cmd -- 命令
 *				arg1 -- 第一个参数
 *				arg2 -- 第二个参数
 *				arg_lenth -- 参数个数

 *函数返回值:无
 **********************************************************/
void Voice_SendCmd(u8 cmd,u8 arg1,u8 arg2,u8 arg_lenth)
{
	//给voice1传递参数
	//命令填充
	voice1.cmd = cmd;
	//参数填充
	voice1.arg[0] = arg1;
	voice1.arg[1] = arg2;
	voice1.arg[2] = arg_lenth;
	//长度填充
	voice1.lenth = 3+arg_lenth;//长度 + cmd + xor + 参数长度
	voice1.xorcheck = Voice_XorCheck(&voice1.lenth,2+arg_lenth);//lenth+cmd + 参数
	//发送
	MY1690_SendString(&voice1.frame_head,3);//帧起始+长度+命令
	MY1690_SendString(voice1.arg,arg_lenth);//发送参数
	MY1690_SendString(&voice1.xorcheck,2);//异或值+帧尾
}

//播放指定目录文件下的音乐
//directorynum:目录编号
//musicnum:音乐编号
void Voice_PlayDirectoryMusic(u8 directorynum, u8 musicnum)
{
	while(VoicePlay_Busy);
	Voice_SendCmd(CMD_CHOOSE_MUSIC,directorynum,musicnum,2);
}



2.MY1690.h

代码如下:

#ifndef _MY1690_H_
#define _MY1690_H_

#include "stm32f10x.h"
#include "stdio.h"

/*********************MY1690底层接口宏定义************************************/
#define MY1690_USART					USART2
#define MY1690_UART_CLKCMD		RCC_APB1PeriphClockCmd
#define MY1690_UART_CLK				RCC_APB1Periph_USART2

#define MY1690_TX_CLK					RCC_APB2Periph_GPIOA
#define MY1690_TX_PORT				GPIOA
#define MY1690_TX_PIN					GPIO_Pin_2

#define MY1690_RX_CLK					RCC_APB2Periph_GPIOA
#define MY1690_RX_PORT				GPIOA
#define MY1690_RX_PIN					GPIO_Pin_3

#define MY1690_BUSY_CLK				RCC_APB2Periph_GPIOB
#define MY1690_BUSY_PORT			GPIOB
#define MY1690_BUSY_PIN				GPIO_Pin_6


/**********************MY1690命令宏定义*******************************/

#define CMD_PLAY 		  		0x11            //播放
#define CMD_STOP 		  		0x12            //暂停
#define CMD_NEXT 	 	  		0x13            //下一曲
#define CMD_PREV 					0x14            //上一曲
#define CMD_VOICEADD  		0x15            //音量加
#define CMD_VOICESUB  		0x16            //音量减
#define CMD_RESET     		0x19            //复位
#define CMD_SPEED     		0x1A            //快进
#define CMD_SLOW      		0x1B            //快退
#define CMD_STARTorSTOP 	0x1C            //播放/暂停
#define CMD_END         	0x1E            //停止
#define CMD_ROOTCHO_MUSIC 0x41            //根目录选择歌曲
#define CMD_CHOOSE_MUSIC 	0x42            //任意目录选择歌曲

//数据帧结构体
typedef struct
{
	u8 frame_head;//帧头
	u8 lenth;     //数据长度
	u8 cmd;       //命令
	u8 arg[3];    //参数个数0 1 2   arg[2] -- 参数的个数 arg[0] -- 第一个参数 arg[1] -- 第二个参数
	u8 xorcheck;  //校验码
	u8 frame_end; //帧尾
}VOICE_DEV;

//忙状态检测
#define VoicePlay_Busy	GPIO_ReadInputDataBit(MY1690_BUSY_PORT, MY1690_BUSY_PIN)

/************************语音播报表下标宏定义************************/
#define POS_SHI				10
#define POS_HUNDRED		11	//百
#define POS_THOUSAND	12	//千
#define POS_WAN				13	//万
#define POS_START			14	//开始测量
#define POS_RESULT		15	//酒精浓度
#define POS_OK				16	//测量完成
#define POS_ERR				17	//测量未完成
#define POS_NODRINK		18	//没有喝酒
#define POS_DRINK			19	//酒驾
#define POS_WELCOME		20	//欢迎

extern u8 Voice_Table[];

void MY1690_UARTConfig(u32 brr);
void MY1690_Init(void);
void MY1690_SendString(u8 *str,u8 lenth);
u8 Voice_XorCheck(u8 *pdata,u8 lenth);
void Voice_SendCmd(u8 cmd,u8 arg1,u8 arg2,u8 arg_lenth);	
void Voice_PlayDirectoryMusic(u8 directorynum, u8 musicnum);
void Voice_PlayNumber(u16 number);
#endif



3.main.c

#include "main.h"
#include "delay.h"
#include "led.h"
#include "key.h"
#include "beep.h"
#include "lcd.h"
#include "rose.h"
#include "leaf.h"
#include "bridge.h"
#include "MY1690.h"


int main(void)
{
	JTAG_SWD_Config();
	SysTick_Init(72000);//系统定时器初始化 1ms
	Led_Config();//led初始化
	Beep_Config();
	Key_Config();
	LCD_Init();
	MY1690_Init();
	
	Voice_PlayDirectoryMusic(03,010);//播放歌曲
	while(1)
	{
	
	}
}

用到的音频文件 提取码:lwm2


总结

MY1680U语音模块播放歌曲差不多哦就这么多内容。

最后

以上就是默默刺猬为你收集整理的ESP32+TFTLCD实现WiFi天气语音播报(六)ESP32+MY1680U实现语音播报前言一、MY1680U-12P 语音模块二、代码实现总结的全部内容,希望文章能够帮你解决ESP32+TFTLCD实现WiFi天气语音播报(六)ESP32+MY1680U实现语音播报前言一、MY1680U-12P 语音模块二、代码实现总结所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(66)

评论列表共有 0 条评论

立即
投稿
返回
顶部