语音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为放音时间,单位为秒,可更改