语音ISD4004原理图及程序

  • 格式:doc
  • 大小:85.00 KB
  • 文档页数:8

1

录音程序:

#include

#include

#define uchar unsigned char

#define uint unsigned int

//使用一下三个I/O口即可完成基本的录放音功能

sbit SS=P1^0;

sbit SCLK=P1^1; //LOW IS ACTIVELY

sbit MOSI=P1^2;

sbit BF_1=P3^5; //执行

sbit BF_2=P3^6; //复位

sbit BF_3=P3^7; //PR=1录音,pr=0放音

sbit LED=P2^0; //亮正在录音

sbit LED1=P2^2; //闪一下进入录音

sbit LED2=P2^4; // 闪一下复位

sbit LED3=P2^6; //LED3亮放音 2

void delay(unsigned int time)//延时几微 秒

{

while(time!=0)

{

time--;

}

}

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

{

uchar j;

while(time--)

{

for(j = 0; j < 120; j++);

}

}

//串行发送子程序,8位数据

void spi_send(unsigned char isdx)

{

unsigned char isx_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;

delay(2);

}

}

//发送stop指令

void isd_stop(void)

{

delay(10); 3 spi_send(0x30);

SS=1; //两条指令之间为高电平,故所有指令之后都要将SS拉高

delayms(50);

LED2=0;

delayms(1000);

LED2=1;

}

//发送上电指令并延时50毫秒,上电后要延时一段时间(约为25MS)后才能发送指令

void isd_pu(void)

{

delay(10);

SS=0;

spi_send(0x20);

SS=1;

delayms(50); //上电后要延时一段时间(约为25MS)后才能发送指令,这里给它50 MS

}

//发送掉电指令并延时50ms

void isd_pd(void)

{

delay(10);

spi_send(0x01);

SS=1;

delayms(50);

}

//发送rec指令,录音

void isd_rec(void)

{

LED=0;

spi_send(0xb0);

SS=1 ;

}

//发送setrec指令

void isd_setrec(unsigned char adl,unsigned char adh)

{

delayms(1);

spi_send(adl);//发送放音起始地址低位 4 delay(2);

spi_send(adh);// 发送放音起始地址高位

delay(2);

spi_send(0xa0);

SS=1;

}

//该函数录三段录音,每段录音约为20S

void luyin()

{

unsigned char i;

delayms(200);

P2=0x00; //LED提示录音开始

isd_setrec(0x00,0x00);//发送0x000h地址的setplay指令,左边的为低地址,右边的为高地址,一个地址约有200MS的时间

isd_rec();

i=6; //i为设定的录音时间,单位为秒,可更改

while(i--)

{

delayms(1000);

}

isd_stop();//放音完毕,发送stop指令

P2=0xf0; //LED提示录音结束

}

void main()

{

P0=0xff;

P1=0xff;

P2=0xff;

P3=0XFF;//初始化

delayms(200);

isd_pu();//AN键按下ISD上电并延时50ms

isd_pd();

isd_pu();

while(1)

{

if(BF_3==0)

{

delayms(200);

if(BF_3==0)

luyin(); //录音 5 }

}

}

播放程序:

#include

#include

#define uchar unsigned char

#define uint unsigned int

//录放音用一下三个I/O口即可

sbit SS=P1^0;

sbit SCLK=P1^1; //LOW IS ACTIVELY

sbit MOSI=P1^2;

sbit BF_1=P3^5; //执行

sbit BF_2=P3^6; //复位

sbit BF_3=P3^7; //PR=1录音,pr=0放音

sbit LED=P2^0; //亮正在录音

sbit LED1=P2^2; //闪一下进入录音

sbit LED2=P2^4; // 闪一下复位

sbit LED3=P2^6; //LED3亮放音

void delayus(unsigned int time)//延时几微 秒

{

while(time!=0)

{

time--;

}

}

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

{

uchar j;

while(time--)

{

for(j = 0; j < 120; j++);

}

}

6 //串行发送子程序,8位数据

void spi_send(unsigned char isdx)

{

unsigned char isx_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;

delayus(2);

SCLK=0;

delayus(2);

}

}

//发送stop指令

void isd_stop(void)

{

delayus(10);

spi_send(0x30);

SS=1; //两条指令之间为高电平,故所有指令之后都要将SS拉高

delayms(50);

LED2=0;

delayms(1000);

LED2=1;

}

//发送上电指令并延时50毫秒,上电后要延时一段时间(约为25MS)后才能发送指令

void isd_pu(void)

{

delayus(10);

SS=0;

spi_send(0x20);

SS=1;

delayms(50); //上电后要延时一段时间(约为25MS)后才能发送指令,这里给它50 MS

} 7

//发送掉电指令并延时50ms

void isd_pd(void)

{

delayus(10);

spi_send(0x01);

SS=1;

delayms(50);

}

//发送play指令,播放

void isd_play(void)

{

LED3=0;

spi_send(0xf0);

SS=1;

}

//发送setplay指令

void isd_setplay(unsigned char adl,unsigned char adh)

{

delayms(1);

spi_send(adl);//发送放音起始地址地位

delayus(2);

//adh=adh|0xe0;

spi_send(adh);// 发送放音起始地址高位

delayus(2);

spi_send(0xe0);

SS=1;

}

void bofan(unsigned char mun)

{

unsigned char i;

switch(mun)

{

case 1:

P2=0xf0; //LED提示放音开始

isd_setplay(0x00,0x00);//发送setplay指令,从0x0000地址开始放音

isd_play(); //发送放音指令

/* i=5; //i为放音时间,单位为秒,可更改