基于51单片机 SYN6288的语音播报系统

51单片机控制SYN6288语音播报

  • 资料
  • SYN6288模块原理图
  • 语音合成命令
  • 接线
  • 如何接线
  • 实现原理
  • 程序代码
  • main.c
  • syn6288.c
  • uart.c
  • delay.c
  • 基于 51单片机的其他项目
  • 尾声
  • 资料

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

    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

    继续加油!

    物联沃分享整理
    物联沃-IOTWORD物联网 » 基于51单片机 SYN6288的语音播报系统

    发表评论