语音编解码芯片ISD2560

2019-07-24 15:17发布

在声学领域,单片机技术与各种语音芯片结合,即可完成语音的合成技术,使得单片机语音系统的实现成为可能。所谓语音芯片,就是在人工或者控制器的控制下可以录音和放音的芯片,语音信号是模拟量,语音芯片存储播放声音的基本工作方式为:声音——模拟量——A/D——存储——D/A——模拟量——播放。采用此种方式的语音芯片外围电路比较复杂,声音质量也有一定的失真。而另一类语音芯片采用EEPROM存储方法,将模拟语音数据直接写入半导体存储单元中,不需要另加A/D和D/A变换电路,使用方便,且语音音质自然。
单片机控制主意语音芯片实现对声音的存储和播放硬件电路,主要由51单片机芯片和语音芯片ISD2560及它们的接口电路构成。
语音录放电路.jpg
程序

*******************************************************************************
程序功能为验证ISD2560的录音和放音功能,如果有按键按下,就开始录音,直到按键松开,停止录音,由于1SD2560录音时间不能超过60s,因此按键时间最好不要超过60s。
整个程序需要实现的功能子程序为:录音,按键识别、按键释放识别,播放录音等子程序 *******************************************************************************
#include <reg51.h>        // 引用标准库的头文件
#include <absacc.h>
//宏定义
#define uchar unsigned char
#define uint unsigned int

uchar count;      // 重复播放次数计数器
uchar StartFlag;     // 开始键按下标志
uchar IdleFlag;      // 系统是否处于空闲状态标志
//定义语音芯片ISD2560的控制引脚
sbit START = P1^0;
sbit EOM = P1^4;
sbit PR = P1^5;
sbit PD = P1^6;
sbit CE = P1^7;
//延时t毫秒子程序
void delay(uint t)
{
uint i;
while(t--)
{
  /* 对于12M时钟,约延时1ms */
  for (i=0;i<125;i++)
  {}
}
}
//外部中断0服务子程序
void out_int0() interrupt 0 using 1
{
   EX0 = 0;      // 关外部中断0
   
PD = 1;       // 进入节电状态
if(count<2)      // 再重播2次,共3次放音
{
  count++;
  delay(500);     // 延时500ms
  P2 = P2&0xFC;    // A8=A9=0
  P0 = P0&0x00;    // 起始地址为0
  playback();     // 从地址0处播放
  EX0 = 1;     // 开外部中断0  
}  
else
{
  IdleFlag = 1;    // 变为空闲状态,可以再次按开始键
  count = 0;
}
}
//主程序
void main()
{
EA = 1;       // 开CPU中断
count = 0;                            //计数单元
StartFlag = 0;                         //初始化标志位设定
IdleFlag = 1;
while(IdleFlag==1)
{
  if (START)
  {
   delay(10);    // 延时去抖动
   if (START)     
    StartFlag = 1;  // 开始键按下标志
  }
  if (StartFlag == 1)             //开始标志为1
  {
   do
   {
    P2 = P2&0xFC;  // A8=A9=0
    P0 = P0&0x00;  // 起始地址为0
    record();   // 录音开始,存放在地址0处
   }
   while (START);   // 开始键松开
   StartFlag = 0;
   PR = 1;     // 结束录音
   PD = 1;     // 进入节电状态
   delay(500);    // 延时500ms再播放录音
   EX0 = 1;    // 开外部中断0
   P2 = P2&0xFC;   // A8=A9=0
   P0 = P0&0x00;   // 起始地址为0
   playback();    // 从地址0处进行第一次播放
   IdleFlag = 0;   // 当前不空闲,按开始键无效   
  }
}
}  
//录音子程序
void record(void)
{
CE = 0;               //片选有效
PD = 0;
PR = 0;             //录音开始
}
//放音子程序     
void playback(void)
{
CE = 0;                片选有效
PD = 0;
PR = 1;             //放音开始
}
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。