⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 main3.c

📁 ISD4004芯片的语音录放程序
💻 C
字号:
#include <reg51.h>
sbit SS=P1^1; //片选
sbit SCLK=P1^0; //ISD4004时钟
sbit MOSI=P1^2; //数据输入
sbit MISO=P1^3; //数据输出
sbit LED=P1^7; //指示灯
sbit ISD_INT=P3^2; //中断
sbit AN=P3^7; //执行
sbit STOP=P3^6; //复位
sbit PR=P1^4;//PR=1 录音 PR=0放音
void delay(unsigned int time) //延时n微秒
{while(time!=0)
{time--;
}
}

void delayms(unsigned int time) //延时n毫秒

{TMOD=0x01;
 for(time;time>0;time--)
{TH0=0xfc;
 TL0=0x18;
 TR0=1;
 while(TF0!=1)
 {;}
 TF0=0;
 TR0=0;
}
}
//************************************
//IS4004 spi串行发送子程序,8位数据
//************************************
void spi_send(unsigned char isdx)
{
  unsigned char isx_counter;
  SS=0;
  SCLK=0;
for(isx_counter=0;isx_counter<8;isx_counter++)//先送低位,再送高位
 {if((isdx&0x01)==1)
  MOSI=1;
  else
  MOSI=0;
  isdx=isdx>>1;
  SCLK=1;
  delay(2);
  SCLK=0; //送数MOSI
  delay(2);
 } 
}

//*****************************************
//发送stop指令
//*****************************************
void isd_stop(void)
{delay(10);
 spi_send(0x30);
 SS=1;
 delayms(50);
}

//**************************************
//发送上电指令,并延时50ms
//**************************************
void isd_pu(void)
{delay(10);
 SS=0;
 spi_send(0x20);
 SS=1;
 delayms(50);
}

//**************************************
//发送掉电指令,并延时50ms
//**************************************
void isd_pd(void)
{delay(10);
 spi_send(0x10);
 SS=1;
 delayms(50);
}
//***************************************
//发送play指令
//***************************************
void isd_play(void)
{LED=0;
 spi_send(0xf0);
 SS=1;
}

//***************************************
//发送rec指令
//***************************************
void isd_rec(void)
{LED=0;
 spi_send(0xb0);
 SS=1;
}

//*******************************************
//发送setplay指令
//*******************************************
void isd_setplay(unsigned char adl,unsigned char adh)
{delayms(1);
 spi_send(adl);//发送放音起始地址低位
 delay(2);  
 spi_send(adh); //发送放音起始地址高位
 delay(2);
 spi_send(0xe0);
 SS=1;
}
//*******************************************
//发送setrec指令
//*******************************************
void isd_setrec(unsigned char adl,unsigned char adh)
{
 
 delayms(1);
 spi_send(adl);//发送录音起始地址低位
 delay(2);  
 spi_send(adh); //发送录音起始地址高位
 delay(2);
 spi_send(0xa0);
 SS=1;
}
//**********************************************
//芯片益出,LED闪烁提醒停止录音
//**********************************************
void isd_overflow(void)
{while(AN==0)
 {LED=1;
  delayms(300);
  LED=0;
  delayms(300);
 }
}
//**********************************************
//检查芯片是否益出(读OVF,并返回OVF值)
//**********************************************

unsigned char chk_isdovf(void)
{SS=0;
 delay(2);
 SCLK=0;
 delay(2);
 SCLK=1;
 SCLK=0;
 delay(2);
 if(MISO==1)
 {SCLK=0;
  SS=1;//关闭spi通信端
  isd_stop();//发送stop指令
  return 1; //OVF为1,返回1
  }
 else 
 {SCLK=0;  //关闭spi通信端
  SS=1;
  isd_stop(); //发送stop指令
  return 0;//OVF为0,返回0
 } 
 
 }

void ledflash()
{LED=1;
 delayms(600);
 LED=0;
 delayms(600);
 LED=1;
 delayms(600);
 LED=0;
 delayms(600);
 LED=1;
 delayms(600);
 LED=0;
 delayms(600);
 LED=1;
 delayms(600);
 LED=0;
 delayms(600);

}
RECORD()
{LED=0;
 delay(10);
 SS=0;
 spi_send(0x20);
 SS=1;
 delayms(100);
 SS=0;
 spi_send(0x20);
 SS=1;
 delayms(100);
 
 spi_send(0);//发送录音起始地址低位
 spi_send(0); //发送录音起始地址高位
 spi_send(0xa0);
 spi_send(0xb0);
 delayms(6600);
 delayms(6600);
 spi_send(0x30);
 ledflash();
}

PLAY0000H()
{
 LED=1;
 delay(10);
 SS=0;
 spi_send(0x20);
 SS=1;
 delayms(50);
 SS=0;
 spi_send(0x20);
 SS=1;
 delayms(100);
 
 
 spi_send(0);//发送录音起始地址低位
 spi_send(0); //发送录音起始地址高位
 spi_send(0xe0);
 spi_send(0xf0);
 delayms(6600);
 delayms(6600);
 spi_send(0x30);
 spi_send(0x10);
 LED=0;

}
main()
{   ledflash();
   
    if(!AN)              //按下KEY4实现录音操作
	RECORD();
    if(AN)               //放开KEY4实现放音操作
	{PLAY0000H();           //从0000H地址放音
     LED=1;
     delayms(100);
	 LED=0;
     delayms(100);     
	 } 
   while(1)
	{;
	
	 }
}
/*
//**********************************************
//主程序
//功能:1.录音时,按住AN键,LED点亮开始录音,松开AN键即可停止录音
//再次按下AN键,LED点亮开始录音第二段,依次类推,直至芯片溢出
//按stop键芯片复位
//2.放音时,按下AN键,即可播放一段语音,按stop键芯片复位.
//***************************************************
void main(void)
{unsigned char ovflog;
 while(1)
 {P0=P1=P2=P3=0xff;//初始化
  while(AN==1)//等待AN键按下
  {if(AN==0)  //按键防抖动
   {delayms(20);}
  }
 isd_pu();//AN键按下,isd上电并延迟50ms
 isd_pd();
 isd_pu();
 if(PR==1) //如果PR==1则转入录音部分
 {delayms(200);//延时录音
  isd_setrec(0x00,0x00);//发送0x0000h地址的setplay指令
  do
  {isd_rec();//发送rec指令
   while(AN==0)//等待录音完毕
   {if(ISD_INT==0) //如果芯片益出,进行LED闪烁指示
    isd_overflow();//如果取消录音(松下AN键)则停止录音,芯片复位
  }
  if(ISD_INT==0)
  break;
  LED=1;//录音完毕,LED熄灭
  isd_stop();//发送停止命令
  while(AN==1) //如果AN再次按下,开始录制下一段语音
  {if(STOP==0) //如果按下STOP按键,则芯片复位
   break;
   if(AN==0)
   delayms(500);
  }
  }while(AN==0);
 }
 else //如果PR=0则转入放音部分
 { 
  while(AN==0){;}
  isd_setplay(0x00,0x00);//发送setplay指令,从0x0000地址开始录音
  do
  {isd_play();//发送放音指令
   delay(20);
   while(ISD_INT==1) //等待放音完毕的EOM中断信号
   {;}
   LED=1;
   isd_stop();//放音完毕,发送stop指令
   if(ovflog=chk_isdovf()) //检查芯片是否溢出,如溢出则停止放音,芯片复位
   break;
   while(AN==1) //等待AN键再次按下
   {if(STOP==0)
    break;
    if(AN==0)
    delayms(20);
   }
  }while(AN==0);//An键再次按下,播放下一段语音
  }
  isd_stop();
  isd_pd();
  }
}
*/
  

   

  

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -