资料
我用的是绿深电子技术的模块,资料也挺齐全的。也有相关例程。
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显示
尾声
如果觉得这篇文章对你有用。欢迎大家点赞、评论哈哈
需要 整个SYN6288工程源码 和 资料 ,欢迎大家打赏,评论区留上你的邮箱 or vx or qq。o( ̄︶ ̄)o
继续加油!
转载:https://blog.csdn.net/weixin_47457689/article/details/116750199
查看评论