isd4004电路图和程序Word格式文档下载.docx
《isd4004电路图和程序Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《isd4004电路图和程序Word格式文档下载.docx(35页珍藏版)》请在冰点文库上搜索。
![isd4004电路图和程序Word格式文档下载.docx](https://file1.bingdoc.com/fileroot1/2023-5/7/50447093-2e49-4c56-bd46-5b0dfd7373f2/50447093-2e49-4c56-bd46-5b0dfd7373f21.gif)
//PR=1录音PR=0放音
voiddelay(unsignedinttime)//延迟n微秒
{
while(time!
=0)
{
time--;
}
}
voiddelayms(unsignedinttime)//延迟n毫秒
{TMOD=0x01;
for(time;
time>
0;
time--)
TH0=0xfc;
TL0=0x18;
TR0=1;
while(TF0!
=1)
{;
TF0=0;
TR0=0;
//************************************
//ISD4002spi串行发送子程序,8位数据
voidspi_send(unsignedcharisdx)
{unsignedcharisx_counter;
SS=0;
//ss=0,打开spi通信端
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;
//*******************************
//发送stop指令
voidisd_stop(void)
{delay(10);
spi_send(0x30);
SS=1;
delayms(50);
//发送上电指令,并延迟50ms
voidisd_pu(void)
spi_send(0x20);
//********发送掉电指令,并延迟50ms
voidisd_pd(void)
spi_send(0x10);
//发送play指令
voidisd_play(void)
LED=0;
spi_send(0xf0);
//发送rec指令
voidisd_rec(void)
spi_send(0xb0);
//发送setplay指令
voidisd_setplay(unsignedcharadl,unsignedcharadh)
{spi_send(adl);
//发送放音起始地址低位
adh=adh|0xe0;
spi_send(adh);
//发送放音起始地址高位
//发送setrec指令
voidisd_setrec(unsignedcharadl,unsignedcharadh)
spi_send(adl);
adh=adh|0xa0;
//芯片溢出,LED闪烁提醒停止录音
voidisd_overflow(void)
while(AN==0)
{LED=1;
delayms(300);
LED=0;
//检查芯片是否溢出(读OVF,并返回OVF值)
unsignedcharchk_isdovf(void)
delay
(2);
SCLK=1;
if(MISO==1)
{SCLK=0;
SS=1;
//关闭spi通信端
isd_stop();
//发送stop指令
return1;
//OVF为1,返回1
else
return0;
//OVF为0,返回0
//************************************************************************
//主程序
//功能:
1.录音时,按住AN键,LED点亮开始录音,松开AN即可停止录音
//再次按下AN键,LED点亮开始录第二段音,依次类推,直到芯片溢出。
//按stop键芯片复位
//2.放音时,按一下AN键,即播放一段语音。
按stop键芯片复位。
voidmain(void)
{unsignedcharovflog;
while
(1)
P0=P1=P2=P3=0xff;
//初始化
while(AN==1)//等待AN键按下
{
if(AN==0)//按键防抖动
{delayms(20);
}
isd_pu();
//AN键按下,ISD上电并延迟50ms
isd_pd();
if(PR==1)//如果PR=1则转入录音部分
delayms(500);
//延迟录音
isd_setrec(0x00,0x00);
//发送0x0000h地址的setplay指令
do
{isd_rec();
//发送rec指令
delay(20);
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地址开始放音
{
isd_play();
//发送放音指令
while(ISD_INT==1)//等待放音完毕的EOM中断信号
{;
//放音完毕,发送stop指令
if(ovflog=chk_isdovf())//检查芯片是否溢出,如溢出则停止放音,芯片复位
while(AN==1)//等待AN键再次按下
{if(STOP==0)
delayms(20);
if(STOP==0)
if(AN==0)
delayms(20);
LED=0;
//AN键再次按下,播放下一段语音
isd_stop();
isd_pd();
/*注意:
与ISD4002/03不同的是,由于ISD4004芯片的语音地址是16位,
//ISD4004芯片在发送带地址指令(如setplay,setrec,setmc)时,
//需要先发送两个字节的地址信息,再发送一个字节的命令字,ISD4004的程序编写与ISD4002/03的区别
//例如,ISD4004的setplay指令程序应为:
delayms
(1);
spi_send(0xe0);
//发送setplay指令字节
}*/
///////////ISD4004语音播放部分/////////////////////////////
////当按下P3.5键时,从指定地址开始录音
///当按下P3.6键时,从指定地址开始放音
///当按下P3.7键时,停止当前的操作
///程序中的录放停部分已做成子函数,可以直接调用,只需要输入录音的地址就行
// 录音地址的设定与芯片型号有关系,以ISD4004-16为例,ISD40044-16录音时间为16
//分钟,即16*60=960S,根据4004的资料,960秒可分为2400段,也就是10S的段数为
//25段,即从,0000-0019H的内容为10S,
///作者:
长沙致望科技电子公司 WWW.CSMCU.COM
///版本:
V1.0(2008.12.1)
//实验使用注意,按录音键,要切换到放音时,可按停止再放音,也可以先按一下放音键,再按一次放音键,那可
//原因:
本程序在放音前,没有做停止和下电处理,感兴趣的朋友可以直接到停止部分加到放音子函数中。
intrins.h>
#defineucharunsignedchar
#defineuintunsignedint
////////定义放音命令,定义常量//////
#defineISDPOWERUP0X20//ISD4004上电
#defineISDSTOP0X10//ISD4004下电
#defineOPERSTOP0X30//ISD4004停止当前操作
#definePLAYSET0XE0//ISD4004从指定地址开始放音
#definePLAYCUR0XF0//ISD4004从当前地址开始放音
#defineRECSET0XA0//ISD4004从指定地址开始录音
#defineRECCUR0XB0//ISD4004从当前地址开始录音
sbitSS=P0^0;
//LOWISACTIVELY
sbitMOSI=P0^1;
sbitMISO=P0^2;
sbitSCLK=P0^3;
//sbitINT=P1^2;
sbitK1=P3^1;
//用串口烧写程序时会用到
sbitK2=P3^2;
sbitK3=P3^3;
sbitLED1=P1^0;
sbitLED2=P1^1;
sbitLED3=P1^2;
voiddelayms(ucharms);
uintaddr;
////全局变量////放音地址
////////////////放音部分子程序,放音地址由ADDR决定////
voidplay()
{uinty;
MOSI=0;
//发送开始
for(y=0;
y<
y++)
if((0x20>
y)&
0x01)MOSI=1;
//发送上电命令,从低位往高位发
elseMOSI=0;
_nop_();
}//发送结束
//上电结束
delayms(25);
//MOSI=0;
//发送地址
//SCLK=0;
16;
if((addr>
//上电结束
//放音
if((0xE0>
if((0xF0>
}
//////////////////////////lu音部分子程序,地址由ADDR决定/////////////////////////
voidrec()
{uinty;
//delayms(50);
//MOSI=0;
}//发送地址结束*/
//SCLK=0;
if((0xA0>
if((0xB0>
////////////////////////////////////
////////////////////////////////
voidstop()
{
uchary;
if((0x30>
///////////////////////////////
//////////////////////////////////
voidDstop()
if((0x10>
////////////////////////////////////voidpress_key()
voiddelayms(ucharms)
//延时子程序
{
ucharj;
while(ms--)
for(j=0;
j<
125;
j++);
voidmain()
{P1=0xFF;
P2=0XFF;
P3=0XFF;
{if(K1==0)
{delayms(10);
while(K1==0);
///松手判断
LED1=0;
LED2=1;
LED3=1;
addr=0X00;
/////从0X50单元开始
delayms(500);
rec();
delayms(10);
//if(INT==0)
//stop();
if(K2==0)
while(K2==0);
LED1=1;
LED2=0;
play();
//addr=0x50;
//play();
if(K3==0)
while(K3==0);
LED1=1;