廣東速佑半導(dǎo)體有限公司 版權(quán)所有 粵ICP備20043378號(hào)
電話:0755-81796865 傳真:0755-28171850 郵箱:stchip@stchip.com
業(yè)務(wù)咨詢: :
:
:
技術(shù)服務(wù):
廣東速佑半導(dǎo)體有限公司
電 話:0755-81796865
400-160-3880
傳 真:0755-28171850
手 機(jī):13823368981
15889550163
Q Q:1321386535
郵 編:518109
Email:stchip@stchip.com
網(wǎng) 址:yixishe.cn
在產(chǎn)品開發(fā)中很多工程師會(huì)問到單片機(jī)如何控制語(yǔ)音芯片放音,下面具體說一下。首先我們?cè)陂_發(fā)產(chǎn)品時(shí)需要用到很多少聲音,一般常用語(yǔ)音芯片如SC080 SC020B SC8035等支持的段數(shù)為32或63段先我們把一些重復(fù)使用的語(yǔ)音先分好段編好地址盡量精簡(jiǎn)。然后用單機(jī)片程序組合成我們需要的語(yǔ)句。如“1-9”,“十”,“百”,“米“?,F(xiàn)在我們要發(fā)“100米”的語(yǔ)音,我們先發(fā)一個(gè)“1”再發(fā)“百”為再發(fā)“米”就可以了,下面討論一下程序怎么樣處理。
1.SC8035單片機(jī)控制接線圖如下:
2.時(shí)序圖:
單片機(jī)每次控制語(yǔ)音芯片放音前先發(fā)一個(gè)RST信號(hào)把語(yǔ)音芯片里的計(jì)數(shù)器清0,然后DATA腳發(fā)N個(gè)100US的脈沖高電平,就控制放第N個(gè)里的語(yǔ)音。
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是脈沖復(fù)位腳
sbit SC_DATA=P3^1; //P3.1是脈沖數(shù)據(jù)腳
sbit SC_BUSY=P3^2; //P3.2是放音BUSY腳
unsigned int sp[3]; //定義一個(gè)組合語(yǔ)音用的數(shù)組變量
/*************主程序****************/
main (void)
{
SC_DATA=0;
SC_RST=1;
delay_us(100); //上電復(fù)位防止干擾發(fā)聲芯片放音
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); //延時(shí)放音時(shí)間5秒
}
}
/**************************************
;延時(shí)X毫秒
;不同的工作環(huán)境,需要調(diào)整此函數(shù)
;入口參數(shù):count
;出口參數(shù):無(wú)
**************************************/
void delay_ms(unsigned int count)
{
unsigned int i,j;
for(i=0;i
{
for(j=0;j<500;j++);
}
}
/**************************************
;延時(shí)X微秒
;不同的工作環(huán)境,需要調(diào)整此函數(shù)
;入口參數(shù):count
;出口參數(shù):無(wú)
**************************************/
void delay_us(unsigned int count)
{
unsigned int i,j;
for(i=0;i
{
for(j=0;j<2;j++);
}
}
/**************************************
;控制地址段放音
;入口參數(shù):cnt;
;出口參數(shù):無(wú)
**************************************/
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; //數(shù)據(jù)脈沖高
delay_us(100); //延時(shí)100US
SC_DATA=0; //數(shù)據(jù)脈沖低
delay_us(100); //延時(shí)100US
}
}
/**************************************
;控制地址段組合放音
;入口參數(shù):無(wú)
;出口參數(shù):無(wú)
**************************************/
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信號(hào)變低;
;入口參數(shù):無(wú)
;出口參數(shù):無(wú)
**************************************/
void SC_WBusy(void)
{
unsigned int times;
for(times=0;times<50;times++) //等待超過5秒最長(zhǎng)語(yǔ)音段自動(dòng)退出;
{
delay_ms(100); //調(diào)節(jié)組合語(yǔ)音間隔
if(SC_BUSY==0) break;
}
}