ISD4004语音芯片资料说明及其应用实例(含程序驱动)

转:http://blog.csdn.net/hxq_10/article/details/4981301

*spi isd4004.h*/
#i nclude "reg51.h"
#i nclude "intrins.h"

 

sbit _cs   = p0^0;
sbit _sclk= p0^3;
sbit _mosi= p0^1;
sbit _miso= p0^2;
sbit _rac = p0^4;
sbit _int = p0^5;


void delay(unsigned int i)   //延时程序
{
    while(i--);
}

void stopmode()    //停止
{
    unsigned char m,i,j;
    _cs=1;
    _sclk=0;
    _cs=0;

    m=0x30;
    for(i=0;i<8;i++)
    {
       m=_cror_(m,1);
       j=m<<1;
       _mosi=cy;
       _sclk=0;
       _sclk=1;
    }
    _cs=1;
}
void powerdown()    //下电
{
     unsigned char m,i,j;
     _cs=1;
    _sclk=0;
    _cs=0;

    m=0x10;
    for(i=0;i<8;i++)
    {
       m=_cror_(m,1);
       j=m<<1;
       _mosi=cy;
       _sclk=0;
       _sclk=1;
    }
    _cs=1;
}

void powerup()    上电
{
    unsigned char m,i,j;
    _cs=1;
    _sclk=0;
    _cs=0;

    m=0x20;
    for(i=0;i<8;i++)
    {
       m=_cror_(m,1);
       j=m<<1;
       _mosi=cy;
       _sclk=0;
       _sclk=1;
    }
    _cs=1;
}
void record4004(unsigned int address)   录音   address--录音地址 0---2400
{
      unsigned char i,m,j;
      unsigned int datasoute=0;


       powerup();
       delay(5118);//上电延时
       powerup();
       delay(5118);//上电延时
       delay(5118);//上电延时
       _cs=1;
       _sclk=0;
       m=0xa0;
       _cs=0;
        for(i=0;i<16;i++)
      {
          address=_iror_(address,1);
          datasoute=address<<1;
          _mosi=cy;
          _sclk=0;
          _sclk=1;
      }
       for(i=0;i<8;i++)
      {
          m=_cror_(m,1);
          j=m<<1;
          _mosi=cy;
          _sclk=0;
          _sclk=1;
      }
      _cs=1;
      _sclk=0;
      m=0xb0;
      _cs=0;

      for(i=0;i<8;i++)
      {
         m=_cror_(m,1);
         j=m<<1;
         _mosi=cy;
         _sclk=0;
         _sclk=1;
      }
      _cs=1;
      p0=0xff;
      datasoute=0;
   while(_int==1)        //存储地址换行标志
   {
    if(_rac) {delay(20000); datasoute++; }   //记录本次录音所占的行数(也就是本次录音有多大)
    //
    //   在这里应该加上自己的程序,就是录音退出程序
   //
    }
   }//while end;

void audioout(unsigned int address)   //放音程序
{
     unsigned char i,m,j;
     unsigned int datasoute;


     powerup();
     _cs=1;
     _sclk=0;
     _cs=0;
     m=0xe0;
       for(i=0;i<16;i++)
     {
         address=_iror_(address,1);
         datasoute=address<<1;
         _sclk=0;
         _mosi=cy;
         _sclk=1;
     }
     for(i=0;i<8;i++)
     {
          m=_cror_(m,1);
          j=m<<1;
          _sclk=0;
          _mosi=cy;
          _sclk=1;
     }

     _cs=1;
      _sclk=0;
      m=0xf0;
     _cs=0;
     for(i=0;i<8;i++)
     {
        m=_cror_(m,1);
        j=m<<1;
        _sclk=0;
        _mosi=cy;
        _sclk=1;
     }
     _cs=1;

      p0=0xff;
     while(_int==1)
     {
     }//while end;
}

main()
{
   record4004(0);
    audioout(0);
    while(1);
}


 


 

摘要:ISD4044 是一种采用ChipCorder 专利技术的语音芯片。此芯片无须A/D 转
换和压缩就可以直接储存,没有A/D 转换误差,在一个记录位(BIT)可存储250
级声音信号,相当于通常的A/D 记录的8 倍。片内集成了晶体振荡器、麦克前置
放大器、自动增益控制等,只要很少的外围器件,就可以构成个完整声音录放系
统。本文介绍了ISD4004 的原理、特点、功能及其在智能控制系统中的应用。
关键词:ISD4004 单片机 89C51
1 概述
ISD4004 是美国ISD 公司制造的一种新款语音芯片。与ISD 其它系列语音产品不同的是,ISD4004
是一种微控制器“从”设备,而“主”控制器可以是内置有SPI 兼容接口的微控制器,也可以用I/O 仿真SPI
通信协议。ISD4004 系列工作电压为3V,单片录放时间为8~16 分钟,音质好,适用于移动电话及其它
便携式电子产品中。该芯片采用CMOS 技术,内含振荡器、抗混叠滤波器、平滑滤波器、音频放大器、
自动静噪及高密度多电平闪烁存贮陈列。芯片的所有操作必须由微控制器控制,操作命令可通过串行通
信接口(SPI 或Microwire)送入。ISD4004 采用多电平直接模拟量存储技术,每个采样值直接存贮在片
内闪烁存贮器中,因此能非常真实、自然地再现语音、音调和效果声,避免了一般固体录音电路因量化
和压缩造成的量化噪声和“金属声”。采样频率可为4.0,5.3,6.4,8.0kHz,频率越低,录放时间越长,
音质则有所下降, 片内信息存于闪烁存贮器中,可在断电情况下保存100 年(典型值),反复录音10
万次。
2 引脚功能描述
ISD4004 的引脚排列如图1 所示,各引脚功能如下:


电源(VCCA,VCCD):为使噪声最小,芯片的模
拟和数字电路使用不同的电源总线,并且分别引到外封装
的不同管脚小,模拟和数字电源端最好分别走线。尽可能
在靠近供电端处相连,而去耦电容应尽量靠近器件。
地线(VSSA,VSSD):芯片内部的模拟和数字电路
也使用不同的地线。
同相模拟输入(ANA IN+):录音信号 的同相输入
端。输入放大器可用单端或差分驱动。单端输入时,信号
由耦合电容输入,最大幅度为峰峰值32mV,耦合电容和
本端的3kΩ 电阻输入阻抗决定了芯片频带的低端截止频
率。差分驱动时,信号最大幅度为峰峰值16mV,与
ISD33000 系列相同。
反相模拟输入(ANA IN-):差分驱动时,为录音信
号的反相输入端。信号通过耦合电容输入,最大幅度为峰
峰值16mV。
音频输出(AUD OUT):提供音频输出,可驱动5kΩ 的负载。
片选(SS):此端为低,即向该ISD4004 芯片发送指令,两条指令之间为高电平。
串行输入(MOSI):此端为串行输入端,主控制器应在串行时钟上升沿之前半个周期将数据放到
本端,供ISD 输入。
串行输出(MISO):ISD 的串行输出端。ISD 未选中时,本端呈高阻态。
串行时钟(SCLK):ISD 的时钟输入端,由主控制器产生,用于同步MOSI 和MISO 的数据传输。
数据在SCLK 上升沿锁存到ISD,在下降沿移出ISD。
中断(INT):本端为漏极开路输出。ISD 在任何操作(包括快进)中检测到EOM或IVF 时,本端
变低并保持。中断状态在下一个SPI 周期开始时清除。中断状态也可用RINT 指令读取。
OVF 标志用来指示ISD 的录、放操作已到达存储器的末尾。只在放音中检测到内部的EOM 标志
时,此状态位才置1。
行地址时钟(RAC):漏极开路输出。每个RAC 周期表示ISD 存储器的操作进行了一行(ISD4004
系列中的存贮器共2400 行)。该信号保持高电平的时间为175ms,低电平时间为25ms。在快进模式,
RAC 可保持高电平218.75μs,低电平31. 25μs。该端可用于存储管理技术。


3 工作原理与功能特性
ISD4004 声音录放采用CchipCorder 专利技术,即无须A/D 转换和压缩就可以直接储存,没有A/D
转换误差,在个记录位(BIT)可存储250 级声音信号,相当于通常的A/D 记录的8 倍。
3.1 SPI(串行外设接口)
ISD4004 工作于SPI 串行接口。SPI 协议是一个同步串行数据传输协议,该协议假定微控制器的SPI
移位寄存器在SCLK 的下降沿工作,因此对于ISD4004 而言,在时钟上升沿将锁存MOSI 引脚的数据,
而在下降沿则将数据送至MISO 引脚。
3.2 SPI 接口指令
SPI 的接口指令如表1 所列。
表1 SPI 的接口指令


3.3 SPI 端口的控制位
SPI 端口控制位如图2 所示。
3.4 SPI 控制寄存器
SPI 控制寄存器控制器件可以实现如录放、录音、信息检索(快进)、上电/掉电、开始和停止操
作、忽略地址指针等功能。具体控制位如表2 所列。


 

当IAB 置0 时,录、放操作从A9~A0 地址开始。为了能连贯地录、放到后续的存储空间,在操作
到达该行末之前,应发出第二个SPI 指令将IAB 置1,否则器件在同一个地址上将反复循环。这一点对
语音提示功能很有用。RAC 脚和IAB 位可用于信息管理。
4 在智能控制中的典型应用
本系统是以单片机,语音处理芯片及报警传感器为基础,利用公共电话网络建立起来的智能家居服
务系统。它具有以下主要功能:
(1)家电控制功能:打电话在通过密码校验后,在语音的提示下,进行远程控制家电、查询其工
作状态及家电定时操作。
(2)电话录音功能:可来电留主及用户自己录音

(3)自动语音报警功能:在无的情况下,监控系统检测到非法闯入,能自动拔打报警电话。在叫
通后,能接报警信息以语音的形式发送出去。
由上可以看到,在整个家居服务系统中,要多次实现语音提示,应答,查询等功能。这些功能的实
现是靠单片机89C51 与ISD4004 之间的通讯来完成的。89C51 与ISD4004 的连接如图3 所示

图中,ISD4004 的13 管脚是模拟语音信号的输出端,输出的语音信号通过LM386 功率放大器放大,
然后经过变压器耦合到电话线上。
MIC 是麦克风,即语音信号的输入端,输出的模拟语音信号通过三极管组成放大器加到ISD4004 语
音芯片的输入端。
该系统的录音子程序如下:
LUYIN: ;用户录音子程序
MOV R0,# # # # # # # # # #
ACALL FAST ;语音提示如何修改
JB P3.5,$
MOV A,#20H ;语音芯片上电
ACALL ISDX
SETB P1.0

ACALL YS50 ;上电延时
ACALL YS50
MOV A,# # # # #
;“# # # # # #”表示是录音具体地址
ACALL ISDX ;置录音地址
MOV A,#0A0H
ACALL ISDX
SETB P1.0
LUY1:MOV R1,#20H ;录音开始
LUY2:ACALL YS50
DJNZ R1,LUY2
MOV A,#0B0H ;录音
ACALL ISDX
SETB 1.0
JNB P3.3,$
LUY9:MOV A,#30H
ACALL ISDX
SETB P1.0
LUY3:MOV R5,#10H
LUY5:JNB P1.4,LUY4 ;检查录音是否超时
JNB P3.5,LUY3
DJNZ R5,LUY5
MOV A,#30H ;录音停止
ACALL ISDX
SETB P1.0
LUY6:MOV R4,#0FFH
LUY7:MOV R5,#0FFH
LUY8:MOV R6,#0FFH
LUYA:JNB P3.5,LUY9
DJNZ R6,LUYA
DJNZ R5,LUY8
DJNZ E4,LUY7
SJMP GUANJI
LUY4:MOV R0,# # # # # #;“录音超过,请重录制”
ACALL FSAT
SJMP LUYIN
放音子程序:
FANGYI:MOV R0,# # # # # #;“提示放音程序开始工作”
ACALL FAST
FANGY2:MOV R1,#0FFH
FANGY3:MOV R2,#0FFH
FANGY4:MOV A,#0FFH
MOV P0,A
SETB P0.7
SETB P0.4
CLR P0.5
SETB P0.6
MOV A,P0 ;读8880 状态寄存器
JB ACC.2,FANGY6
FANGY6:DJNZ R2,FANGY4
DJNZ R1,FANGY3
SJMP GUANJI
CLR P0.4
MOV A,P0 ;读8880 接收数据寄存器
ANL A,#0FH ;屏蔽高四位
CJNE A,#02H,FANGYI;查询是否“2”键按下,是则放音
FANGY5:MOV A,#0FFH
MOV P0,A
SETB P0.7
SETB P0.4
CLR P0.5
SETB P0.6
MOV A,P0
JNB ACC.2,FANGY5
MOV R0,# # # # #
ACALL FAST
INC R0
SJMP FANGY2

posted @ 2012-10-29 23:55  陌生的梦  阅读(1314)  评论(0编辑  收藏  举报