有没有人用过ISD4002-120PY
时间:10-02
整理:3721RD
点击:
这个芯片无论录音还是放音都只有一声轻微的“啪”声,连噪音都没有,是不是坏的,求助
程序:
【isd4002驱动】
#include <reg51.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
sbit SS = P2^0; //ISD4000片选端
sbit SCLK = P2^2; //ISD4000时钟端
sbit MOSI = P2^1; //ISD4000数据输入
sbit MISO = P2^5; //ISD4000数据输出
sbit ISD_INT= P2^3; //中断
sbit LED = P0^0; //指示灯
/********以下是yus微秒延时函数********/
void delay(uint yus)
{
while(--yus !=0){_nop_();}
}
/********以下是xms毫秒延时函数********/
void Delay_ms(uint xms) //@22.1184MHz
{
while(xms-- != 0)
{
unsigned char i, j;
_nop_();
i = 4;
j = 146;
do
{
while (--j);
} while (--i);
}
}
/********以下是SPI串行发送函数********/
void spi_send(uchar isdx)
{
uchar isd_count;
SS=0; //ss=0,打开SPI通信端
SCLK=0;
for(isd_count=0;isd_count<8;isd_count++) //先发低位再发高位,依次发送
{
if ((isdx&0x01)==1)
MOSI=1;
else
MOSI=0;
isdx=isdx>>1;
SCLK=1;
delay(2);
SCLK=0;
delay(2);
}
}
/********以下是发送上电指令********/
void isd_powerup(void)
{
delay(10);
SS=0;
spi_send(0x20);
SS=1;
Delay_ms(50);
}
/********以下是发送掉电指令函数********/
void isd_poweroff(void)
{ delay(10);
spi_send(0x10);
SS=1;
Delay_ms(50);
}
/********以下是发送play(播放)指令函数********/
void isd_play(void)
{
LED=0;
spi_send(0xf0);
SS=1;
}
/********以下是发送rec(录音)指令函数********/
void isd_rec(void)
{
LED=0;
spi_send(0xb0);
SS=1;
}
/********以下是发送stop(停止)指令函数********/
void isd_stop(void)
{
delay(10);
spi_send(0x30);
SS=1;
Delay_ms(50);
}
/********以下是发送setplay(放音起始地址)指令函数********/
void isd_setplay(uchar adl,uchar adh)
{
spi_send(adl); //发送起始地址低位
adh=adh|0xe0;
spi_send(adh); //发送起始地址高位
SS=1;
}
/********以下是发送setrec(录音起始地址)指令函数********/
void isd_setrec(uchar adl,uchar adh)
{
spi_send(adl); //发送起始地址低位
adh=adh|0xa0;
spi_send(adh); //发送起始地址高位
SS=1;
}
/********以下是检查芯片是否溢出函数(读OVF,并返回OVF值)********/
uchar check_ovf(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指令
return 1; //OVF为1,返回1
}
else
{
SCLK=0;
SS =1; //关闭spi通信端
isd_stop(); //发送stop指令
return 0; //OVF为0,返回0
}
}
【主程序】
#include <reg51.h>
#include "ISD4002_drive.h"
#define uchar unsigned char
#define uint unsigned int
sbit K1 = P3^6; //K1键
sbit K2 = P3^7; //K2键
sbit PR = P3^2; //录放控制端,PR=1录音, PR=0放音
void flash(void)
{
LED=1;
Delay_ms(100);
LED=0;
Delay_ms(100);
}
/********以下是录音函数********/
void Record()
{
while(!K1);
isd_setrec(0x00,0x00); //发送0x0000h地址的setplay指令
isd_rec(); //发送rec指令
LED = 1;
Delay_ms(4000);
LED = 0; //录音完毕,LED熄灭
isd_stop(); //发送停止命令
}
/********以下是放音函数********/
void Play()
{
while(K1==0){;}
isd_setplay(0x00,0x00); //发送setplay指令,从0x0000地址开始放音
isd_play(); //发送放音指令
LED = 1;
delay(20);
while(ISD_INT==1) //等待放音完毕的EOM中断信号
{flash();}
LED=0;
isd_stop(); //放音完毕,发送stop指令
}
/********以下是主函数********/
void main(void)
{
while(1)
{
if(K1 == 0)
{
Delay_ms(50);
if(K1 == 0)
{
isd_powerup(); //K1键按下,ISD上电
isd_poweroff(); //掉电
isd_powerup(); //上电
if(PR == 0) Record();
else Play();
}
}
}
}
程序:
【isd4002驱动】
#include <reg51.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
sbit SS = P2^0; //ISD4000片选端
sbit SCLK = P2^2; //ISD4000时钟端
sbit MOSI = P2^1; //ISD4000数据输入
sbit MISO = P2^5; //ISD4000数据输出
sbit ISD_INT= P2^3; //中断
sbit LED = P0^0; //指示灯
/********以下是yus微秒延时函数********/
void delay(uint yus)
{
while(--yus !=0){_nop_();}
}
/********以下是xms毫秒延时函数********/
void Delay_ms(uint xms) //@22.1184MHz
{
while(xms-- != 0)
{
unsigned char i, j;
_nop_();
i = 4;
j = 146;
do
{
while (--j);
} while (--i);
}
}
/********以下是SPI串行发送函数********/
void spi_send(uchar isdx)
{
uchar isd_count;
SS=0; //ss=0,打开SPI通信端
SCLK=0;
for(isd_count=0;isd_count<8;isd_count++) //先发低位再发高位,依次发送
{
if ((isdx&0x01)==1)
MOSI=1;
else
MOSI=0;
isdx=isdx>>1;
SCLK=1;
delay(2);
SCLK=0;
delay(2);
}
}
/********以下是发送上电指令********/
void isd_powerup(void)
{
delay(10);
SS=0;
spi_send(0x20);
SS=1;
Delay_ms(50);
}
/********以下是发送掉电指令函数********/
void isd_poweroff(void)
{ delay(10);
spi_send(0x10);
SS=1;
Delay_ms(50);
}
/********以下是发送play(播放)指令函数********/
void isd_play(void)
{
LED=0;
spi_send(0xf0);
SS=1;
}
/********以下是发送rec(录音)指令函数********/
void isd_rec(void)
{
LED=0;
spi_send(0xb0);
SS=1;
}
/********以下是发送stop(停止)指令函数********/
void isd_stop(void)
{
delay(10);
spi_send(0x30);
SS=1;
Delay_ms(50);
}
/********以下是发送setplay(放音起始地址)指令函数********/
void isd_setplay(uchar adl,uchar adh)
{
spi_send(adl); //发送起始地址低位
adh=adh|0xe0;
spi_send(adh); //发送起始地址高位
SS=1;
}
/********以下是发送setrec(录音起始地址)指令函数********/
void isd_setrec(uchar adl,uchar adh)
{
spi_send(adl); //发送起始地址低位
adh=adh|0xa0;
spi_send(adh); //发送起始地址高位
SS=1;
}
/********以下是检查芯片是否溢出函数(读OVF,并返回OVF值)********/
uchar check_ovf(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指令
return 1; //OVF为1,返回1
}
else
{
SCLK=0;
SS =1; //关闭spi通信端
isd_stop(); //发送stop指令
return 0; //OVF为0,返回0
}
}
【主程序】
#include <reg51.h>
#include "ISD4002_drive.h"
#define uchar unsigned char
#define uint unsigned int
sbit K1 = P3^6; //K1键
sbit K2 = P3^7; //K2键
sbit PR = P3^2; //录放控制端,PR=1录音, PR=0放音
void flash(void)
{
LED=1;
Delay_ms(100);
LED=0;
Delay_ms(100);
}
/********以下是录音函数********/
void Record()
{
while(!K1);
isd_setrec(0x00,0x00); //发送0x0000h地址的setplay指令
isd_rec(); //发送rec指令
LED = 1;
Delay_ms(4000);
LED = 0; //录音完毕,LED熄灭
isd_stop(); //发送停止命令
}
/********以下是放音函数********/
void Play()
{
while(K1==0){;}
isd_setplay(0x00,0x00); //发送setplay指令,从0x0000地址开始放音
isd_play(); //发送放音指令
LED = 1;
delay(20);
while(ISD_INT==1) //等待放音完毕的EOM中断信号
{flash();}
LED=0;
isd_stop(); //放音完毕,发送stop指令
}
/********以下是主函数********/
void main(void)
{
while(1)
{
if(K1 == 0)
{
Delay_ms(50);
if(K1 == 0)
{
isd_powerup(); //K1键按下,ISD上电
isd_poweroff(); //掉电
isd_powerup(); //上电
if(PR == 0) Record();
else Play();
}
}
}
}
?什么意思,没懂