广东速佑半导体有限公司 版权所有 粤ICP备20043378号
电话:0755-81796865 传真:0755-28171850 邮箱:stchip@stchip.com
广东速佑半导体有限公司
电 话:0755-81796865
400-160-3880
传 真:0755-28171850
手 机:13823368981
15889550163
Q Q:1321386535
邮 编:518109
Email:stchip@stchip.com
网 址:www.stchip.com
在产品开发中很多工程师会问到单片机如何控制语音芯片放音,下面具体说一下。首先我们在开发产品时需要用到很多少声音,一般常用语音芯片如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;
}
}