STM32驱动BY9301语音播报模块

这篇具有很好参考价值的文章主要介绍了STM32驱动BY9301语音播报模块。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

简介:STM32F103C8T6驱动BY9301语音播报模块源码介绍。

开发平台:KEIL ARM

MCU型号:STM32F103C8T6

传感器型号:BY9301

特别提示:驱动内可能使用了某些其他组件,比如delay等,在文末外设模板下载地址内有。

1积分源码下载地址在文末!!!

接口图:

单片机语音播报模块,STM32开发经历,单片机,stm32,嵌入式硬件,STM32模块驱动,学习

使用举例:

#include <stdio.h>
#include "BY9301.h"

int main()
{
	BY9301Class.init(9600); // 初始化
	BY9301Class.setVolume(30); // 音量30
	BY9301Class.sayFileID(1); // 播放序号为1的mp3文件
	while(1) {}
}

 驱动源码:

BY9301.c 

/*
BY9301语音播报模块
*/
#include "main.h"

void BY9301_USART_Init(uint32_t baudRate);
static void BY9301_SendString(uint8_t *str);
static void BY9301_Say(uint8_t NOx);
static void BY9301_setVolume(uint8_t volume);
static void BY9301_playPause(uint8_t playPause);
static uint8_t BY9301_Busy(void);

BY9301ClassStruct BY9301Class = {
	.init = BY9301_USART_Init,
	.sayFileID = BY9301_Say,
	.isBusy = BY9301_Busy,
	.setVolume = BY9301_setVolume,
	.playPause = BY9301_playPause
};

// VOICE USART define
#if	1
#define  BY9301_USARTx_PORT               USART1
#define  BY9301_USARTx_CLK                RCC_APB2Periph_USART1
#define  BY9301_USARTx_APBxClkCmd         RCC_APB2PeriphClockCmd
#define  BY9301_USARTx_PORT_CLK           (RCC_APB2Periph_GPIOA)
#define  BY9301_USARTx_PORT_APBxClkCmd    RCC_APB2PeriphClockCmd
#define  BY9301_USARTx_TX_PORT            GPIOA
#define  BY9301_USARTx_TX_PIN             GPIO_Pin_9
#define  BY9301_USARTx_RX_PORT            GPIOA
#define  BY9301_USARTx_RX_PIN             GPIO_Pin_10
#define  BY9301_USARTx_IRQ                USART1_IRQn
#define  BY9301_USARTx_IRQHandler         USART1_IRQHandler
#else
#define  BY9301_USARTx_PORT               USART2
#define  BY9301_USARTx_CLK                RCC_APB1Periph_USART2
#define  BY9301_USARTx_APBxClkCmd         RCC_APB1PeriphClockCmd
#define  BY9301_USARTx_PORT_CLK           (RCC_APB2Periph_GPIOA)
#define  BY9301_USARTx_PORT_APBxClkCmd    RCC_APB2PeriphClockCmd
#define  BY9301_USARTx_TX_PORT            GPIOA
#define  BY9301_USARTx_TX_PIN             GPIO_Pin_2
#define  BY9301_USARTx_RX_PORT            GPIOA
#define  BY9301_USARTx_RX_PIN             GPIO_Pin_3
#define  BY9301_USARTx_IRQ                USART2_IRQn
#define  BY9301_USARTx_IRQHandler         USART2_IRQHandler
#endif
#define BUSY_GPIO_PORT    					GPIOB			              /* GPIO端口 */
#define BUSY_GPIO_CLK 	    				RCC_APB2Periph_GPIOB		/* GPIO端口时钟 */
#define BUSY_GPIO_PIN						GPIO_Pin_12			        /* 连接到SCL时钟线的GPIO */


void BY9301_USARTx_IRQHandler(void)
{
	if(USART_GetITStatus(BY9301_USARTx_PORT, USART_IT_RXNE) != RESET) {
		USART_ClearITPendingBit(BY9301_USARTx_PORT, USART_IT_RXNE);
	}
}
/**
  * @brief  语音串口USART初始化
	* @param  baudRate: 波特率
  * @retval None
  */
static void BY9301_USART_Init(uint32_t baudRate)
{		
	NVIC_InitTypeDef NVIC_InitStructure;
	GPIO_InitTypeDef GPIO_InitStructure;
	USART_InitTypeDef USART_InitStructure;
	/* GPIO时钟配置 */
	BY9301_USARTx_PORT_APBxClkCmd(BY9301_USARTx_PORT_CLK, ENABLE);
	/* 串口时钟配置 */
	BY9301_USARTx_APBxClkCmd(BY9301_USARTx_CLK, ENABLE);
	/* USART Tx--复用推挽输出 */
	GPIO_InitStructure.GPIO_Pin = BY9301_USARTx_TX_PIN;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(BY9301_USARTx_TX_PORT, &GPIO_InitStructure);
	/* USART Rx--浮空输入 */
	GPIO_InitStructure.GPIO_Pin = BY9301_USARTx_RX_PIN;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
	GPIO_Init(BY9301_USARTx_RX_PORT, &GPIO_InitStructure);
	// BUSY输入
	RCC_APB2PeriphClockCmd(BUSY_GPIO_CLK, ENABLE);
	GPIO_InitStructure.GPIO_Pin = BUSY_GPIO_PIN;
	GPIO_Init(BUSY_GPIO_PORT, &GPIO_InitStructure);
	/* 串口参数配置 */
	USART_InitStructure.USART_BaudRate = baudRate; // 波特率
	USART_InitStructure.USART_WordLength = USART_WordLength_8b; // 数据位
	USART_InitStructure.USART_StopBits = USART_StopBits_1; // 停止位
	USART_InitStructure.USART_Parity = USART_Parity_No; // 校验位
	USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None; // 硬件流控
	USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx; // 工作模式 收发一起
	USART_Init(BY9301_USARTx_PORT, &USART_InitStructure);	// 串口初始化
	/* 串口使能 */
	USART_Cmd(BY9301_USARTx_PORT, ENABLE);
	/* 串口中断使能 */
	USART_ITConfig(BY9301_USARTx_PORT, USART_IT_RXNE, ENABLE);
	/* NVIC优先级分组 */
	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_4);
	/* NVIC参数配置*/
	NVIC_InitStructure.NVIC_IRQChannel = BY9301_USARTx_IRQ;  // 中断源 有特定的命名
	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 3;  // 主优先级
	NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;  // 子优先级
	NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;  // 使能NVIC
	NVIC_Init(&NVIC_InitStructure); // NVIC初始化
}
/**
	* @brief  语音串口发送 具体协议参见手册
	* @param  str: 要发送的内容
  * @retval None
  */
static void BY9301_SendString(uint8_t *str)
{
	if(str[1] == 0) return;
	uint8_t i;
	for(i = 0; i < str[1] + 2; i++) {
		USART_SendData(BY9301_USARTx_PORT, str[i]);
		while (USART_GetFlagStatus(BY9301_USARTx_PORT, USART_FLAG_TXE) == RESET){}
	}
	while(USART_GetFlagStatus(BY9301_USARTx_PORT, USART_FLAG_TC) == RESET){}
}
/**
  * @brief  指定序号播报
  * @param  NOx: mp3文件序号
  * @retval None
  */
static void BY9301_Say(uint8_t NOx)
{
	uint8_t arr[8] = {0};
	arr[0] = 0x7E;
	arr[1] = 0x05;
	arr[2] = 0x41;
	arr[3] = 0x00;
	arr[4] = NOx;
	arr[5] = arr[1]^arr[2]^arr[3]^arr[4];
	arr[6] = 0xEF;
	BY9301_SendString(arr);
}
/**
  * @brief  设置音量
  * @param  volume: 0-30
  * @retval None
  */
static void BY9301_setVolume(uint8_t volume)
{
	if(volume > 30) volume = 30;
    uint8_t arr[7];
    arr[0] = 0x7E;
    arr[1] = 0x04;
    arr[2] = 0x31;
    arr[3] = volume;
    arr[4] = arr[1]^arr[2]^arr[3];
    arr[5] = 0xEF;
    BY9301_SendString(arr);
}
/**
  * @brief  设置播放暂停
  * @param  playPause: 0:pause 1:play
  * @retval None
  */
static void BY9301_playPause(uint8_t playPause)
{
	uint8_t arr[6];
	arr[0] = 0x7E;
	arr[1] = 0x03;
	if(playPause) {
		arr[2] = 0x01;
	} else {
		arr[2] = 0x02;
	}
	arr[3] = arr[1]^arr[2];
	arr[4] = 0xEF;
	BY9301_SendString(arr);
}
/**
  * @brief  Busy引脚状态
  * @param  None
  * @retval 返回Busy引脚电平状态 1:busy 0:idle
  */
static uint8_t BY9301_Busy(void)
{
	return GPIO_ReadInputDataBit(BUSY_GPIO_PORT, BUSY_GPIO_PIN);
}

 BY9301.h

#ifndef __BY9301_AS_H
#define	__BY9301_AS_H

#include "main.h"

typedef struct {
	void (* init)(uint32_t);
	void (* sayFileID)(uint8_t);
	void (* setVolume)(uint8_t);
	void (* playPause)(uint8_t);
	uint8_t (* isBusy)(void);
} BY9301ClassStruct;

extern BY9301ClassStruct BY9301Class;

#endif

驱动下载地址:

https://download.csdn.net/download/m0_50669075/87672764

STM32工程模板、外设模板、模块模板下载地址:

stm32_template: STM32F103工程模板,外设模板,模块模板。模块模板包括:DHT11温湿度传感器,OLED屏幕,DS18B20温度传感器,DS1302时钟模块,红外测温模块,RFID模块,SIM900A短信模块,OneNET入网,ADXL345三轴传感器,离线语音识别模块,语音播报模块,甲醛传感器,PM2.5模块,SG90舵机,健康检测模块,消息队列示例,链表示例,分时调度系统示例等。文章来源地址https://www.toymoban.com/news/detail-707036.html

到了这里,关于STM32驱动BY9301语音播报模块的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • STM32使用ASR01语音播报模块

    先下载天问block软件 点击这里下载天问block  选上设备:  添加扩展:   自己再根据鹿小班模块进行操作进行相关操作,先接上usb数据线 记得先生成模型再去编译下载    发送给单片机通信时只需要vcc gnd 还有tx接上单片机rx,如果想用stm32控制语音模块,可以接线,让asr01读

    2024年02月16日
    浏览(97)
  • STM32控制JQ8400语音播报模块

    时间记录:2024/2/7 标示 说明 ONE LINE 一线操作引脚 BUSY 忙信号引脚,正在播放语音时输出高电平 RX 串口两线操作接收引脚 TX 串口两线操作发送引脚 GND 电源地引脚 DC-5V 电源引脚,3.3-5V DAC-R DAC输出右声道引脚 DAC-L DAC输出左声道引脚 SPK- 喇叭-引脚 SPK+ 喇叭+引脚 (1)时序图 (

    2024年04月11日
    浏览(42)
  • 【STM32单片机】基于语音识别的智能分类垃圾桶,ld3320语音识别模块如何使用,mp3播放模块如何使用

    对于“可回收物”“有害垃圾”“厨余垃圾”“其它垃圾”,不能分清扔到哪个垃圾桶怎么办? 基于语音识别的智能分类垃圾桶,识别到就打开对应的垃圾桶,完全没有分不清的烦恼。 //可回收物:塑料瓶、玻璃瓶、铝罐、纸张、纸板、报纸、纸质包装盒、金属罐头等

    2024年02月10日
    浏览(60)
  • 单片机设计:基于stm32智能语音识别蓝牙音响(ld3320语音识别模块+mp3模块+喇叭+点阵屏+OLED+蓝牙+手机app)

    单片机设计:基于stm32智能语音识别蓝牙音响(ld3320语音识别模块+mp3模块+喇叭+点阵屏+OLED+蓝牙+手机app) 一、主要功能: 1.手机app播放内存卡的音乐、同时点阵屏随音乐进行跳动 2.0LED、手机app显示当前音量以及当前状态 3.手机app远程调节音量阈值,可以切换上一首、下一首,音乐

    2024年02月07日
    浏览(58)
  • K_A16_001 基于STM32等单片机驱动HX711称重模块 串口与OLED0.96双显示

    单片机型号 测试条件 模块名称 代码功能 STC89C52RC 晶振11.0592M HX711称重模块 STC89C52RC驱动HX711称重模块 串口与OLED0.96双显示 STM32F103C8T6 晶振8M/系统时钟72M HX711称重模块 STM32F103C8T6驱动HX711称重模块参数 串口与OLED0.96双显示 其他资料目录 直戳跳转 HX711参数 1.两路可选择差分输入

    2023年04月27日
    浏览(68)
  • K_A12_007 基于STM32等单片机驱动AS608光学指纹识别模块 OLED0.96显示

    注意:此处程序用的波特率都是9600 使用前请用上位机把模块波特率调到9600 上位机使用与下载 直戳跳转 单片机型号 测试条件 模块名称 代码功能 STC89C52RC 晶振11.0592M AS608光学指纹模块 STC89C52RC驱动AS608光学指纹模块 串口与OLED0.96双显示 STM32F103C8T6 晶振8M/系统时钟72M AS608光学指

    2024年02月06日
    浏览(50)
  • K_A37_005 基于STM32等单片机驱动ADS1115 ADC模块 串口与OLED0.96双显示

    其他资料目录 直戳跳转 单片机型号 测试条件 模块名称 代码功能 STC89C52RC 晶振11.0592M ADS1115 ADC模块 STC89C52RC驱动ADS1115 ADC模块 串口与OLED0.96双显示 STM32F103C8T6 晶振8M/系统时钟72M ADS1115 ADC模块 STM32F103C8T6驱动ADS1115 ADC模块 串口与OLED0.96双显示 ADS1115 ADC模块 引脚说明 VIN 正极 5V供电

    2024年02月16日
    浏览(57)
  • K_A08_009 基于 STM32等单片机驱动TB6612模块按键控制直流电机正反转加减速启停

    目录 一、资源说明 二、基本参数         1、参数         2、引脚说明 三、驱动说明         TB6612模块驱动说明         对应程序:         ENA ENB输出PWM 四、部分代码说明         接线说明                 1、STC89C52RC+TB6612模块                 2、STM32F

    2024年02月15日
    浏览(38)
  • K_A08_013 基于 STM32等单片机驱动大功率MOS管模块按键控制直流电机加减速启停

    目录 一、资源说明 二、基本参数         参数         引脚说明 三、驱动说明         大功率MOS模块驱动         对应程序: 四、部分代码说明         接线说明                 STC89C52RC+大功率MOS模块                 STM32F103C8T6+大功率MO

    2023年04月26日
    浏览(52)
  • K_A12_022 基于STM32等单片机驱动VL53L0X模块 串口与OLED0.96双显示

    注:偏差校准步骤(均十六进制发送) 1、偏差校准命令 A5 21 0A D0(此处是在10CM处校准) 2、加载数据命令 A5 43 04 EC(断电重启后加载偏差补偿) 3、保存设置命令 A5 87 01 2D(保存设置后生效) 单片机型号 测试条件 模块名称 代码功能 STC89C52RC 晶振11.0592M VL53L0X模块 STC89C52RC驱动VL53L0X模

    2024年02月13日
    浏览(38)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包