SYN6288语音播放模块终极版.docx

上传人:b****8 文档编号:8779104 上传时间:2023-02-01 格式:DOCX 页数:12 大小:303.93KB
下载 相关 举报
SYN6288语音播放模块终极版.docx_第1页
第1页 / 共12页
SYN6288语音播放模块终极版.docx_第2页
第2页 / 共12页
SYN6288语音播放模块终极版.docx_第3页
第3页 / 共12页
SYN6288语音播放模块终极版.docx_第4页
第4页 / 共12页
SYN6288语音播放模块终极版.docx_第5页
第5页 / 共12页
点击查看更多>>
下载资源
资源描述

SYN6288语音播放模块终极版.docx

《SYN6288语音播放模块终极版.docx》由会员分享,可在线阅读,更多相关《SYN6288语音播放模块终极版.docx(12页珍藏版)》请在冰豆网上搜索。

SYN6288语音播放模块终极版.docx

SYN6288语音播放模块终极版

SYN6288语音播放模块制作

1、SYN6288语音芯片封装图:

2、通信方式:

2.1异步串行通讯(UART)接口

SYN6288提供一组全双工的异步串行通讯(UART)接口,实现与微处理器或PC的数据传输。

SYN6288利用TxD和RxD以及GND实现串口通信。

其中GND作为地信号。

SYN6288芯片支持UART接口通讯方式,

通过UART接口接收上位机发送的命令和数据,允许发送数据的最大长度为206字节。

2.2通讯传输字节格式

1、初始波特率:

9600bps

2、起始位:

1

3、数据位:

8

4、校验位:

5、停止位:

1

6、流控制:

与51单片机通信时,可以用单片机的串行通信方式1。

3、硬件电路搭建:

3.1外接电源组接法

备注:

SYN6288共有6组外接电源,每组电源均使用一个47uF和一个0.1uF的电容;如果用户想节省成本,用户可以在每组电源上均使用0.1uF的电容,并对VDDPP、和VDDA两组电源,各加上一47uF的电容。

3.2复位电路及状态指示电路

备注:

Ready/Busy此STATUS引脚信号为低电平时说明芯片正在等待接收数据。

在系统设计时可以将此引脚接

在MCU的中断输入源上,产生一个下降沿中断请求发送数据,以示上位机MCU可以向语音合成芯片发送数据。

3.3SYN6288的扬声器输出

(1)为了在用户应用中输出声音,SYN6288内置了推挽

式(Push-Pull)的DAC,可直接驱动喇叭,进行

声音播报。

并且SYN6288内置的DAC电路模块,

使用了VDDPP/VSSPP供电电源模块,具体电路说

明部分请参见(10.1)和(10.2)节,其供电电压值可独

立于其它电源组的供电。

(见右图)

 

3.4SYN6288外接高速晶振

3.5SYN6288串口通信的参考电路

备注:

上位机发送数据给SYN6288时,中间须加有反向器。

在实际电路中,我们用三极管做了一个反向器,电路如下图:

该电路的原理是:

MCU的TXD输出电平为0时,NPN三极管截止,RXD收到的电平为1。

MCU的TXD输出电平为1时,NPN三极管导通,RXD收到的电平为0。

3.6Res引脚(即第5引脚)的接法

3.7总体电路原理图:

4、程序的编写:

4.1命令帧格式:

芯片支持以下命令帧格式:

“帧头FD+数据区长度+数据区”格式。

(最大206个字节)

注意:

数据区(含命令字,命令参数,待发送文本,异或校验)的实际长度必须与帧头后定义的数据区长度严格一致,否则芯片会报接收失败。

4.2语音合成播放命令举例:

上位机发送给SYN6288芯片的所有命令和数据都需要用“帧”的方式进行封装后传输。

其它命令请自行参考SYN6288芯片手册:

4.3文本程序发送:

中文系统电脑的文本编码格式一般为:

ANSI即GB2312编码体系,这个可以用二进制文本编辑器(如BinaryEditor)打开并对照GB2312编码表察看。

 

参考程序:

//speaker.c

#include

#include

#include

#include"typedef.h"

#include"SPEAKER.h"

 

voiddelayMs(uint16xms){

uint16i,j;

for(i=0;i

for(j=0;j<123;j++);

}

//语音模块初始化

voidSpeakerInit(){

/**************串口的初始化*****************/

TL1=0XFA;//在11.0592MHZ下,设置波特率9600bps,工作方式2

TH1=0XFA;

TMOD=0X20;

SCON=0X50;//串口工作方式1,允许接收

PCON=0X80;

EA=0;

REN=1;

TI=0;//发生中断标志位置零

RI=0;//接收中断标志位置零

TR1=1;//定时器1用做波特率发生

}

//语音播报程序

uint8Speaker(char*pString){

uint8headOfFrame[5];

uint8length;//定义字符串长度

uint8ecc=0;//定义校验字节

uint16i=0;

if(pString==NULL)//空字符串

return-1;

/*****************发送过程**********************/

headOfFrame[0]=0XFD;//构造帧头FD

headOfFrame[1]=0X00;//构造数据区长度的高字节

length=strlen(pString);//需要发送文本的长度

headOfFrame[2]=length+3;//构造数据区长度的低字节

headOfFrame[3]=0X01;//构造命令字:

合成播放命令

headOfFrame[4]=0X00;//构造命令参数:

编码格式为GB2312

for(i=0;i<5;i++)//依次发送构造好的5个帧头字节

{

ecc=ecc^(headOfFrame[i]);//对发送的字节进行异或校验

SBUF=headOfFrame[i];

while(TI==0){;}//等待发送中断标志置位

TI=0;//发送中断标志位清零

}

for(i=0;i

{

ecc=ecc^(*pString);

SBUF=(*pString);

pString++;

while(TI==0){;}

TI=0;

}

SBUF=ecc;

while(TI==0){;}

TI=0;

return0;//成功返回0

}

//语音读整数

uint8SpeakerInt(intida){

uint8i;

uint8negative=0;//负数标志位

uint8intLen=5;

charcdat[6]={0};

if(ida<0){//若为负数取绝对值

ida=abs(ida);

negative=1;

}

cdat[0]=(char)(ida/10000);

cdat[1]=(char)((ida%10000)/1000);

cdat[2]=(char)((ida%1000)/100);

cdat[3]=(char)((ida%100)/10);

cdat[4]=(char)((ida%10)/1);

for(i=0;i<5;i++){

cdat[i]=cdat[i]+48;

}

if(cdat[0]=='0'){

intLen=4;

if(cdat[1]=='0'){

intLen=3;

if(cdat[2]=='0'){

intLen=2;

if(cdat[3]=='0')

intLen=1;

}

}

}

if(negative==1){

Speaker("零下");

delayMs(1000);

}

Speaker(&cdat[5-intLen]);

return0;

}

//语音读小数

uint8SpeakerFloat(floatfda,uint8dNum){//fda为传入的小数,dNum为其小数位数

uint8negative=0;

intida;//整数部分

floatdec;//小数部分

longidec;//转化后的小数部分

if(fda<0){//若为负数取绝对值

fda=fabs(fda);

negative=1;

}

ida=floor(fda);

dec=fda-ida;

idec=(long)(dec*pow(10,dNum+1));//这里多取一位数,用于处理有可能出现x999的情况

Speaker("[n2]");

delayMs(200);

if(negative==1){

SpeakerInt(-ida);

}else{

SpeakerInt(ida);

}

delayMs(3000);

Speaker("点");

delayMs(1000);

Speaker("[n1]");

delayMs(200);

if(idec%10>=5){//如果是尾数x999的情况

idec+=10;

}

idec/=10;

SpeakerInt(idec);

delayMs(3000);

Speaker("[n2]");

delayMs(200);

return0;

}

 

voidmain(){

SpeakerInit();

while

(1){

Speaker("现在的室外温度是");

delayMs(3000);

SpeakerInt(-37);

delayMs(1500);

SpeakerFloat(-32.23,3);

delayMs(3000);

Speaker("度");

delayMs(1000);

}

}

//Speaker.h

#ifndef_SPEAKER_H_

#define_SPEAKER_H_

externvoidSpeakerInit();//语音初始化程序

externuint8Speaker(char*pString);//语音播放程序

externuint8SpeakerInt(intida);//语音读整数

#endif

//typedef.h

#ifndefTYPEDEF_H_

#defineTYPEDEF_H_

typedefunsignedcharuint8;

typedefunsignedintuint16;

typedefunsignedlonguint32;

#endif

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 总结汇报 > 学习总结

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1