技术文章
    当前位置:首页 > 技术文章
    单片机如何控制语音芯片?

    产品开发中单片机如何控制语音芯片播放?下面具体说一下。首先我们在开发产品时需要用到很多少声音,一般常用语音芯片如SK080 SK040 SK020等支持的段数为32或63段先我们把一些重复使用的语音先分好段编好地址尽量精简。然后用单机片程序组合成我们需要的语句。如“1-9”,“十”,“百”,“千”,“元”...现在我们要发“100元”的语音,我们先发一个“1”再发“百”为再发“元”就可以了,下面讨论一下程序怎么样处理。

    1.单片机控制接线图如下:

     

    语音芯片

    2.时序图:

    语音芯片

    单片机每次控制语音芯片放音前先发一个RST信号把语音芯片里的计数器清0,然后DATA脚发N个100US的脉冲高电平,就控制放第N个里的语音。

    3.程序:

     

    include "REG_MPC82L52.H"

     #include

     

     

    void delay_ms(unsigned int count) ;

    void delay_us(unsigned int count);

    void Speech(unsigned char cnt);

    void WBusy(void);

    void Speechs(void);

     

    /**************端口定义*****************/

    sbit RST=P3^0;      //P3.0是脉冲复位脚

    sbit DATA=P3^1;     //P3.1是脉冲数据脚

    sbit BUSY=P3^2;     //P3.2是放音BUSY脚

     

    unsigned int sp[3];    //定义一个组合语音用的数组变量

     

    /*************主程序****************/

    main (void)

    {

      DATA=0;

      RST=1;

      delay_us(100);            //上电复位防止干扰发声芯片放音

      RST=0;

      delay_us(100);

      sp[0]=0;

      sp[1]=0;

      sp[2]=0;

      while(1)

      {

      

            sp[0]=1;

            sp[1]=11;

            sp[2]=12;

            Speechs();      //组合1,11,12地址段放音‘100元‘

       delay_ms(5000);    //延时放音时间5秒

       }

    }

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

    ;延时X毫秒

    ;不同的工作环境,需要调整此函数

    ;入口参数:count

    ;出口参数:无

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

    void delay_ms(unsigned int count)    

    {

     unsigned int i,j;

     for(i=0;i

     {

        for(j=0;j<500;j++);

     }

    }

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

    ;延时X微秒

    ;不同的工作环境,需要调整此函数

    ;入口参数:count

    ;出口参数:无

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

    void delay_us(unsigned int count)

    {

     unsigned int i,j;

     for(i=0;i

     {

        for(j=0;j<2;j++);

     }

    }

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

    ;控制地址段放音

    ;入口参数:cnt;

    ;出口参数:无

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

    void SC_Speech(unsigned char cnt)

    {   

         unsigned char i;  

       

         RST=1;

         delay_us(100);           

         RST=0;

         delay_us(100);

         for(i=0;i < cnt;i++)

         {  

            DATA=1;             //数据脉冲高

            delay_us(100);         //延时100US

            DATA=0;             //数据脉冲低

            delay_us(100);         //延时100US

         }

    }

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

    ;控制地址段组合放音

    ;入口参数:无

    ;出口参数:无

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

    void Speechs(void)

    {   

        Speech(sp[0]);

       WBusy();

        Speech(sp[1]);

        WBusy();

        Speech(sp[2]);

        sp[0]=0;

        sp[1]=0;

        sp[2]=0;

    }

     

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

    ;等待BUSY信号变低;

    ;入口参数:无

    ;出口参数:无

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

    void WBusy(void)

    {

        unsigned int times;

        for(times=0;times<50;times++)        //等待超过5秒最长语音段自动退出;

        {

           delay_ms(100);                    //调节组合语音间隔

           if(BUSY==0) break;

        }  

     

    }