SYN6288中文语音合成 程序

用到串口2,因为串口1的话会影响下载,需每次拔插线。

#include <STC12C5A60S2.H>
#include <stdio.h>
#include <math.h>
#include <string.h>

#define S2RI 0x01    //串口2接收中断请求标志位
#define S2TI 0x02    //串口2发送中断请求标志位

#define uchar unsigned char
#define uint unsigned int
uint SpeakerInt(int ida);
//*****************************************************
uchar nBkm = 0x00;

//*****************************************************

#define HEADLEN       5  //数据包头的长度
#define BKM_OFFSET    4  //背景音乐命令偏移
#define LEN_OFFSET    2  //长度字节的偏移量(一般不会超过255字节,因此只使用1字节长度)
#define BKM_MAX      15	 //背景音乐数量

//*****************************************************

//数据包头(0xFD + 2字节长度 + 1字节命令字 + 1字节命令参数)
uchar head[HEADLEN] = {0xfd,0x00,0x00,0x01,0x00};

//****************************************************

//延时
void Delay(uint z)
{

	uint x,y;
for(x=z; x>0; x--)
  for(y=920; y>0; y--);   
}

void UART_Init(void)
{
    TMOD = 0x20;    //定时器1工作在方式2  8位自动重装
    SCON = 0x50;    //串口1工作在方式1  10位异步收发 REN=1允许接收
    TH1 = 0xFA;       //定时器1初值
    TL1 = TH1;
    TR1 = 1;       //定时器1开始计数
    EA =1;    //开总中断
    ES =1;    //开串口1中断

  AUXR &= 0xF7;		//波特率不倍速
  S2CON = 0x50;		//8位数据,可变波特率
  AUXR &= 0xFB;		//独立波特率发生器时钟为Fosc/12,即12T
  BRT = 0xFD;		//设定独立波特率发生器重装值
  AUXR |= 0x10;		//启动独立波特率发生器
	
}

//串口1发送数据
void SendCharone(uchar n)
{
	SBUF = n;
	while (TI==0);//发送数据
	TI=0;
}			

//串口2发送数据
void SendChar(uchar n)
{
    S2BUF = n;
    while(!(S2CON&S2TI));  //若S2TI=0,在此等待
    S2CON&=~S2TI;      //S2TI=0
}

//背景音乐(参数为0表示关闭背景音乐)
void BkMusic(uchar num)
{
	num %= BKM_MAX + 1;
	nBkm = num;
}

//发声程序
void Speech(uchar *buf)
{
	uchar i = 0;          //循环计数变量
	uchar xor = 0x00;     //校验码初始化
	uchar ch = 0x00;
    uchar len = 0x00;

    while(buf[len++]);

	//发送数据包头(0xFD + 2字节长度 + 1字节命令字 + 1字节命令参数)
	for(i = 0; i < HEADLEN; i++)
	{
		if(i == BKM_OFFSET)
			ch = nBkm << 3; //写入背景音乐
		else if(i == LEN_OFFSET)
			ch = len + 3;
		else
			ch = head[i];

		xor ^= ch;
		SendChar(ch);
		Delay(1);
   	}

	//发送文字内容
	for(i = 0; i < len; i++)
	{
		xor ^= buf[i];
		SendChar(buf[i]);
		Delay(1);
	}

	SendChar(xor);         //发送校验位

	Delay(50);
	Delay(50);

}

//主函数
void main()
{
	uchar nBkm = 0x01;  //演示背景音乐编号

	UART_Init();        //初始化串口为 9600bps   
	
	BkMusic(0);         //关闭背景音乐
	Delay(50);

  
	Speech("呵呵");
	Delay(2000);  
	SpeakerInt(123);	
	while(1);
}

//语音读整数
uint SpeakerInt(int ida)
  {
    uint i;
    uint negative=0;	
    uint intLen=5;
    char cdat[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){
      Speech("零下");
      Delay(1000);
    }
    
    Speech(& cdat[5-intLen]);
    return 0;
}

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

随风飘零翼

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值