isd4004电路图和程序Word格式文档下载.docx

上传人:b****3 文档编号:6729385 上传时间:2023-05-07 格式:DOCX 页数:35 大小:1.18MB
下载 相关 举报
isd4004电路图和程序Word格式文档下载.docx_第1页
第1页 / 共35页
isd4004电路图和程序Word格式文档下载.docx_第2页
第2页 / 共35页
isd4004电路图和程序Word格式文档下载.docx_第3页
第3页 / 共35页
isd4004电路图和程序Word格式文档下载.docx_第4页
第4页 / 共35页
isd4004电路图和程序Word格式文档下载.docx_第5页
第5页 / 共35页
isd4004电路图和程序Word格式文档下载.docx_第6页
第6页 / 共35页
isd4004电路图和程序Word格式文档下载.docx_第7页
第7页 / 共35页
isd4004电路图和程序Word格式文档下载.docx_第8页
第8页 / 共35页
isd4004电路图和程序Word格式文档下载.docx_第9页
第9页 / 共35页
isd4004电路图和程序Word格式文档下载.docx_第10页
第10页 / 共35页
isd4004电路图和程序Word格式文档下载.docx_第11页
第11页 / 共35页
isd4004电路图和程序Word格式文档下载.docx_第12页
第12页 / 共35页
isd4004电路图和程序Word格式文档下载.docx_第13页
第13页 / 共35页
isd4004电路图和程序Word格式文档下载.docx_第14页
第14页 / 共35页
isd4004电路图和程序Word格式文档下载.docx_第15页
第15页 / 共35页
isd4004电路图和程序Word格式文档下载.docx_第16页
第16页 / 共35页
isd4004电路图和程序Word格式文档下载.docx_第17页
第17页 / 共35页
isd4004电路图和程序Word格式文档下载.docx_第18页
第18页 / 共35页
isd4004电路图和程序Word格式文档下载.docx_第19页
第19页 / 共35页
isd4004电路图和程序Word格式文档下载.docx_第20页
第20页 / 共35页
亲,该文档总共35页,到这儿已超出免费预览范围,如果喜欢就下载吧!
下载资源
资源描述

isd4004电路图和程序Word格式文档下载.docx

《isd4004电路图和程序Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《isd4004电路图和程序Word格式文档下载.docx(35页珍藏版)》请在冰点文库上搜索。

isd4004电路图和程序Word格式文档下载.docx

//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;

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 法律文书 > 调解书

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2