基于51单片机+SYN6288语音播报

资料

我用的是绿深电子技术的模块,资料也挺齐全的。也有相关例程。

SYN6288模块原理图

在这里插入图片描述

语音合成命令

在这里插入图片描述

接线

如何接线

接线其实很简单。

51单片机 SYN6288语音合成
TX RX
VCC VCC
GND GND

实现原理

51单片机 串口接收数据,根据不同的数据 通过串口的形式发送给 SYN6288,从而控制SYN6288语音播报。

程序代码

我用的是STC89C52

main.c

#include <reg52.h>
#include "syn6288.h"
#include "delay.h"
#include "uart.h"

/**************芯片设置命令*********************/
unsigned char SYN_StopCom[] = {
    
    0xFD, 0X00, 0X02, 0X02, 0XFD}; //停止合成
unsigned char SYN_SuspendCom[] = {
    
    0XFD, 0X00, 0X02, 0X03, 0XFC}; //暂停合成
unsigned char SYN_RecoverCom[] = {
    
    0XFD, 0X00, 0X02, 0X04, 0XFB}; //恢复合成
unsigned char SYN_ChackCom[] = {
    
    0XFD, 0X00, 0X02, 0X21, 0XDE}; //状态查询
unsigned char SYN_PowerDownCom[] = {
    
    0XFD, 0X00, 0X02, 0X88, 0X77}; //进入POWER DOWN 状态命令

unsigned char receive_ok = 0;  //接收标志位
unsigned char command; 		//接收串口来的数据

//串口1初始化
void UART1_Init(void)
{
    
    
	SCON = 0x50;		//8位数据,可变波特率
	TMOD |= 0x20;		//设定定时器1为8位自动重装方式
	TL1 = 0xFD;		//设定定时初值
	TH1 = 0xFD;		//设定定时器重装值
	ET1 = 0;		//禁止定时器1中断
	TR1 = 1;		//启动定时器1
	ES = 1;
	EA = 1;
	RI = 0;
	TI = 0;
}


void  main(void)
{
    
    
	UART1_Init();
	SYN_FrameInfo(0, "[v3][t5]大家好"); //喇叭说 你好
	delay(2000);
	receive_ok = 1;
	while(1)
	{
    
    
		//选择背景音乐2。(0:无背景音乐  1-15:背景音乐可选)
		//m[0~16]:0背景音乐为静音,16背景音乐音量最大
		//v[0~16]:0朗读音量为静音,16朗读音量最大
		//t[0~5]:0朗读语速最慢,5朗读语速最快
		//其他不常用功能请参考数据手册

		/*判断指令*/
		switch(command)
		{
    
    
			case '1':	   //如果是 1
			receive_ok = 0;
			SYN_FrameInfo(0, "[v3][t5]你好");  //喇叭说 你好
			delay(2000);
			command = 0;
			receive_ok = 1;
			break;
			case 'G':		  	//如果你 G  喇叭说 这个是干垃圾
			receive_ok = 0;		//禁止接收串口数据
			SYN_FrameInfo(0, "[v3][t5]这个是干垃圾");
			delay(2000);
			command = 0;
			receive_ok = 1;	 	//允许接收串口数据
			break;
			default :
			receive_ok = 1;
			break;
		 }		
		//暂停合成,此时没有用到,用于展示函数用法
		//YS_SYN_Set(SYN_SuspendCom);
	}

}


//串口1中断
void Uart1_Isr() interrupt 4
{
    
    
	if(receive_ok == 1)	//如果可以接收数据了
	{
    
    
		command = SBUF;	//接收数据
		while(!RI);
		RI=0;
		receive_ok = 0;	
	}	

}

syn6288.c

#include <reg52.h>
#include <string.h>
#include "uart.h"
#include "syn6288.h"

/**************芯片设置命令*********************/
/*外部声明*/
extern unsigned char SYN_StopCom[];
extern unsigned char SYN_SuspendCom[];
extern unsigned char SYN_RecoverCom[];
extern unsigned char SYN_ChackCom[];
extern unsigned char SYN_PowerDownCom[];


//Music:  0:无背景音乐  1~15:选择背景音乐
void SYN_FrameInfo(unsigned char Music, unsigned char *HZdata)
{
    
    
	/****************需要发送的文本**********************************/
	unsigned char  Frame_Info[50];
	unsigned char  HZ_Length;
	unsigned char  ecc  = 0;  			//定义校验字节
	unsigned int i = 0;
	HZ_Length = strlen((char*)HZdata); 			//需要发送文本的长度

	/*****************帧固定配置信息**************************************/
	Frame_Info[0] = 0xFD ; 			//构造帧头FD
	Frame_Info[1] = 0x00 ; 			//构造数据区长度的高字节
	Frame_Info[2] = HZ_Length + 3; 		//构造数据区长度的低字节
	Frame_Info[3] = 0x01 ; 			//构造命令字:合成播放命令
	Frame_Info[4] = 0x01 | Music << 4 ; //构造命令参数:背景音乐设定

	/*******************校验码计算***************************************/
	for(i = 0; i < 5; i++)   				//依次发送构造好的5个帧头字节
	{
    
    
		ecc = ecc ^ (Frame_Info[i]);		//对发送的字节进行异或校验
	}

	for(i = 0; i < HZ_Length; i++)   		//依次发送待合成的文本数据
	{
    
    
		ecc = ecc ^ (HZdata[i]); 				//对发送的字节进行异或校验
	}
	/*******************发送帧信息***************************************/
	memcpy(&Frame_Info[5], HZdata, HZ_Length);
	Frame_Info[5 + HZ_Length] = ecc;
	UART1_SendString(Frame_Info, 5 + HZ_Length + 1);
}

uart.c

#include <reg52.h>
#include "uart.h"

/*串口发送一字节数据*/
void UART1_SendByte(unsigned char DAT)
{
    
    
	SBUF = DAT;
	while(TI == 0);
	TI=0;
}

/*串口发送字符串数据*/
void UART1_SendString(unsigned char *DAT, unsigned char len)
{
    
    
	unsigned char i;
	for(i = 0; i < len; i++)
	{
    
    
		UART1_SendByte(*DAT++);
	}
}

delay.c

#include <reg52.h>
#include "delay.h"

//软件延时1ms
void  delay(unsigned int uldata)
{
    
    
	unsigned int j  =  0;
	unsigned int g  =  0;
	for (j = 0; j < uldata; j++)
		for (g = 0; g < 110; g++);
}

基于 51单片机的其他项目

基于51单片机+遥控灯
基于51单片机+LCD1602显示
基于51单片机+红外遥控解码+LCD1602显示
基于51单片机+DHT11温湿度+LCD1602显示
基于51单片机+DS18B20温度测温器+LCD1602显示
基于51单片机+LD3320语音模块+SYN6288语音合成——语音识别智能分类垃圾桶

尾声

如果觉得这篇文章对你有用。欢迎大家点赞、评论哈哈

需要 整个SYN6288工程源码 和 资料 ,欢迎大家打赏,评论区留上你的邮箱 or vx or qq。o( ̄︶ ̄)o

在这里插入图片描述

继续加油!

猜你喜欢

转载自blog.csdn.net/weixin_47457689/article/details/116750199
今日推荐