51单片机+SYN6288语音模块源码

51单片机+SYN6288语音模块源码,第1张

#include
//#include "syn6288.h"
//#include "delay.h"
//#include "uart.h"
#include

/**************芯片设置命令*********************/
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;         //接收串口来的数据

//软件延时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++);
}


//串口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 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++);
    }
}


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);
}


void  main(void)
{
    UART1_Init();
    SYN_FrameInfo(0, "[v12][t4]你好"); //喇叭说 你好
    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, "[v16][t3]你好");  //喇叭说 你好
            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;    
    }    

}
 

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1498658.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-25
下一篇 2022-06-25

发表评论

登录后才能评论

评论列表(0条)

保存