廣東速佑半導體有限公司 版權所有 粵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.xaliao.com.cn
現在產品說明書動則好幾頁,看起來不勝其煩。而且剛買來時想到并不是每樣功能都會用到,所以不會去學習所有操作或問題解答。但時間長了偶爾想要用到某功能時卻束手無策,急忙去找說明書卻又不知去向。 現在的智能電飯煲、智能電壓力鍋、智能洗衣機,雖然智能了操作反而復雜了。就像某電熱水器有了定時預約功能后,操作起來卻很麻煩,有時也會忘記操作步驟。若有語音提示和閃爍的文字配合或與閃爍的LED 燈配合就能很好演示某些功能的操作,或者引導用戶如何操作。
在產品開發中可以用單片機加語音芯片做語音菜單提示功能,首先我們在開發產品時需要確定語音總時長度和多少條語音地址選擇相應型號,如選一般常用語音芯片SC5180B支持語音總時長180秒,支持255段地址,一線串行控制模式16級的音量控制,另外相同系列型號有支持20秒-1000秒語單長度方便產品以后添加更多語音。首先把一些重復使用的語音先分好段編好地址盡量精簡。然后用單機片程序組合成我們需要的語句。如“1-9”,“十”,“百”,“米“。現在我們要發“100米”的語音,我們先發一個“1”再發“百”為再發“米”就可以了,
參加電路:

控制時序圖:
SDA發送2ms-8ms低電平再發送高低電平3:1或1:3信號且數據低位先送。時序范圍為200us:600us到500us:1500us。如上圖發送的是56H。
6.3、數據與語音的對應關系
地址 | 功能 |
01H | 播放第1段語音 |
02H | 播放第2段語音 |
XXH | 播放第xx段語音 |
DFH | 播放第223段語音 |
E0H~EFH | 控制16級音量,E0H音量最小,EFH音量最大,默認最大 |
F2H | 循環播放:第N語音地址+F2H,即循環播放第N地址語音 |
F3H | 退出循環播放 |
FCH | 打開功放 |
FDH | 關閉功放 |
FEH | 停止播放 |
單片機一線控制語音芯片音量程序
/****************************************************
;http://www.xaliao.com.cn
;OTP語音芯片串行一線串口模式組合語音測試程序
;主芯片:MPC82L52(1T)
;工作頻率:6MHz
;適用型號:SC5008M ,SC5340B ,SC5180B ,SC5080B ,SC5040B, SC5020B
;速佑半導體:400-160-3880
****************************************************/
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_DATA=P3^1; //P3.1是脈沖數據腳
sbit SC_BUSY=P3^2; //P3.2是放音BUSY腳
unsigned int sp[3]; //定義一個組合語音用的數組變量
/*************主程序****************/
main (void)
{
SC_DATA=1;
sp[0]=0X00;
sp[1]=0X00;
sp[2]=0X00;
while(1)
{
sp[0]=0X08;
sp[1]=0X05;
sp[2]=0X09;
SC_Speechs(); //組合8,5,9地址段放音
//delay_ms(5000); //延時放音時間5秒
}
}
/**************************************
;延時X毫秒
;不同的工作環境,需要調整此函數
;入口參數:count
;出口參數:無
**************************************/
void delay_ms(unsigned int count)
{
unsigned int i,j;
for(i=0;i<count;i++)
{
for(j=0;j<500;j++);
}
}
/**************************************
;延時X微秒
;不同的工作環境,需要調整此函數
;入口參數:count
;出口參數:無
**************************************/
void delay_us(unsigned int count)
{
unsigned int i,j;
for(i=0;i<count;i++)
{
for(j=0;j<2;j++);
}
}
/**************************************
;控制命令
;入口參數:data;
;出口參數:無
**************************************/
void SC_Speech(unsigned char data)
{
unsigned char i;
SC_DATA=0;
delay_ms(5);
for(i=0;i < 8;i++)
{
SC_DATA = 1;
if(data&0x01)
{
delay_us(1500);
SC_DATA = 0;
delay_us(500);
}
else
{
delay_us(500);
SC_DATA = 0;
delay_us(1500);
}
data >>= 1;
}
SC_DATA =1;
delay_ms(30);
}
/**************************************
;控制地址段組合放音
;入口參數:無
;出口參數:無
**************************************/
void SC_Speechs(void)
{
SC_Speech(sp[0]);
SC_WBusy(); //等待BUSY信號變高
SC_Speech(sp[1]);
SC_WBusy();
SC_Speech(sp[2]);
sp[0]=0X00;
sp[1]=0X00;
sp[2]=0X00;
}
/**************************************
;等待BUSY信號變高;
;入口參數:無
;出口參數:無
**************************************/
void SC_WBusy(void)
{
unsigned int times;
for(times=0;times<50;times++) //等待超過5秒最長語音段自動退出;
{
delay_ms(100); //調節組合語音間隔
if(SC_BUSY==1) break;
}
}