您好,欢迎访问三七文档
当前位置:首页 > 行业资料 > 酒店餐饮 > SYN6288语音播放模块(终极版)
SYN6288语音播放模块制作1、SYN6288语音芯片封装图:2、通信方式:2.1异步串行通讯(UART)接口SYN6288提供一组全双工的异步串行通讯(UART)接口,实现与微处理器或PC的数据传输。SYN6288利用TxD和RxD以及GND实现串口通信。其中GND作为地信号。SYN6288芯片支持UART接口通讯方式,通过UART接口接收上位机发送的命令和数据,允许发送数据的最大长度为206字节。2.2通讯传输字节格式1、初始波特率:9600bps2、起始位:13、数据位:84、校验位:无5、停止位:16、流控制:无与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芯片手册:文本程序发送:中文系统电脑的文本编码格式一般为:ANSI即GB2312编码体系,这个可以用二进制文本编辑器(如BinaryEditor)打开并对照GB2312编码表察看。参考程序://speaker.c#includereg51.h#includestring.h#includemath.h#includetypedef.h#includeSPEAKER.hvoiddelayMs(uint16xms){uint16i,j;for(i=0;ixms;i++)for(j=0;j123;j++);}//语音模块初始化voidSpeakerInit(){/**************串口的初始化*****************/TL1=0XFA;//在11.0592MHZ下,设置波特率9600bps,工作方式2TH1=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;//构造帧头FDheadOfFrame[1]=0X00;//构造数据区长度的高字节length=strlen(pString);//需要发送文本的长度headOfFrame[2]=length+3;//构造数据区长度的低字节headOfFrame[3]=0X01;//构造命令字:合成播放命令headOfFrame[4]=0X00;//构造命令参数:编码格式为GB2312for(i=0;i5;i++)//依次发送构造好的5个帧头字节{ecc=ecc^(headOfFrame[i]);//对发送的字节进行异或校验SBUF=headOfFrame[i];while(TI==0){;}//等待发送中断标志置位TI=0;//发送中断标志位清零}for(i=0;ilength;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(ida0){//若为负数取绝对值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;i5;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(fda0){//若为负数取绝对值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
本文标题:SYN6288语音播放模块(终极版)
链接地址:https://www.777doc.com/doc-3826056 .html