本帖最后由 wongk2009 于 2012-6-4 22:52 编辑
ISD4003问题,电路图按如上接法,
编程也试过了,就是不能放音。
我也不知道究竟是录音没有录进去还是放音放不出来。
我用2个指示灯来显示录音和放音状态
2个指示灯显示能正常录音放音,放音完毕之后也能触发单片机中断。
可就是放不出音。
而硬件我按上图所接,电路经过我反复检验是没有接错的。
现在我也不知道到底是我软件问题还是原理图本来就有问题。
已经搞了2天2夜,实在头晕。
在此请教一下各位,有没有人用过这个芯片,看看是什么问题。
下面是我编写的程序:
功能只是按键录一段声音,按键放音。
#include<reg51.h>
#define uint unsigned int
#define uchar unsigned char
sbit ss=P1^0;//
sbit scl=P1^1;//
sbit mosi=P1^2;
sbit miso=P1^3;
sbit lu=P1^6;//录音按键
sbit led=P2^5; //录音指示灯
sbit fang=P3^0; //放音按键
sbit ISD_INT=P3^2;
sbit led1=P2^6; // 放音指示灯
void delayms(uint ms)
{
TMOD=0X01;
for(ms;ms>0;ms--)
{
TH0=0XFC;
TL0=0X18;
TR0=1;
while(TF0!=1)
{;}
TF0=0;
TR0=0;
}
}
void delayus(uint us)
{
while(us!=0)
us--;
}
void spi_send(uchar dat)
{
uint i;
ss=0;//
scl=0;
for(i=0;i<8;i++)
{
if(dat&0x01)
mosi=1;
else
mosi=0;
dat=dat>>1;
scl=1;
delayus(2);
scl=0;
delayus(2);
}
}
void isd_stop()
{
delayus(10);
spi_send(0x30);
ss=1;
delayms(50);
}
void isd_pu()//上电
{
delayus(10);
ss=0;
spi_send(0x20);
ss=1;
delayms(50);
}
void isd_pd() //掉电
{
delayus(10);
spi_send(0x10);
ss=1;
delayms(50);
}
void isd_play()
{
led1=0;
spi_send(0xf0);
ss=1;
}
void isd_rec() //当前地址开始录音指令
{
led=0;
spi_send(0xb0);
ss=1;
}
void isd_setplay(uchar adress_l,uchar address_h)
{
spi_send(adress_l);
address_h=address_h|0xe0;
spi_send(address_h);
ss=1;
}
void isd_setrec(uchar adress_l,uchar address_h)
{
spi_send(adress_l);
address_h=address_h|0xa0;
spi_send(address_h);
ss=1;
}
void isd_overflow() // 灯闪烁
{
while(lu==0)
{
led=1;
delayms(200);
led=0;
delayms(200);
}
}
bit check_isdovf()
{
ss=0;
delayus(2);
scl=0;
delayus(2);
scl=1;
scl=0;
delayus(2);
if(miso==1)
{
scl=0;
ss=1;
isd_stop();
return 1;
}
else
{
scl=0;
ss=1;
isd_stop();
return 0;
}
}
/****************************************************************************
按住lu键录音,led灯亮,松开lu 键led灭;按下fang键放音,led1灯亮,播放完led1灭;
******************************************************************************/
void main()
{
while(1)
{
P1=0XFF;
P2=0XFF;
P3=0XFF;
if(lu==0) //录音键按下
{
delayms(11);
if(lu==0)
{
isd_pu();//an键按下,isd上电并延时50ms
isd_pd();
isd_pu();
delayms(50);
isd_setrec(0x00,0x00);
while(lu==0)
{
isd_rec();
delayus(20);
if(ISD_INT==0)//如果芯片溢出,led闪烁
isd_overflow();
}
led=1;
isd_stop();
}
}
if(fang==0) //放音键按下
{
delayms(11);
if(fang==0)
{
while(!fang);
isd_pu();
isd_setplay(0x00,0x00);
isd_play();
delayus(20);
while(ISD_INT==1 )//等待放音完毕的EOM中断信号
{;}
isd_stop();
if(check_isdovf()) //检查芯片是否溢出,如溢出则停止放音
break;
led1=1;
}
}
isd_stop();
isd_pd();
}
}
I |