//注意:51单片机使用12M晶振串口发送数据会有误差而不能工作 // 所以只能使用11.0592M的晶振 #include <reg51.h> #include <string.h> #include "uart.h" void syn6288(char* tex,unsigned char changdu); /**************************************************************************** * 函 数:void main(void) * 功 能:主函数 * 参 数:无 * 返回值:无 * 更 新:无 * 备 注:无 ****************************************************************************/ void main(void) { /****************需要发送的文本**********************************/ char code text[] = {"[v10][m10]湖北"}; char code hubei[] = {"[v9][m9]ok"}; /****************串口的初始化************************************/ uartinit(); syn6288(text,sizeof(text)); uart_delay(2000); //延时很重要 syn6288(hubei,sizeof(hubei)); uart_delay(1000); //延时很重要 while(1) ; } /**************************************************************************** * 函 数:void syn6288(char* tex,unsigned char changdu) * 功 能:语音读取字符串 * 参 数:tex--------字符串的地址 * changdu----字符串tex的长读 * 返回值:无 * 更 新:无 * 备 注:无 ****************************************************************************/ void syn6288(char* tex,unsigned char changdu) { unsigned char headOfFrame[5]; unsigned char length; unsigned char ecc = 0; //定义校验字节 unsigned int i=0; length =changdu; //需要发送文本的长度 /*****************发送过程**************************************/ headOfFrame[0] = 0xFD ; //构造帧头FD headOfFrame[1] = 0x00 ; //构造数据区长度的高字节 headOfFrame[2] = length + 3; //构造数据区长度的低字节 headOfFrame[3] = 0x01 ; //构造命令字:合成播放命令 /*****************带背景音乐**************************************/ headOfFrame[4] = 0x21 ; //构造命令参数:编码格式为GBK /*****************不带背景音乐**************************************/ //headOfFrame[4] = 0x01 ; //构造命令参数:编码格式为GBK for(i = 0; i<5; i++) //依次发送构造好的5个帧头字节 { ecc=ecc^(headOfFrame[i]); //对发送的字节进行异或校验 SBUF = headOfFrame[i]; while (TI== 0) {;} //等待发送中断标志位置位 TI = 0; //发送中断标志位清零 } for(i = 0; i<length; i++) //依次发送待合成的文本数据 { ecc=ecc^(tex[i]); //对发送的字节进行异或校验 SBUF = tex[i]; while (TI== 0) {;} TI = 0; //uart_delay(10); } //uart_delay(1000); SBUF=ecc; //最后发送校验字节 while(TI== 0) ; TI=0; } |