易妖游戏网
您的当前位置:首页ISD1700_spi

ISD1700_spi

来源:易妖游戏网
/*Isd1700 c52 单片机C语言示例程序

功能:1700芯片SPI工作模式下放音,录音,擦除等功能的编程示例*/

/******头文件*************/ #include

/**************宏定义***************/ #define uchar unsigned char

#define uint unsigned int

/*******ISD1700状态寄存器及各个标志位定义****/ unsigned char bdata SR0_L;//SR0寄存器 unsigned char bdata SR0_H;

unsigned char bdata SR1;//SR1寄存器 unsigned char APCL=0,APCH=0;

unsigned char PlayAddL=0,PlayAddH=0; unsigned char RecAddL=0,RecAddH=0; sbit CMD=SR0_L^0; sbit FULL=SR0_L^1; sbit PU=SR0_L^2; sbit EOM=SR0_L^3; sbit INTT=SR0_L^4; sbit RDY=SR1^0; sbit ERASE=SR1^1; sbit PLAY=SR1^2;

sbit REC=SR1^3;

/***************ISD1700指令函数声明**********/ unsigned char ISD_SendData(unsigned char dat); unsigned char ISD_Devid (void); void ISD_PU(void); void ISD_STOP(void); void ISD_Reset(void); void ISD_Clr_Int(void); void ISD_Rd_Status(void); void ISD_Rd_Playptr(void); void ISD_PD(void); void ISD_Rd_Recptr(void); void ISD_Play(void); void ISD_Rec(void); void ISD_Erase(void);

void ISD_G_Erase(void); void ISD_Rd_APC(void);

void ISD_WR_APC2(unsigned char apcdatl,apcdath);

void ISD_WR_NVCFG(unsigned char apcdatl,apcdath); void ISD_LD_NVCFG(void); void ISD_FWD(void);

void ISD_CHK_MEN(void); void ISD_EXTCLK(void);

void ISD_SET_PLAY(unsigned char Saddl,saddh,Eaddl,Eaddh); void ISD_SET_Rec(unsigned char Saddl,saddh,Eaddl,Eaddh);

void ISD_SET_Erase(unsigned char Saddl,saddh,Eaddl,Eaddh);

//***********************端口定义*****************************/// sbit SS=P1^0; sbit SCK=P1^1; sbit MOSI=P1^2; sbit MISO=P1^3; sbit LED=P0^7; sbit Key_AN=P3^2;

sbit Key_STOP=P3^3; sbit Switch_PR=P1^4;

////*标志位定义*******************//// uchar bdata flag;

sbit PR_flag=flag^1; sbit Erase_flag=flag^4; sbit Stop_flag=flag^7;

////////*其它函数声明************// void Cpu_Init(void);

void ISD_Init(void); void ISDWORK(void); void delay(unsigned int t);

/***************主函数*********************/ void main(void) {

uchar i; Cpu_Init(); delay(1); ISD_Init(); while(1) {

if(Key_AN==0) {

delay(10);

if(Key_AN==0) {

}

}

}

}

if(Switch_PR==1) PR_flag=1; else PR_flag=0; ISDWORK();

if(Key_STOP==0) { }

delay(20); if(Key_STOP==0) { }

for(i=100;i>0;i--) {

if(Key_STOP==1) { }

flag=0x80; ISDWORK(); ISD_Init(); break;

delay(30); }

if(flag==0x80) {

flag=00; continue;

}

Erase_flag=1; ISDWORK();

/************************函数原型:void IniCpuIO()

功能:CPU及系统变量初始化***********/// void Cpu_Init(void) {

P0=P1=P2=P3=0xff; TMOD=0x01; EA=0; flag=0; LED=1;

}

/****************函数原型:void ISD_Init(void);

功能:系统初始化。************/ void ISD_Init(void) {

uchar i=2; SS=1; SCK=1; MOSI=0; do {

ISD_PU(); delay(50);

ISD_Rd_Status(); }while(CMD||(!PU)); ISD_WR_APC2(0x40,0x04); do { }

ISD_Rd_Status(); while(RDY==0);

do { LED=0; delay(300);

LED=1; delay(300);

i--; } while(i>0); }

/**************函数原型:void ISDWORK(void)

功能:对ISD1700进行的相关操作*******/ void ISDWORK(void) {

uchar i; switch(flag) {

case 0x00: do {

ISD_Rd_Status(); } while(RDY==0); delay(10); ISD_Play();

delay(2);

LED=0; do { ISD_Rd_Status();

if(Key_STOP==0) {

delay(20);

if(Key_STOP==0) { }

ISD_Clr_Int(); ISD_STOP(); return;

}

} while(PLAY==1); LED=1;

ISD_Clr_Int(); do {

ISD_Rd_Status(); } while(RDY==0); delay(10); ISD_FWD(); do {

ISD_Rd_Status();

} while(RDY==0); break; case 0x02: ISD_Clr_Int(); do {

ISD_Rd_Status();

} while(RDY==0); LED=0; ISD_Rec(); do {

ISD_Rd_Status(); if(FULL==1) {

for(i=3;i>0;i--)

{

}

}

LED=0; delay(300); LED=1; delay(200);

}while(Key_AN==0); ISD_Clr_Int(); ISD_STOP(); LED=1; break; case 0x10: do {

ISD_Rd_Status();

}while(RDY==0); delay(2);

ISD_G_Erase(); do {

ISD_Rd_Status(); }while(RDY==0); for(i=3;i>0;i--) { }

LED=0; delay(300); LED=1; delay(200);

break; case 0x80: ISD_Clr_Int(); ISD_STOP(); ISD_Reset(); ISD_PD(); break;

} }

/**************函数原型:unsigned char ISD_SendData(unsigned char dat);

功能:向CPU发送&读回数据******/

unsigned char ISD_SendData(unsigned char dat) {

unsigned char i,j,BUF_ISD=dat; SCK=1; SS=0;

for(j=4;j>0;j--) {;}

for(i=0;i<8;i++) { }

SCK=0;

for(j=2;j>0;j--) {;}

if(BUF_ISD&0x01) MOSI=1; else

MOSI=0; BUF_ISD>>=1; if(MISO) BUF_ISD|=0x80; SCK=1;

for(j=6;j>0;j--) {;}

MOSI=0; return(BUF_ISD); }

/************函数原型:void ISD_STOP(void); 功能:停止当前操作**********/ void ISD_STOP(void) { ISD_SendData(0x02);

ISD_SendData(0x00); SS=1;

}

/***********函数原型:void ISD_Reset(void);发送指令后需要延迟50ms 功能:ISD1700复位****************/ void ISD_Reset(void) { }

/*****************函数原型:void ISD_Clr_Int(void); 功能:清除中断标志**************/

ISD_SendData(0x03); ISD_SendData(0x00); SS=1;

void ISD_Clr_Int(void) { }

/******************函数原型:void ISD_Rd_Status(void) 功能:读取状态寄存器内容********/ void ISD_Rd_Status(void) {

unsigned char i; ISD_SendData(0x05); ISD_SendData(0x00); ISD_SendData(0x00); SS=1;

for(i=2;i>0;i--) {;}

SR0_L=ISD_SendData(0x05); SR1=ISD_SendData(0x00); ISD_SendData(0x04); ISD_SendData(0x00); SS=1;

SR0_H=ISD_SendData(0x00);

SS=1; }

/**************** *函数原型:void ISD_Rd_PlayPtr(void) 功能:读取放音指针**************/ void ISD_Rd_Playptr(void) {

unsigned char i;

ISD_SendData(0x06); ISD_SendData(0x00); ISD_SendData(0x00); ISD_SendData(0x00); SS=1; for(i=2;i>0;i--) {;}

SR0_L=ISD_SendData(0x06); SR0_H=ISD_SendData(0x00); PlayAddL=ISD_SendData(0x00); PlayAddH=ISD_SendData(0x00); SS=1;

}

/******************函数原型:void iSD_PD(void);发送指令后需要延时50ms

功能:下电************************/ void ISD_PD(void) {

ISD_SendData(0x07); ISD_SendData(0x00); }

/**************函数原型:void ISD_Rd_RecPtr(void); 功能:读取录音指针*****************/ void ISD_Rd_Recptr(void) {

unsigned char i;

ISD_SendData(0x08); ISD_SendData(0x00); ISD_SendData(0x00); ISD_SendData(0x00); SS=1;

for(i=2;i>0;i--) {;}

SR0_L=ISD_SendData(0x08); SR0_H=ISD_SendData(0x08); RecAddL=ISD_SendData(0x00); RecAddH=ISD_SendData(0x00); SS=1; SS=1;

}

/****************函数原型:unsigned char ISD_Devid(void); 功能:读取APC寄存器内容***********/ unsigned char ISD_Devid(void) {

unsigned char DeviceNO,i; ISD_SendData(0x09); ISD_SendData(0x00); ISD_SendData(0x00); SS=1; for(i=2;i>0;i--) {;}

ISD_SendData(0x09); ISD_SendData(0x00);

DeviceNO=ISD_SendData(0x00); SS=1;

return DeviceNO;

}

/*****************函数原型:void ISD_Rec(void);

功能:录音******************/

void ISD_Rec(void) { ISD_SendData(0x41); }

/******************函数原型:void ISD_ISD_Erase(void); 功能:擦除****************/ void ISD_Erase(void) {

ISD_SendData(0x42); ISD_SendData(0x00); ISD_SendData(0x00); SS=1;

SS=1; }

/*******************函数原型:void ISD_G_Erase(void); 功能:全体擦除************/ void ISD_G_Erase(void) {

ISD_SendData(0x43); ISD_SendData(0x00); SS=1; }

/**************函数原型:void ISD_RD_APC(void) 功能:读取APC寄存器内容***************/ void ISD_Rd_APC(void) {

unsigned char i;

ISD_SendData(0x44); ISD_SendData(0x00); ISD_SendData(0x00); ISD_SendData(0x00); SS=1;

for(i=2;i>0;i--) {;}

SR0_L=ISD_SendData(0x44); SR0_H=ISD_SendData(0x00); APCL=ISD_SendData(0x00); APCH=ISD_SendData(0x00);

SS=1;

}

/***************函数原型:void ISD_WR_APC2(unsigned char apcdatl,apcdath); 功能:设置APC2***********************/ void ISD_WR_APC2(unsigned char apcdatl,apcdath) { }

ISD_SendData(0x65); ISD_SendData(apcdatl); ISD_SendData(apcdath); SS=1;

/**********函数原型:void ISD_WR_NVCFG(unsigned char apcdatl,apcdath); 功能:将APC数据写入NVCFG寄存器中***********/ void ISD_WR_NVCFG(unsigned char apcdatl,apcdath) {

ISD_SendData(0x46); ISD_SendData(apcdatl); ISD_SendData(apcdath); SS=1;

}

/***********函数原型:void ISD_LD_NVCFG(void)

功能:将NVCFG数据载入APC寄存器中********/ void ISD_LD_NVCFG(void) {

ISD_SendData(0x47); ISD_SendData(0x00); SS=1;

}

/***********函数原型:void ISD_FWD(void)

功能:放音指针下跳一段,指向下一段语音的起始地址********/ void ISD_FWD(void) { }

ISD_SendData(0x48); ISD_SendData(0x00); SS=1;

/***********函数原型:void ISD_CHK_MEN(void) 功能:空间检查******/ void ISD_CHK_MEM(void) {

ISD_SendData(0x49);

ISD_SendData(0x00); SS=1; }

/***********函数原型:void ISD_EXTCLK(void) 功能:启用/关闭 外部时钟模式******/ void ISD_EXTCLK(void) {

ISD_SendData(0x4a); ISD_SendData(0x00); SS=1;

}

/***********函数原型:void ISD_SET_PLAY(unsigned char Saddl,Saddh,Eaddl,Eakkh); 功能:定点播放******/

void ISD_SET_PLAY(unsigned char Saddl,Saddh,Eaddl,Eaddh) { ISD_SendData(0x80);

ISD_SendData(0x00); ISD_SendData(Saddl); ISD_SendData(Saddh); ISD_SendData(Eaddl); ISD_SendData(Eaddh); ISD_SendData(0x00);

SS=1; }

/***********函数原型:void ISD_SET_Rec(unsigned char Saddl,Saddh,Eaddl,Eakkh); 功能:定点录音******/ {

void ISD_SET_Rec(unsigned char Saddl,Saddh,Eaddl,Eaddh) ISD_SendData(0x81); ISD_SendData(0x00); ISD_SendData(Saddl); ISD_SendData(Saddh); ISD_SendData(Eaddl); ISD_SendData(Eaddh); ISD_SendData(0x00); SS=1;

}

/***********函数原型:void ISD_SET_Erase(unsigned char Saddl,Saddh,Eaddl,Eakkh); 功能:定点录音******/ {

void ISD_SET_Erase(unsigned char Saddl,Saddh,Eaddl,Eaddh)

}

ISD_SendData(0x82); ISD_SendData(0x00); ISD_SendData(Saddl); ISD_SendData(Saddh); ISD_SendData(Eaddl); ISD_SendData(Eaddh); ISD_SendData(0x00); SS=1;

/***********函数原型:void delay(unsigned int t) 功能:ms级延时******/ void delay(unsigned int t) {

for(;t>0;t--) {

TH0=0xfc;

TL0=0x18; TR0=1; while(TR0!=1) {;} TF0=0; TR0=0;

} }

因篇幅问题不能全部显示,请点此查看更多更全内容