||
1。两个按键:AN和STOP。
2。一个跳线选择开关P/R,选择放音/录音
3。录音状态下,按住AN键,LED灯亮起,开始录音。直到AN松开,或者芯片溢出(溢出后LED闪烁提示)
AN松开后生成一段,再次按下则开始录下一段,如此反复。按下STOP后,复位。
4。放音状态下,按下AN键,LED灯亮起,开始放音,知道该段结束,或到芯片末尾。
再次按下AN键后,放下一段,如此反复。按下STOP后,复位。
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit SS=P1^0;
sbit SCLK=P1^1;
sbit MOSI=P1^2;
sbit MISO=P1^3;
sbit LED=P2^0;
sbit ISD_INT=P3^2;
sbit AN=P1^6;
sbit STOP=P1^5;
sbit PR=P1^4;
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();
}
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();
}
}