STM32使用ASR01语音播报模块

本文介绍了如何使用天问block软件配合ASR01语音播报模块进行模块化编程。首先下载天问block软件,然后添加设备和扩展,通过USB数据线连接。在STM32F103上,提供了一套修改好的程序模板,包括main.c和Usart.c文件,用于实现单片机与ASR01之间的串行通信,控制语音模块和LED灯的状态。

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

这里使用的asr01语音播报模块是模块化编程

先下载天问block软件

点击这里下载天问block

 选上设备:

 添加扩展:

 

自己再根据鹿小班模块进行操作进行相关操作,先接上usb数据线

记得先生成模型再去编译下载

 

 发送给单片机通信时只需要vcc gnd 还有tx接上单片机rx,如果想用stm32控制语音模块,可以接线,让asr01读取单片机引脚。

这里提供一套修改好的天问程序模板和stm32f103模板

链接: 天问模板链接 提取码: ytie

main.c

#include "stm32f10x.h"
#include "led.h"
#include "delay.h"
#include "beep.h"
#include "key.h"
#include "Usart.h"

 int main(void)
 {	
	 vu8 k=0;
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//选择第二组
	led_init();
	beep_init();
	key_init();
	delay_init();
	usat2_init();
led0=1;
	 led1=1;
	while(1)
	{
		if(USART_ReceiveData(USART1)=='A')led1=0; 
		if(USART_ReceiveData(USART1)==2)led1=1; 
		if(USART_ReceiveData(USART1)==5)BEEP =1;
    if(USART_ReceiveData(USART1)==6)BEEP =0;
		
		k=ks(0); 
		if(k)
		{
			switch(k)
			{
				case sup:led0=!led0;USART_SendData(USART1,0x01);break;
				case s0:USART_SendData(USART1,0x04);led0=!led0;led1=!led1;break;
				case s1:USART_SendData(USART1,0x02);led1=!led1;break;
				case s2:USART_SendData(USART1,0x03);led1=!led1;break;
				
			}
		}
		else delay_ms(10);
	}
 }
 

Usart.c

#include "Usart.h"

void usat2_init(void)
{
	GPIO_InitTypeDef uart;
	USART_InitTypeDef uart1;
	NVIC_InitTypeDef uart2;

	RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);//使能相应时钟
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE);	//串口时钟

	uart.GPIO_Mode=GPIO_Mode_AF_PP;//复用推挽输出
	uart.GPIO_Pin=GPIO_Pin_9;//输出引脚
	uart.GPIO_Speed=GPIO_Speed_10MHz;
	GPIO_Init(GPIOA,&uart);

	uart.GPIO_Mode=GPIO_Mode_IN_FLOATING;//浮空输入
	uart.GPIO_Pin=GPIO_Pin_10;
	uart.GPIO_Speed=GPIO_Speed_10MHz;
	GPIO_Init(GPIOA,&uart);//模式设置
	
	uart1.USART_BaudRate=9600;//比特率
	uart1.USART_HardwareFlowControl=USART_HardwareFlowControl_None;//不使用yingjianliu
	uart1.USART_Mode=USART_Mode_Rx|USART_Mode_Tx;//使能发送与接收
	uart1.USART_Parity=USART_Parity_No;//奇偶校验
	uart1.USART_StopBits=USART_StopBits_1;//停止位
	uart1.USART_WordLength=USART_WordLength_8b;//字长		
	USART_Init(USART1,&uart1);//初始化串口,并进行配置
	
	
	USART_Cmd(USART1,ENABLE);//使能串口
	//以上为串口
	
	//之后为中断
	USART_ITConfig(USART1,USART_IT_RXNE,ENABLE);//(中断使能函数)开启接收中断;串口端选择,方式,使能{EA}
	
	uart2.NVIC_IRQChannel=USART1_IRQn;
	uart2.NVIC_IRQChannelCmd=ENABLE;
	uart2.NVIC_IRQChannelPreemptionPriority=1;//抢占优先级
	uart2.NVIC_IRQChannelSubPriority=1;//响应优先级
	NVIC_Init(&uart2);//NVIC中断优先级
	
}

void USART1_IRQ(void)//中断服务函数
{
	u8 res;
	if(USART_GetITStatus(USART1,USART_IT_RXNE))
	{
		res=USART_ReceiveData(USART1);//接收
		USART_SendData(USART1,res);//发送
	}
}

Usart.h

#ifndef __chaunkou_h
#define __chaunkou_h
#include "stm32f10x.h"

void usat2_init(void);
#endif

### ASRPRO语音识别与STM32串口通信 #### STM32配置USART用于接收ASRPRO数据 为了使STM32能够处理来自ASRPRO语音识别模块的数据,需要先初始化并配置好USART外设。具体来说,在程序启动阶段完成USART的设置工作,确保其波特率、字长以及校验位等参数匹配ASRPRO的要求。 ```c // 初始化USART1, 设置为115200bps无奇偶校验 void USART_Init(void){ // 配置代码省略... } ``` 当ASRPRO检测到预定义的关键字或命令词时会向STM32发送一帧由特定格式组成的十六进制字符串[^2]。因此,STM32端需编写中断服务函数来捕获这些传入的信息,并将其存储在一个缓冲区中以便后续解析和响应操作。 #### 数据接收与处理逻辑 一旦接收到完整的指令包,则可依据实际应用场景执行相应动作。例如点亮LED指示灯或是调整屏幕亮度等功能都可以在此基础上实现自动化控制。 ```c uint8_t rx_buffer[64]; // 接收缓存数组大小可根据需求设定 int index = 0; void USART_IRQHandler(void){ if (USART_GetITStatus(USART1, USART_IT_RXNE) != RESET){ uint8_t ch = USART_ReceiveData(USART1); if(ch == '\n'){ // 假定每条消息以换行符结尾 ProcessCommand(rx_buffer); // 处理接收到的命令 memset(rx_buffer, 0, sizeof(rx_buffer)); // 清空缓冲区准备下一次读取 index = 0; }else{ rx_buffer[index++] = ch; } } } void ProcessCommand(uint8_t *cmd){ // 解析命令并采取行动 } ``` 上述代码片段展示了如何利用USART中断机制高效地获取外部设备传输过来的消息流,并通过简单的状态机模型实现了对接收到字符序列的有效管理[^1]。 对于更复杂的交互场景,还可以考虑引入RTOS实时操作系统框架下的任务调度器来进行更加精细的任务分配;而对于显示部分则可以参照其他资料了解有关于TFT-LCD的具体编程方法[^3]。
评论 26
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

嵌入式学不会不改名

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值