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

产品开发中单片机如何控制语音芯片播放?下面具体说一下。首先我们在开发产品时需要用到很多少声音,一般常用语音芯片如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;

    }  

 

}

 

 

 

 

 电子街  天赐网  51电子网  物友网  企企通采购网  维库电子市场网  贸易中心网  企业梦工厂  北极星电力商务通  阿土伯商贸网  佳工机电网  百业网  EETOP创芯网  企业供需库  3618医疗器械网  东方医疗器械网  知乎-思科微  汇安人力资源  绿盾征信  数码之家  搜狐博客  博客园  新工商名录  食品机械设备网  东方供应商  全天候贸易网  电子发烧友  知乎  全球机械网  中塑在线   商名网  佰伯安全网  一大把  乐酷商务网   富商通  N127网  新浪微博  新品快播网  企业在线   一品威客  马可波罗网  虎易网  娃酷网  818同城网  网商汇  智家网  谷瀑环保网  2018信息港  今日推荐  中国教育装备采购网  更多>>