/*定义放音命令,定义常量
#define ISDPOWERUP 0X20 //ISD4004上电
#define ISDSTOP 0X10 //ISD4004下电
#define OPERSTOP 0X30 //ISD4004停止当前操作
#define PLAYSET 0XE0 //ISD4004从指定地址开始放音
#define PLAYCUR 0XF0 //ISD4004从当前地址开始放音
#define RECSET 0XA0 //ISD4004从指定地址开始录音
#define RECCUR 0XB0 //ISD4004从当前地址开始录音*/
#include <reg52.h>
sbit SCLK=P2^0; //ISD4004时钟
sbit SS =P2^1; //片选
sbit MOSI=P2^2; //数据输入
sbit RAC =P3^5; //行地址时钟
sbit K1 =P0^0; //录音按键
sbit K2 =P0^1; //停止按键
sbit K3 =P0^2; //放第一段
sbit K4 =P0^3; //放第二段
sbit K5 =P0^4; //放第三段
sbit K6 =P0^5;
sbit LED =P1^1; //录音指示灯
sbit LED1=P1^2; //放音指示灯
sbit LED2=P1^3; //停止指示灯
unsigned int i=0;
unsigned int a=0,b=0;
unsigned char sta_sto_add[2400][2];
unsigned int stadd[20];
void JSK() //开计数器
{
TMOD=0x50;
TR1 =1;
}
void JSG() //关计数器
{
TR1=0;
}
void delay(unsigned int time) //延迟n微秒
{
while(time!=0)
{
time--;
}
}
void delayms(unsigned int time) //延迟n毫秒
{
TMOD=0x01;
for(time;time>0;time--)
{
TH0=0xfc;
TL0=0x18;
TR0=1;
while(TF0!=1)
{;}
TF0=0;
TR0=0;
}
}
void isd_send(unsigned char isdx)//spi串行发送子程序,8位数据
{
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);
}
}
void isd_stop()//stop指令(停止当前操作)
{
delay(10);
isd_send(0x30);
//isd_stopwrdn();
SS=1;
delayms(50);
}
void isd_powerup()//发送上电指令
{
delay(10);
SS=0;
isd_send(0x20);
SS=1;
delayms(50);
}
/*void isd_stopwrdn()//发送掉电指令
{
delay(10);
isd_send(0x10);
SS=1;
delayms(50);
} */
void isd_play()//发送play指令
{
LED1=1;
LED =0;
LED2=0;
isd_send(0xf0);
SS=1;
}
void isd_rec()//发送rec指令
{
LED=1;
LED1=0;
LED2=0;
isd_send(0xb0);
SS=1;
}
void isd_setplay(unsigned char adl,unsigned char adh)//发送setplay指令
{
delayms(1);
isd_send(adl); //发送放音起始地址低位
delay(2);
isd_send(adh); //发送放音起始地址高位
delay(2);
isd_send(0xe0); //发送setplay指令字节
SS=1;
}
void isd_setrec(unsigned char adl,unsigned char adh)//发送setrec指令
{
delayms(1);
isd_send(adl); //发送放音起始地址低位
delay(2);
isd_send(adh); //发送放音起始地址高位
delay(2);
isd_send(0xa0); //发送setplay指令字节
SS=1;
}
void REC() //录音子程序
{
LED=1;//表示录音模式
LED1=0;
LED2=0;
isd_powerup(); //ISD上电并延迟50ms
isd_powerup();
delayms(500); //延迟500ms录音
if((TH1||TL1)==0)
isd_setrec(TL1,TH1);
else
isd_setrec(TL1+1,TH1); //发送setplay指令
JSK();
isd_rec(); //发送rec指令
}
void STOP()
{
LED2=1; //表示停止模式
LED1=0;
LED =0;
isd_stop(); //发送停止命令
JSG();
sta_sto_add[a][b]=TH1;
b++;
if(b>2)b=0;
sta_sto_add[a][b]=TL1;
a++;
if(a==2400)a=0;
}
void PLAY1()
{
LED1=1;//表示放音模式
LED =0;
LED2=0;
isd_powerup(); //,ISD上电并延迟50ms
isd_setplay(0x00,0x00); //发送setplay指令,从0x0000地址开始放音
isd_play(); //发送放音指令
}
void PLAY2()
{
LED1=1;//表示放音模式
LED =0;
LED2=0;
isd_powerup(); //,ISD上电并延迟50ms
isd_setplay(sta_sto_add[0][1]+1,sta_sto_add[0][0]); //发送setplay指令,从fh2,fl2地址开始放音
isd_play(); //发送放音指令
}
void PLAY3()
{
LED1=1;//表示放音模式
LED =0;
LED2=0;
isd_powerup(); //,ISD上电并延迟50ms
isd_setplay(sta_sto_add[1][1]+1,sta_sto_add[1][0]); //发送setplay指令,从fh2,fl2地址开始放音
isd_play(); //发送放音指令
}
void PLAY4()
{
LED1=1;//表示放音模式
LED =0;
LED2=0;
isd_powerup(); //,ISD上电并延迟50ms
isd_setplay(sta_sto_add[2][1]+1,sta_sto_add[2][0]); //发送setplay指令,从fh2,fl2地址开始放音
isd_play(); //发送放音指令
}
void init()
{
P0=0xFF;
P1=0x00;
LED=0;
LED1=0;
LED2=1;
TH1=0x00;
TL1=0x00;
TR1=0;
}
void main(void)
{
unsigned char k,k_temp;
init();
k=P0;
delayms(80);
if(k!=0xff)
{
delay(1000);
k_temp=P0;
if(k==k_temp)
{
while(1)
{
if(K1==0)
REC();
if(K2==0)
STOP();
if(K3==0)
PLAY1();
if(K4==0)
PLAY2();
if(K5==0)
PLAY3();
if(K6==0)
PLAY4();
}
}
}
}