isd4004电路图和程序

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

/CS1MOSI2MISO3VSSD4NC5NC6NC7NC8NC9NC10VSSA11VSSA12OUT13AMCAP14SCLK28VCCD27XCLK26/INT25RAC24VSSA23NC22NC21NC20NC19VCCA18IN+17IN-16NC15ISD4004U6ISD4004D6IN4001D7IN4001D9IN4001C2622UFC1810UFC193.3UFC20220UFC161UFC174.7UFC210.047C220.1C250.1R1510KR191KR2010R1410KC1+2-3GND4R8C7VCC6OUT5U15LM386VCC4004/CSP1.2MISOP1.1VCCR110KP1.7INT1J6PHONEJACKSTEREOSW电压增益为20倍放大电路电压增益为50倍放大电路电压增益200倍放大电路//*****************************************************//ISD4002-89c51开发板演示例程C51版本*//作者:中青世纪Lell*//2008.2.27*//*//更多ISD4000使用心得请登陆中青世纪论坛*//*//*//*****************************************************#includereg51.hsbitSS=P1^0;//片选sbitSCLK=P1^1;//ISD4003时钟sbitMOSI=P1^2;//数据输入sbitMISO=P1^3;//数据输出sbitLED=P1^7;//指示灯sbitISD_INT=P3^2;//中断sbitAN=P1^6;//执行sbitSTOP=P1^5;//复位sbitPR=P1^4;//PR=1录音PR=0放音voiddelay(unsignedinttime)//延迟n微秒{while(time!=0){time--;}}voiddelayms(unsignedinttime)//延迟n毫秒{TMOD=0x01;for(time;time0;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_counter8;isx_counter++)//先发低位再发高位,依次发送。{if((isdx&0x01)==1)MOSI=1;elseMOSI=0;isdx=isdx1;SCLK=1;delay(2);SCLK=0;delay(2);}}//*******************************//发送stop指令//*******************************voidisd_stop(void){delay(10);spi_send(0x30);SS=1;delayms(50);}//*******************************//发送上电指令,并延迟50ms//*******************************voidisd_pu(void){delay(10);SS=0;spi_send(0x20);SS=1;delayms(50);}//*******************************//********发送掉电指令,并延迟50msvoidisd_pd(void){delay(10);spi_send(0x10);SS=1;delayms(50);}//*******************************//发送play指令//*******************************voidisd_play(void){LED=0;spi_send(0xf0);SS=1;}//*******************************//发送rec指令//*******************************voidisd_rec(void){LED=0;spi_send(0xb0);SS=1;}//*******************************//发送setplay指令//*******************************voidisd_setplay(unsignedcharadl,unsignedcharadh){spi_send(adl);//发送放音起始地址低位adh=adh|0xe0;spi_send(adh);//发送放音起始地址高位SS=1;}//*******************************//发送setrec指令voidisd_setrec(unsignedcharadl,unsignedcharadh){spi_send(adl);//发送放音起始地址低位adh=adh|0xa0;spi_send(adh);//发送放音起始地址高位SS=1;}//************************************//芯片溢出,LED闪烁提醒停止录音//************************************voidisd_overflow(void){while(AN==0){LED=1;delayms(300);LED=0;delayms(300);}}//************************************//检查芯片是否溢出(读OVF,并返回OVF值)//************************************unsignedcharchk_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指令return1;//OVF为1,返回1}else{SCLK=0;SS=1;//关闭spi通信端isd_stop();//发送stop指令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上电并延迟50msisd_pd();isd_pu();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地址开始放音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)delayms(20);if(STOP==0)break;if(AN==0)delayms(20);}LED=0;}while(AN==0);//AN键再次按下,播放下一段语音}isd_stop();isd_pd();}}/*注意:与ISD4002/03不同的是,由于ISD4004芯片的语音地址是16位,//ISD4004芯片在发送带地址指令(如setplay,setrec,setmc)时,//需要先发送两个字节的地址信息,再发送一个字节的命令字,ISD4004的程序编写与ISD4002/03的区别//例如,ISD4004的setplay指令程序应为:voidisd_setplay(unsignedcharadl,unsignedcharadh){delayms(1);spi_send(adl);//发送放音起始地址低位delay(2);spi_send(adh);//发送放音起始地址高位delay(2);spi_send(0xe0);//发送setplay指令字节SS=1;}*////////////ISD4004语音播放部分/////////////////////////////////当按下P3.5键时,从指定地址开始录音///当按下P3.6键时,从指定地址开始放音///当按下P3.7键时,停止当前的操作///程序中的录放停部分已做成子函数,可以直接调用,只需要输入录音的地址就行//录音地址的设定与芯片型号有关系,以ISD4004-16为例,ISD40044-16录音时间为16//分钟,即16*60=960S,根据4004的资料,960秒可分为2400段,也就是10S的段数为//25段,即从,0000-0019H的内容为10S,///作者:长沙致望科技电子公司版本:V1.0(2008.12.1)//实验使用注意,按录音键,要切换到放音时,可按停止再放音,也可以先按一下放音键,再按一次放音键,那可//原因:本程序在放音前,没有做停止和下电处理,感兴趣的朋友可以直接到停止部分加到放音子函数中。#includereg51.h#includeintrins.h#defineucharunsignedchar#defineuintunsignedint////////定义放音命令,定义常量//////#defineISDPOWERUP0X20//ISD4004上电#defineISDSTOP0X10//ISD4004下电#defineOPERSTOP0X30//ISD4004停止当前操作#definePLAYSET0X

1 / 25
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功