/************************************************************************
ISD1700 51单片机 C 语言程序
1700 芯片 SPI 工作模式下放音、录音、擦除等功能的编程示例
http://www.atvoc.com/cpsj/89C51-isd1700shiyanban.html
*************************************************************************/
//***********************头文件***************************//
#include "REG52.h"
//************************宏定义***************************//
#define uchar unsigned char
#define uint unsigned int
//**************ISD1700 状态寄存器及各个标志位定义*****************//
uchar bdata SR0_L; // SR0 寄存器
uchar bdata SR0_H;
uchar bdata SR1; // SR1 寄存器
uchar APCL=0,APCH=0; // APC 寄存器
uchar PlayAddL=0,PlayAddH=0; // 放音指针低位,高位
uchar RecAddL=0,RecAddH=0; // 录音指针低位,高位
sbit CMD=SR0_L^0; // SPI 指令错误标志位
sbit FULL=SR0_L^1; // 芯片存储空间满标志
sbit PU=SR0_L^2; // 上电标志位
sbit EOM=SR0_L^3; // EOM 标志位
sbit INTT=SR0_L^4; // 操作完成标志位
sbit RDY=SR1^0; // 准备接收指令标志位
sbit ERASE=SR1^1; // 擦除标志位
sbit PLAY=SR1^2; // 播放标志位
sbit REC=SR1^3; // 录音标志位
/**************************************************
ISD1700 SPI 指令函数声明
**************************************************/
uchar ISD_SendData(uchar dat);
void ISD_PU(void);
void ISD_STOP(void);
void ISD_Reset(void);
void ISD_Clr_Int(void);
void ISD_Rd_Status(void);
void ISD_PD(void);
void ISD_Play(void);
void ISD_Rec(void);
void ISD_G_Erase(void);
void ISD_FWD(void);
void ISD_WR_APC2(uchar apcdatl,apcdath);
void ISD_SET_PLAY (uchar Saddl,Saddh,Eaddl,Eaddh);
void ISD_SET_Rec (uchar Saddl,Saddh,Eaddl,Eaddh);
//**********************端口定义**************************//
sbit SS=P1^0;
sbit SCK=P1^1;
sbit MOSI=P1^2;
sbit MISO=P1^3;
sbit LED= P3^6;
sbit Key_AN= P2^7;
sbit Key_STOP=P2^6;
sbit Key_REC=P2^4;
sbit Ri=P2^3;
//********************标志位定义***************************//
uchar bdata flag;
sbit PR_flag=flag^1; //放音/录音标志位:0=放音,1=录音。
sbit Erase_flag=flag^4;
sbit Stop_flag=flag^7;
//********************其它函数声明**********************//
void Cpu_Init(void); //系统初始化
void ISD_Init(void); //ISD1700 初始化
void ISDWORK (void);
void delay(uint t); //ms级延迟
/*************************** 主函数 *****************************/
void main(void)
{
//uchar Sadd=0x10,Eadd=0x13;
Ri=0;
Cpu_Init();
delay(1);
ISD_Init(); //ISD初始化
while(1)
{
do{ISD_Rd_Status();}while(RDY==0);
delay(100);
/*if(Key_REC==0)
{
delay(10);
if(Key_REC==0)
{
ISD_SET_Rec(Sadd,0x00,Eadd,0x00);
ISD_Rec();
delay(2);
Sadd=Eadd+1;
Eadd=Eadd+4;
//LED=0;
}
}*/
ISD_SET_PLAY(0x10,0x00,0x30,0x00);
//delay(1000);
//ISD_SET_PLAY(0x1d,0x00,0x23,0x00);
//delay(1000);
//ISD_Play();
//while(Key_REC==0);
}
}
/******************************************************************************
函数原型: void InitCpuIO()
功能: CPU 及系统变量初始化
*******************************************************************************/
void Cpu_Init(void)
{
P0=P1=P2=P3=0xff; //单片机端口初始化
TMOD=0x01; // 定时器初始化,定时器0的方式1
EA=0; // 关闭中断
flag=0; // 标志位归 0
//LED=1;
}
/******************************************************************************
函数原型: void ISD_Init(void);
功能: ISD初始化
******************************************************************************/
void ISD_Init(void)
{
uchar i=2;
SS=1; //芯片初始化
SCK=1;
MOSI=0;
do
{
ISD_PU(); //上电
delay(50);
ISD_Rd_Status(); //读取状态
}
while(CMD||(!PU)); //if(CMD_Err==1)||(PU!=1))则再次发送上电指令
ISD_WR_APC2(0x40,0x04); //将 0x0440(芯片出厂默认值,可根据需要更改数值)写入APC寄存器
do
{
ISD_Rd_Status(); //等待 RDY 位置 1
}
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();
case 0x02:
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);
do{ISD_Rd_Status();}while(RDY==0);
delay(10);
ISD_FWD();
do{ISD_Rd_Status();}while(RDY==0);
break;
ISD_Clr_Int();
LED=1;
delay(200);
}
break;
case 0x80:
ISD_Clr_Int();
ISD_STOP();
ISD_Reset();
ISD_PD();
break;
}
}
/**************************************************************************
函数原型: uchar ISD_SendData(uchar dat);
功 能 : 向 CPU 发送&读回数据
**************************************************************************/
uchar ISD_SendData(uchar dat) //保证外部SS=1
{
uchar i,j,BUF_ISD=dat;
SCK=1; //初始条件
SS=0; //使能ISD1700的SPI
for(j=4;j>0;j--) {;} //延迟
for(i=0;i<8;i++) //发送&接收8位数据
{
SCK=0;
for(j=2;j>0;j--) {;} //延迟
if(BUF_ISD&0x01) MOSI=1; //将BUF_ISD中的最低位数据发送到MOSI端口
else MOSI=0;
BUF_ISD>>=1; //BUF_ISD右移一位
if(MISO) BUF_ISD|=0x80; //逐个接收MISO端口的数据,将数据存在BUF_ISD
SCK=1;
for(j=6;j>0;j--){;} //延迟
}
MOSI=0;
return(BUF_ISD); //返回接收到的数据
}
/**************************************************************************
函数原型: void ISD_PU(void);
功 能 : 上电 发送指令后需要延迟 50ms
**************************************************************************/
void ISD_PU(void) //发送PU命令
{
ISD_SendData(0x01);
ISD_SendData(0x00);
SS=1;
}
/**************************************************************************
函数原型: void ISD_STOP(void);
功 能 : 停止当前操作
**************************************************************************/
void ISD_STOP(void) //发送STOP命令
{
ISD_SendData(0x02);
ISD_SendData(0x00);
SS=1;
}
/**************************************************************************
函数原型: void ISD_Reset(void);
功 能: ISD1700 复位 发送指令后需要延迟 50ms
**************************************************************************/
void ISD_Reset(void) //发送RESET命令
{
ISD_SendData(0x03);
ISD_SendData(0x00);
SS=1;
}
/**************************************************************************
函数原型: void ISD_Clr_Int()(void);
功 能 : 清除中断标志
**************************************************************************/
void ISD_Clr_Int(void)
{
ISD_SendData(0x04);
ISD_SendData(0x00);
SS=1;
}
/**************************************************************************
函数原型: void ISD_FWD(void);
功 能
评论0