单片机如何控制语音芯片?
产品开发中单片机如何控制语音芯片播放?下面具体说一下。首先我们在开发产品时需要用到很多少声音,一般常用语音芯片如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; } }
上一条: 语音flash芯片样版接线图
下一条: 语音芯片基础知识--语音芯片订制方案
|