#include <reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit SS=P2^3; //使能控制端
sbit SCLK=P2^2;
sbit MOSI=P2^0;
sbit MISO=P2^1;
sbit LED=P1^0;
sbit PR=P1^1;//錄放控制端,通過開關來調節,高電平為錄音狀態
sbit ISD_INT=P1^2;//溢出中斷
sbit AN=P2^4;
sbit STOP=P2^5;
void delay(uint time)
{
while(time!=0)
{
time--;
}
}
void delayms(uint time)
{
TMOD=0x01;
for(time;time>0;time--)
{
TH0=0xfc;
TL0=0x18;
TR0=1;
while(TF0!=1)
{;}
TF0=0;
TR0=0;
}
}
void spi_send(uchar isdx)
{
uchar isx_counter;
SS=0;
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);
}
}
void isd_stop(void)
{
delay(10);
spi_send(0x30);//停止錄放
SS=1;//語音芯片沒有被使能
delayms(50);
}
void isd_pu(void)
{
delay(10);
SS=0;//語音芯片被使能
spi_send(0x20);//語音芯片進入待命狀態
SS=1;
delayms(50);
}
void isd_pd(void)
{
delay(10);
spi_send(0x10);//芯片停止本次操作進入省電狀態
SS=1;
delayms(50);
}
void isd_play(void)
{
LED=0;
spi_send(0xf0);//在下一個地址開始放音
SS=1;
}
void isd_rec(void)
{
LED=0;
spi_send(0xb0);//在下一個地址開始錄音
SS=1;
}
void isd_setplay(uchar adl,uchar adh)
{
spi_send(adl);
adh=adh|0xe0;
spi_send(adh);
SS=1;
}
void isd_setrec(uchar adl,uchar adh)
{
spi_send(adl);
adh=adh|0xa0;
spi_send(adh);
SS=1;
}
void isd_overflow(void)
{
while(AN==0)
{
LED=1;
delayms(300);
LED=0;
delayms(300);
}
}
uchar chk_isdovf(void)
{
SS=0;
delay(2);
SCLK=0;
delay(2);
SCLK=1;
SCLK=0;
delay(2);
if(MISO==1)
{
SCLK=0;
SS=1;
isd_stop();
return 1;
}
else
{
SCLK=0;
SS=1;
isd_stop();
return 0;
}
}
void main()
{
uchar ovflog;
while(1)
{
P0=P1=P2=P3=0xff;
while(AN==1)
{
if(AN==0)
{
delayms(20);
}
}
isd_pu();
isd_pd();
isd_pu();
if(PR==1)
{
delayms(500);
isd_setrec(0x00,0x00);
do
{
isd_rec();
delay(20);
while(AN==0)
{
if(ISD_INT==0)//判斷中斷輸出(漏極開路輸出)。當存貯器溢出或放音結束標志出現時,該端為低電平并保持
isd_overflow();//當芯片溢出時LED閃爍
}
if(ISD_INT==0)
break;
LED=1;
isd_stop();
while(AN==1)
{
if(STOP==0)
break;
if(AN==0)
delayms(500);
}
}while(AN==0);
}
else
{
while(AN==0)
{;}
isd_setplay(0x00,0x00);
do
{
isd_play();
delay(20);
while(ISD_INT==1)
{;}
LED=1;
isd_stop();
if(ovflog=chk_isdovf())
break;
while(AN==1)
{
if(STOP==0)
delayms(20);
if(STOP==0)
break;
if(AN==0)
delayms(20);
}
LED=0;
}while(AN==0);
}
isd_stop();
isd_pd();
}
}