当前位置:   article > 正文

STM32驱动BY9301语音播报模块_by9301 16p

by9301 16p

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

开发平台:KEIL ARM

MCU型号:STM32F103C8T6

传感器型号:BY9301

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

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

接口图:

使用举例:

  1. #include <stdio.h>
  2. #include "BY9301.h"
  3. int main()
  4. {
  5. BY9301Class.init(9600); // 初始化
  6. BY9301Class.setVolume(30); // 音量30
  7. BY9301Class.sayFileID(1); // 播放序号为1的mp3文件
  8. while(1) {}
  9. }

 驱动源码:

BY9301.c 

  1. /*
  2. BY9301语音播报模块
  3. */
  4. #include "main.h"
  5. void BY9301_USART_Init(uint32_t baudRate);
  6. static void BY9301_SendString(uint8_t *str);
  7. static void BY9301_Say(uint8_t NOx);
  8. static void BY9301_setVolume(uint8_t volume);
  9. static void BY9301_playPause(uint8_t playPause);
  10. static uint8_t BY9301_Busy(void);
  11. BY9301ClassStruct BY9301Class = {
  12. .init = BY9301_USART_Init,
  13. .sayFileID = BY9301_Say,
  14. .isBusy = BY9301_Busy,
  15. .setVolume = BY9301_setVolume,
  16. .playPause = BY9301_playPause
  17. };
  18. // VOICE USART define
  19. #if 1
  20. #define BY9301_USARTx_PORT USART1
  21. #define BY9301_USARTx_CLK RCC_APB2Periph_USART1
  22. #define BY9301_USARTx_APBxClkCmd RCC_APB2PeriphClockCmd
  23. #define BY9301_USARTx_PORT_CLK (RCC_APB2Periph_GPIOA)
  24. #define BY9301_USARTx_PORT_APBxClkCmd RCC_APB2PeriphClockCmd
  25. #define BY9301_USARTx_TX_PORT GPIOA
  26. #define BY9301_USARTx_TX_PIN GPIO_Pin_9
  27. #define BY9301_USARTx_RX_PORT GPIOA
  28. #define BY9301_USARTx_RX_PIN GPIO_Pin_10
  29. #define BY9301_USARTx_IRQ USART1_IRQn
  30. #define BY9301_USARTx_IRQHandler USART1_IRQHandler
  31. #else
  32. #define BY9301_USARTx_PORT USART2
  33. #define BY9301_USARTx_CLK RCC_APB1Periph_USART2
  34. #define BY9301_USARTx_APBxClkCmd RCC_APB1PeriphClockCmd
  35. #define BY9301_USARTx_PORT_CLK (RCC_APB2Periph_GPIOA)
  36. #define BY9301_USARTx_PORT_APBxClkCmd RCC_APB2PeriphClockCmd
  37. #define BY9301_USARTx_TX_PORT GPIOA
  38. #define BY9301_USARTx_TX_PIN GPIO_Pin_2
  39. #define BY9301_USARTx_RX_PORT GPIOA
  40. #define BY9301_USARTx_RX_PIN GPIO_Pin_3
  41. #define BY9301_USARTx_IRQ USART2_IRQn
  42. #define BY9301_USARTx_IRQHandler USART2_IRQHandler
  43. #endif
  44. #define BUSY_GPIO_PORT GPIOB /* GPIO端口 */
  45. #define BUSY_GPIO_CLK RCC_APB2Periph_GPIOB /* GPIO端口时钟 */
  46. #define BUSY_GPIO_PIN GPIO_Pin_12 /* 连接到SCL时钟线的GPIO */
  47. void BY9301_USARTx_IRQHandler(void)
  48. {
  49. if(USART_GetITStatus(BY9301_USARTx_PORT, USART_IT_RXNE) != RESET) {
  50. USART_ClearITPendingBit(BY9301_USARTx_PORT, USART_IT_RXNE);
  51. }
  52. }
  53. /**
  54. * @brief 语音串口USART初始化
  55. * @param baudRate: 波特率
  56. * @retval None
  57. */
  58. static void BY9301_USART_Init(uint32_t baudRate)
  59. {
  60. NVIC_InitTypeDef NVIC_InitStructure;
  61. GPIO_InitTypeDef GPIO_InitStructure;
  62. USART_InitTypeDef USART_InitStructure;
  63. /* GPIO时钟配置 */
  64. BY9301_USARTx_PORT_APBxClkCmd(BY9301_USARTx_PORT_CLK, ENABLE);
  65. /* 串口时钟配置 */
  66. BY9301_USARTx_APBxClkCmd(BY9301_USARTx_CLK, ENABLE);
  67. /* USART Tx--复用推挽输出 */
  68. GPIO_InitStructure.GPIO_Pin = BY9301_USARTx_TX_PIN;
  69. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
  70. GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  71. GPIO_Init(BY9301_USARTx_TX_PORT, &GPIO_InitStructure);
  72. /* USART Rx--浮空输入 */
  73. GPIO_InitStructure.GPIO_Pin = BY9301_USARTx_RX_PIN;
  74. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
  75. GPIO_Init(BY9301_USARTx_RX_PORT, &GPIO_InitStructure);
  76. // BUSY输入
  77. RCC_APB2PeriphClockCmd(BUSY_GPIO_CLK, ENABLE);
  78. GPIO_InitStructure.GPIO_Pin = BUSY_GPIO_PIN;
  79. GPIO_Init(BUSY_GPIO_PORT, &GPIO_InitStructure);
  80. /* 串口参数配置 */
  81. USART_InitStructure.USART_BaudRate = baudRate; // 波特率
  82. USART_InitStructure.USART_WordLength = USART_WordLength_8b; // 数据位
  83. USART_InitStructure.USART_StopBits = USART_StopBits_1; // 停止位
  84. USART_InitStructure.USART_Parity = USART_Parity_No; // 校验位
  85. USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None; // 硬件流控
  86. USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx; // 工作模式 收发一起
  87. USART_Init(BY9301_USARTx_PORT, &USART_InitStructure); // 串口初始化
  88. /* 串口使能 */
  89. USART_Cmd(BY9301_USARTx_PORT, ENABLE);
  90. /* 串口中断使能 */
  91. USART_ITConfig(BY9301_USARTx_PORT, USART_IT_RXNE, ENABLE);
  92. /* NVIC优先级分组 */
  93. NVIC_PriorityGroupConfig(NVIC_PriorityGroup_4);
  94. /* NVIC参数配置*/
  95. NVIC_InitStructure.NVIC_IRQChannel = BY9301_USARTx_IRQ; // 中断源 有特定的命名
  96. NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 3; // 主优先级
  97. NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; // 子优先级
  98. NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; // 使能NVIC
  99. NVIC_Init(&NVIC_InitStructure); // NVIC初始化
  100. }
  101. /**
  102. * @brief 语音串口发送 具体协议参见手册
  103. * @param str: 要发送的内容
  104. * @retval None
  105. */
  106. static void BY9301_SendString(uint8_t *str)
  107. {
  108. if(str[1] == 0) return;
  109. uint8_t i;
  110. for(i = 0; i < str[1] + 2; i++) {
  111. USART_SendData(BY9301_USARTx_PORT, str[i]);
  112. while (USART_GetFlagStatus(BY9301_USARTx_PORT, USART_FLAG_TXE) == RESET){}
  113. }
  114. while(USART_GetFlagStatus(BY9301_USARTx_PORT, USART_FLAG_TC) == RESET){}
  115. }
  116. /**
  117. * @brief 指定序号播报
  118. * @param NOx: mp3文件序号
  119. * @retval None
  120. */
  121. static void BY9301_Say(uint8_t NOx)
  122. {
  123. uint8_t arr[8] = {0};
  124. arr[0] = 0x7E;
  125. arr[1] = 0x05;
  126. arr[2] = 0x41;
  127. arr[3] = 0x00;
  128. arr[4] = NOx;
  129. arr[5] = arr[1]^arr[2]^arr[3]^arr[4];
  130. arr[6] = 0xEF;
  131. BY9301_SendString(arr);
  132. }
  133. /**
  134. * @brief 设置音量
  135. * @param volume: 0-30
  136. * @retval None
  137. */
  138. static void BY9301_setVolume(uint8_t volume)
  139. {
  140. if(volume > 30) volume = 30;
  141. uint8_t arr[7];
  142. arr[0] = 0x7E;
  143. arr[1] = 0x04;
  144. arr[2] = 0x31;
  145. arr[3] = volume;
  146. arr[4] = arr[1]^arr[2]^arr[3];
  147. arr[5] = 0xEF;
  148. BY9301_SendString(arr);
  149. }
  150. /**
  151. * @brief 设置播放暂停
  152. * @param playPause: 0:pause 1:play
  153. * @retval None
  154. */
  155. static void BY9301_playPause(uint8_t playPause)
  156. {
  157. uint8_t arr[6];
  158. arr[0] = 0x7E;
  159. arr[1] = 0x03;
  160. if(playPause) {
  161. arr[2] = 0x01;
  162. } else {
  163. arr[2] = 0x02;
  164. }
  165. arr[3] = arr[1]^arr[2];
  166. arr[4] = 0xEF;
  167. BY9301_SendString(arr);
  168. }
  169. /**
  170. * @brief Busy引脚状态
  171. * @param None
  172. * @retval 返回Busy引脚电平状态 1:busy 0:idle
  173. */
  174. static uint8_t BY9301_Busy(void)
  175. {
  176. return GPIO_ReadInputDataBit(BUSY_GPIO_PORT, BUSY_GPIO_PIN);
  177. }

 BY9301.h

  1. #ifndef __BY9301_AS_H
  2. #define __BY9301_AS_H
  3. #include "main.h"
  4. typedef struct {
  5. void (* init)(uint32_t);
  6. void (* sayFileID)(uint8_t);
  7. void (* setVolume)(uint8_t);
  8. void (* playPause)(uint8_t);
  9. uint8_t (* isBusy)(void);
  10. } BY9301ClassStruct;
  11. extern BY9301ClassStruct BY9301Class;
  12. #endif

驱动下载地址:

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

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

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

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Monodyee/article/detail/664384
推荐阅读
相关标签
  

闽ICP备14008679号