单片机控制语音芯片代码

2012-10-08 23:22:39 stchip 1224

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

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

 

语音芯片

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 SC_Speech(unsigned char cnt);

void SC_WBusy(void);

void SC_Speechs(void);

 

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

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

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

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

 

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

 

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

main (void)

{

  SC_DATA=0;

  SC_RST=1;

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

  SC_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;

        SC_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;  

   

     SC_RST=1;

     delay_us(100);           

     SC_RST=0;

     delay_us(100);

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

     {  

        SC_DATA=1;             //数据脉冲高

        delay_us(100);         //延时100US

        SC_DATA=0;             //数据脉冲低

        delay_us(100);         //延时100US

     }

}

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

;控制地址段组合放音

;入口参数:无

;出口参数:无

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

void SC_Speechs(void)

{   

    SC_Speech(sp[0]);

    SC_WBusy();

    SC_Speech(sp[1]);

    SC_WBusy();

    SC_Speech(sp[2]);

    sp[0]=0;

    sp[1]=0;

    sp[2]=0;

}

 

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

;等待BUSY信号变低;

;入口参数:无

;出口参数:无

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

void SC_WBusy(void)

{

    unsigned int times;

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

    {

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

       if(SC_BUSY==0) break;

    }  

 

}