MY1690-12P语音模块实现特定的语音提示功能
一、MY1690 MP3解码模块介绍
MY1690-12P是深圳市迈优科技有限公司自主研发的一款小巧的微集成MP3模块。采用MY1690-SOP16 MP3主控芯片,支持MP3、WAV格式双解码。模块最大支持32G TF卡;也可外接U盘或USB数据线连接电脑更换SD卡音频文件。该模块内置3W功放,可以直接驱动3W的喇叭,使用更方便。
二、串口控制协议
MY1690-12P内置标准UART异步串口接口,为3.3V TTL电平接口。可通过MAX3232芯片转换成RS232电平或者通过USB转TTL模块与PC通讯进行调试。通讯数据格式是:起始位:1位;数据位:8位;奇偶位:无;停止位:1位。3.3V TTL电平,波特率9600。USB转TTL模块与MY1690-12P的连接图如下。
图1 USB转TTL模块与MY1690-12P的连接图
使用电脑串口调试助手,需要正确设置串口的参数,设置如下图:
协议命令格式:
起始码 |
长度 |
操作码 |
参数 |
校验码 |
结束码 |
0x7E |
见下文 |
见下文 |
见下文 |
见下文 |
0xEF |
注意: 数据全部为十六进制数。
“长度”是指:长度+操作码+参数(有些没有参数,有些有两位参数)+校验码的个数;
“校验码”是指:长度<异或>操作码<异或>参数的值,既按顺序分别异或的值。
校验码客户可通过计算器计算得到:
例如,设置音量指令为 7E 04 3119 2C EF
长度04是这样得到:就是“04”,“31”,“19”,“2C” 4个数。
校验码2C是这样得到:
首先打开计算器选择程序员模式,然后选择16进制、双字,最后点击进行计算:
04 Xor 31 Xor19 = 2C
注:以上内容来自深圳市迈优科技的官方网站的相关资料,详细内容前往官网下载模块使用说明书,MY1690-12P的使用说明书链接:http://www.maiyout.com/col.jsp?id=103。
三、项目应用场景
在实际项目中,我们通常使用这种MP3解码模块运用于语音提示的场景中。例如,当水加热达到指定温度时,关闭加热设备,并语音提示:“加热已完成!”还可以进行组合语音提示,例如,当水加热达到65摄氏度时,语音提示:“水温已达到”“六”“十”“五”“摄氏度”五段语音组合播放,但是组合播放最多连续播放20段语音文件,且对应的语音文件命名方式为:0001 XXX.mp3。
官方网站下载的程序只是串口通信+几个常用指令的例程,在实际项目中还远远不够,需要根据需要写好驱动程序。
项目中需要使用串口通信的模块有3个,而STC15F2K60S2中只有2个串口通信资源,所以需要将语音模块放置在串口1可硬件引脚切换的位置,当需要进行语音提示播放时,操作切换串口通信硬件引脚的寄存器即可,涉及到硬件引脚切换的程序如下。
/****************************************************************STC15系列单片机串口通信硬件引脚切换
****************************************************************/#define S1_S0 0x40 //P_SW1.6#define S1_S1 0x80 //P_SW1.7/************************************************************当sw_flag=0时,P3.0/RxD, P3.1/TxD;当sw_flag=1时,P3.6/RxD_2, P3.7/TxD_2*************************************************************/void UART1_switch(uchar sw_flag){if(sw_flag){ACC = P_SW1;ACC &= ~(S1_S0 | S1_S1); //S1_S0=1 S1_S1=0ACC |= S1_S0; //(P3.6/RxD_2, P3.7/TxD_2)P_SW1 = ACC;} else{ACC = P_SW1;ACC &= ~(S1_S0 | S1_S1); //S1_S0=0 S1_S1=0P_SW1 = ACC; //(P3.0/RxD, P3.1/TxD)} }
四、MY1690 MP3语音模块驱动程序
1.头文件
#ifndef _MY1690_H_#define _MY1690_H_#include <STC15F2K60S2.H>#include "UART.h"#ifndef uchar#define uchar unsigned char#endif#ifndef uint#define uint unsigned int#endif//void send_3dat_cmd(uchar cmd,uchar jy);//void send_4dat_cmd(uchar cmd,uchar cs,uchar jy);void send_5dat_cmd(uchar cmd,uchar cs,uchar gq,uchar jy);void Voice(uchar a,int b);uchar Check(uchar cs);#endif
2.主程序
#include "MY1690.h"/******************************************************************************- 功能描述: 串口1初始化- 注: 设置为9600波特率******************************************************************************///void Serial_init(void)//{// TMOD = 0x20; // 设置 T1 为波特率发生器// SCON = 0x50; // 0101,0000 8位数据位, 无奇偶校验 // PCON = 0x00; //PCON=0;// TH1=256-(OSC_FREQ/COMM_BAUD_RATE/32/12);//设置为9600波特率// TL1=256-(OSC_FREQ/COMM_BAUD_RATE/32/12);// TR1 = 1; //定时器1打开// REN = 1; //串口1接收使能// ES = 1; //串口1中断使能//}///********************************************************************************** 【函 数 名】: void write_COM(uchar dat)* 【功 能】: 串口发送数据命令 **********************************************************************************///void write_COM(uchar dat)//{// SBUF=dat; //发送指令到SBUF// while(!TI); //等待发送结束// TI=0; //清除结束标志,以便再发送数据//}/********************************************************************************** 【函 数 名】: void send_3dat_cmd(uchar cmd,uchar dat)* 【功 能】: 除了起始和结束标志外,发三位长度的数据*send_3dat_cmd(0x11,0x12); // 播放*send_3dat_cmd(0x12,0x11); //暂停* send_3dat_cmd(0x13,0x10); // 下一曲* send_3dat_cmd(0x14,0x17); //上一曲*send_3dat_cmd(0x15,0x16); //音量加*send_3dat_cmd(0x16,0x15); //音量减* send_3dat_cmd(0x1A,0x19); //快进*send_3dat_cmd(0x1B,0x18); //快退* send_3dat_cmd(0x1C,0x1F); //播放/暂停 **********************************************************************************///void send_3dat_cmd(uchar cmd,uchar jy)//{// write_COM(0x7E); //发送“开始命令”到SBUF// write_COM(0x03); //发送“命令长度”到SBUF// write_COM(cmd); //发送“命令”到SBUF// write_COM(jy); // 发送校验码到SBUF// write_COM(0xEF); //发送“结束指令”到SBUF//}/********************************************************************************** 【函 数 名】: void send_4dat_cmd(uchar cmd,uchar cs,uchar jy )* 【功 能】: 除了起始和结束标志外,发四位长度的数据 * send_4dat_cmd(0x32,0x00,0x36 ) ; //设置EQ* send_4dat_cmd(0x34,0x01,0x31 ) ; //文件切换* send_4dat_cmd(0x35,0x01,0x30 ) ; //设备切换 **********************************************************************************///void send_4dat_cmd(uchar cmd,uchar cs,uchar jy )//{// write_COM(0x7E); //发送“开始命令”到SBUF// write_COM(0x04); //发送“命令长度”到SBUF// write_COM(cmd); //发送“插播指令”到SBUF// write_COM(cs); // 发送参数 到SBUF// write_COM(jy); // 发送校验码到SBUF// write_COM(0xEF); //发送“结束指令”到SBUF//}/********************************************************************************** 【函 数 名】: void send_5dat_cmd(uchar cmd,uchar cs,uchar gq,uchar jy )* 【功 能】: 除了起始和结束标志外,发四位长度的数据* send_5dat_cmd(0x43,0x00,0x03,0x45); //插播功能* send_5dat_cmd(0x44,0x01,0x06,0x46) ; //插播指定文件夹的歌曲播放,本指令为文件夹01的第6首歌曲 **********************************************************************************/void send_5dat_cmd(uchar cmd,uchar cs,uchar gq,uchar jy ){write_COM(0x7E); //发送“开始命令”到SBUFwrite_COM(0x05); //发送“命令长度”到SBUFwrite_COM(cmd); //发送“插播指令”到SBUFwrite_COM(cs); // 发送参数 到SBUF write_COM(gq); //发送第几首歌曲到SBUFwrite_COM(jy); // 发送校验码到SBUFwrite_COM(0xEF); //发送“结束指令”到SBUF} /********************************************************************************** 【函 数 名】: Voice(a,b)* 【功 能】:a(0:温度 1:水量 2:叫水)b(温度:0:加热开始 1:加热完成;水量:0:已换新水 2:水已不足;叫水:宿舍号) 例如:Voice(2,1517);//语音提示:你好,请送水到1517。Voice(0,0);//语音提示:加热开始!Voice(1,0);//语音提示:已换上新的饮用水!**********************************************************************************/void Voice(uchar a,int b){uchar check_flag = 0x00,check1 = 0x00,check2 = 0x00,check3 = 0x00,check4 = 0x00;//校验码uchar Voice_number[] = {0,0,0,0};//宿舍号uchar i=0;UART1_switch(1);//uart1切换到P3^6\P3^7if(a == 0)//温度部分{if(b == 0)//加热开始 语音提示{check_flag = Check(0x0C);//校验码计算 send_5dat_cmd(0x41,0x00,0x0C,check_flag);//播放加热开始(0012)语音文件}if(b == 1)//加热完成 语音提示{check_flag = Check(0x0B);//校验码计算 send_5dat_cmd(0x41,0x00,0x0B,check_flag);//播放加热开始(0011)语音文件} }else if(a == 1)//水量部分{if(b == 0)//已换新水 语音提示{check_flag = Check(0x0E);//校验码计算 send_5dat_cmd(0x41,0x00,0x0E,check_flag);//播放已换新水(0014)语音文件}if(b == 1)//水已不足 语音提示{check_flag = Check(0x0D);//校验码计算 send_5dat_cmd(0x41,0x00,0x0D,check_flag);//播放水已不足(0013)语音文件} }else if(a == 2)//叫水部分{check_flag = Check(0x0F);//校验码计算 Voice_number[0] = b/1000%10;Voice_number[1] = b/100%10;Voice_number[2] = b/10%10;Voice_number[3] = b%10;for(i=0;i<4;i++)//如果结果是0x00,因为数字0对应的文件是0x10,所以要加0x10{if(Voice_number[i] == 0)Voice_number[i] = Voice_number[i]+0x10;}check1 = Check(Voice_number[0]);//校验码计算 check2 = Check(Voice_number[1]);//校验码计算 check3 = Check(Voice_number[2]);//校验码计算 check4 = Check(Voice_number[3]);//校验码计算send_5dat_cmd(0x41,0x00,0x0F,check_flag);//播放请送水到(0015)语音文件send_5dat_cmd(0x41,0x00,Voice_number[0],check1);//播放宿舍号send_5dat_cmd(0x41,0x00,Voice_number[1],check2);send_5dat_cmd(0x41,0x00,Voice_number[2],check3); send_5dat_cmd(0x41,0x00,Voice_number[3],check4);// check_flag = Check(0x0F);//校验码计算 // send_5dat_cmd(0x41,0x00,0x0F,check_flag);//播放请送水到(0015)语音文件// send_5dat_cmd(0x41,0x00,Voice_number[0],check1);//播放两遍宿舍号// send_5dat_cmd(0x41,0x00,Voice_number[1],check2);// send_5dat_cmd(0x41,0x00,Voice_number[2],check3); // send_5dat_cmd(0x41,0x00,Voice_number[3],check4);}else //系统出错// buzz = 0;//蜂鸣器报警,出错{}UART1_switch(0);//uart1重新初始化check_flag = 0x00,check1 = 0x00,check2 = 0x00,check3 = 0x00,check4 = 0x00;}/*********************校验码算法****************************/uchar Check(uchar jy)//校验码计算(异或运算){jy = jy^0x44;return jy;}
MY1690-12P语音模块实现特定的语音提示功能相关推荐
- 为自己的软件添加语音提示功能
公司的项目,要求为软件添加语音提示功能. 主要有两个思路: 1.直接播放语音文件,如*.mp3或*.wav 2.将输入的字符串转为语音文件 上一家公司做过播放语音文件,但将输入的字符串转换为语音文件感 ...
- C#使用System.Speech制作语音提示功能
转载自:C#语音提示 c#实现语音阅读以及文本转语音文件是基于c#的一个类库(SpeechSynthesizer )实现的,使用该类必须要添加引用using System.Speech.Synthes ...
- 智能手表语音提示功能芯片选型?NV340D 8脚语音芯片
近年来,智能可穿戴设备逐渐受到消费者的追捧,其中就包括功能多样.佩戴方便的智能手表.智能手表除了有指示时间的功能之外,一般还具有提醒.导航.校准.监测.交互等其中一种或者多种功能. 智能手表实现语音提 ...
- 奥的斯服务器显示spb,奥的斯ACD4电梯自动复位救援与语音提示功能设置操作
如果奥的斯ACD4电梯在采购配置时需要增加复位救援功能,奥的斯电梯工厂将会增加此功能的部件APRS(AdditionalPositionReferenceSystem)系统. 一.此功能的操作特征是: ...
- 八楼电梯的c语言程序,本科毕业设计—电梯自动语音提示系统.doc
电梯自动语音提示系统 院 系:信息科学与工程学院 专 业 班:电子科学与技术1102班 姓 名: 学 号: 指导教师: 2015年5月 电梯自动语音提示系统 The Elevator Automati ...
- 智能密码锁语音提示芯片选型?
智能门锁是指区别于传统机械锁的基础上改进的,在用户安全性.识别.管理性方面更加智能化简便化的锁具. 在智能锁操作过程中,拥有语音提示功能可对老年人与儿童,带来极大的便利,智能门锁的安全性比传统的钥匙, ...
- C++调用MicrosoftSpeechPlatformSDK(SAPI)实现文字转语音提示
更多语音提示资料,阅读:为自己的软件添加语音提示功能 微软提供的语音平台开发包: 全称:Speech Recognition and Text-to-Speech Engines for Micros ...
- 自助柜员机属于微型计算机吗,银行自助柜员机语音提示很给力
本报记者 冯杰 昨日,市民张先生向记者反映:在城区中天街一家银行的自助柜员机上多了"民警提示",很温馨,很给力.他希望全市每台自助柜员机上都能装上这样的语音提示,提醒市民在进行金钱 ...
- 奶瓶消毒柜语音提示芯片,音效ic选型
准爸爸准妈妈们都会在宝宝出生前把奶瓶.奶嘴等婴儿用品备好.而除了给宝宝选购的奶瓶奶嘴要保证安全和质量,为了减少细菌对宝宝身体的伤害,这时候大部分家长就会选择奶瓶消毒柜定期给奶瓶进行消毒. 奶瓶消毒柜一 ...
- 智能锁语音提示芯片?看这里!
智能门锁凭借着在用户识别.安全性.管理性方面的智能化优势,受到了现代人们的青睐,它的外观设计也是紧随现代潮流. 而目前市场上所有的智能锁基本都会做语音提示功能,方便用户在操作使用时能简单便捷. 安全防 ...
最新文章
- CVPR 2022 | ConvNeXt - FAIR再探纯卷积结构的极限(优于Transformer)
- 搜索和其他机器学习问题有什么不同?
- 使用sphinx搜索子域名过程中需注意的问题
- android AppCompatEditText 自定义下划线颜色
- POJ3264——Balanced Lineup(线段树)
- linux 过滤某种类型文件,linux mv 类型过滤
- cosnπ为什么是离散信号_奥本海姆《信号与系统》(第2版)笔记和课后习题(含考研真题)详解(下册)复习答案考研资料...
- foobar2000在线标签服务器,不再烦恼 小烧友手把手教你设置 Foobar2000界面
- 9个实用的,可以写进简历的数据分析项目!
- 自动化生产线仿真教学
- getUserMedia` undefined 火狐firefox
- 机器学习 K-Nearst-Neighbors算法
- 常见的笔记本电池使用技巧
- 转载:“只要3分钟,我就能扒光你的隐私!” | 互联网时代,14亿中国人都在裸奔|你的隐私已不是隐私
- 董老师又双叒叕送书啦,8本《Python数据分析、挖掘与可视化(慕课版)》
- python微信转账记录_python处理微信对账单数据的实例代码
- 传感器自学笔记第十章——DS1302实时时钟模块(附51程序)
- Gartner云安全理念解读
- php英语单词出现了几次,PHP如何实现英语单词 单复数 转换?
- OCR技术在爱奇艺的应用实践及演进
热门文章
- gitbook:gitbook-cli\node_modules\npm\node_modules\graceful-fs\polyfills.js
- 制作banner思路
- 谷歌插件.crx文件无法安装
- 交互设计师谈颠覆式创新 | Think different
- 微信视频文件保存在服务器吗,如何发送大的视频文件给朋友和家人
- JavaSrcipt学习(学习打卡Day7)
- 小程序怎么自定义导航栏,导航栏放图片、设置高度
- 【php环境搭建/wamp/解释器/下载】
- 安装python3.5.0出现0x80072eff错误_我在网上用WINDOWS UPDATE更新WINDOWS,出现错误:0x80072EFF,该怎么办?...
- 游戏性能优化的五个方向