SYN6288移植51程序

本文档详细介绍了如何将SYN6288语音模块移植到STM32上,包括头文件的创建、串口初始化、SYN6288命令设置及主程序的编写。通过主程序中的SYN_FrameInfo函数实现语音播放,并提供了延时函数以确保语音播放的正常进行。
摘要由CSDN通过智能技术生成

一,头文件

我刚刚买回来的模块并不是51.52芯片的,所以

 LE52.H 使用不了,我的Keil4脾气也暴躁,包含所有头文件的config.h也编译出现错误,因此我自己建立了一个包含所有头文件的头文件all.h(所以目录中的LE52.H与config都是没用的),其余的usart.h与SYN6288.h没怎么改,SYN6288.h中的uint8_t   要记得换成unsigned char   因为我没有给这个宏定义,我的keil4太难驯服了

 

 二,主程序

1.说完头文件先说说串口程序usart.c

 

#include "all.h"


unsigned char a,flag;
unsigned char DAT;
unsigned int  x=0;

void UartIni(void)

 
 TMOD=0x20; //定时器初始化

 SCON=0x50;//选择模式
 
 TH1=256-3;//9600波特率
 
 TL1=256-3;
 
 TR1=1;
 ES=1;//开启中断
 EA=1; 
}


void UARTSendByte(DAT)
{
    ES=0;   //关闭中断
    SBUF = DAT;
    while(!TI);
    TI=0;
    ES=1;//开启中断
}


void PrintCom(unsigned char *DAT,unsigned char len)
{
    unsigned char i;
    for(i=0;i<len;i++)
    {
         UARTSendByte(*DAT++);
    }    
}

void Uart_Isr() interrupt 4 
{    
    DAT=SBUF;
    RI=0;
    x=1;
}
 

 2.SYN6288.c程序其实几乎都没有改,我一般就把uint8_t替换成unsigned char

#include "all.h"


/**************芯片设置命令*********************/
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 状态命令

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


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(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;
          PrintCom(Frame_Info,5+HZ_Length+1);
}

void YS_SYN_Set(unsigned char *Info_data)
{
    unsigned char Com_Len;
    Com_Len =strlen(Info_data);
    PrintCom(Info_data,Com_Len);
}

 3.main.c程序如下,这里最重要的是SYN_FrameInfo函数的使用,如果在while里面记得要加上延时函数,要不程序一直运行太快,喇叭一句话都来不及说,真正开发的时候也要加入延时,这样喇叭才正常

#include "all.h"

// sbit P1_0=P1^0;
 

void delay_ms(unsigned int n)
{
  unsigned  int  q=0,w=0;
    for(q=0;q<n;q++)
    {
    for(w=0;w<120;w++);
    }
}

void MCU_init(); 
extern void SYN_FrameInfo(unsigned char Music,unsigned char *HZdata);
void  delay(unsigned long uldata);

void  main(void)
{
 unsigned int n=6,i=0;
     UartIni(); /*串口初始化*/
//     delay_ms(5000);
//      SYN_FrameInfo(0,"大家好,我是[t5]渣渣灰")    ;
//      delay_ms(5000);
  
       
   while(1)
   {
      switch(P1)
     {
            case    0x00:
            SYN_FrameInfo(0,"我是[t5]渣渣灰初代") ; delay_ms(10000);    break;
            case   0x01:
            SYN_FrameInfo(0,"我是[t5]渣渣灰一号") ; delay_ms(10000);     break;
            case   0x02:
            SYN_FrameInfo(0,"我是[t5]渣渣灰二号") ;  delay_ms(10000);    break;
            case   0x03:
            SYN_FrameInfo(0,"我是[t5]渣渣灰三号") ;  delay_ms(10000);    break;
            case   0x04:
            SYN_FrameInfo(0,"我是[t5]渣渣灰四号") ;  delay_ms(10000);    break;
            case   0x05:
            SYN_FrameInfo(0,"我是[t5]渣渣灰五号") ;  delay_ms(10000);    break;
            case   0x06:
            SYN_FrameInfo(0,"我是[t5]渣渣灰六号") ;  delay_ms(10000);    break;    
            default :
            delay_ms(1000)  ;    break;
            

    }

}


  }

void  delay(unsigned long uldata)
{
    unsigned int j  =  0;
    unsigned int g  =  0;
    for (j=0;j<5;j++)
    {
        for (g=0;g<uldata;g++)
        {
            _nop_();
            _nop_();

 三、总结

    这个其实不算很难,就是小问题挺多,大概向上面一样分三步,第一步串口初始化调试串口,使用Printfcom循环发送字节;第二步,初始化SYN6288,一般送的资料里面都有原始代码,不需要更改;第三步,SYN_FrameInfo函数的使用(在买回来的时候会有说明书的,这个有很多调节方法,不过我只是说说程序移植)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值