1、/* * ISD1700 89C51 单片机 C 语言示例程序 * * 中青世纪 w w w . atv o c. com * * 功能: 1700 芯片 SPI 工作模式下放音、录音、擦除等功能的编程示例 * * 硬件电 路:参考中青世纪 ISD1700-89c51 实 验开发板电路 * * http:/ * * 更多资 料请登陆中青世纪网站:w w w . atvo c. com * * 或来电 咨询:010-62101160 ,0 10- 62 10 69 45 * */ /* 头文件*/ #include “REG51.h“ /* 宏定义*/ #define uchar unsigne
2、d 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; / APC 寄存器 unsigned char PlayAddL=0,PlayAddH=0; / 放音指针 低位,高位 unsigned char RecAddL=0,RecAddH=0; / 录音指 针低位,高位 sbit
3、 CMD=SR0_L0; / SPI 指令错误标志位 sbit FULL=SR0_L1; / 芯片存储空 间满标志 sbit PU=SR0_L2; / 上电标志位 sbit EOM=SR0_L3; / EOM 标志 位 sbit INTT=SR0_L4; / 操作完成标 志位 sbit RDY=SR10; / 准备接收指 令标志位 sbit ERASE=SR11; / 擦除标志位 sbit PLAY=SR12; / 播放标志位 sbit REC=SR11; / 录音标志位 /* * ISD1700 SPI 指令函数声明 * */ unsigned char ISD_SendData(unsig
4、ned 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
5、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_MEM(void); void ISD_EXTCLK(void); void ISD_SET_PLAY (unsigned char Saddl,Saddh,Eaddl,Eaddh); void ISD
6、_SET_Rec (unsigned char Saddl,Saddh,Eaddl,Eaddh); void ISD_SET_Erase(unsigned char Saddl,Saddh,Eaddl,Eaddh); /* 端口定义*/ sbit SS=P10; sbit SCK=P11; sbit MOSI=P12; sbit MISO=P13; sbit LED= P17; sbit Key_AN= P16; sbit Key_STOP= P15; sbit Switch_PR=P14; /PLA Y=0;REC=1; /* 标志位定义*/ uchar bdata flag; sbit P
7、 R _f la g= f lag1 ; / / 放音/ 录音 标志位:0= 放音,1=录音 。 sbit Erase_flag=flag4; sbit Stop_flag=flag7; /* 其它函数声明*/ void Cpu_Init(void); / 系统初始化 void ISD_Init(void); / ISD1700 初始 化 void ISDWORK (void); void delay(unsigned int t); / ms 级延迟 /* 主函 数 */ void main(void) uchar i; Cp u_I nit( ) ; / / C P U 及系统变量初始化
8、delay(1); I S D _I nit( ) ; / / I S D 初始化 w hil e( 1) if (Key_AN=0) de la y ( 10) ; if ( K ey _A N =0) i f ( S w itch_P R =1) P R_f la g= 1; else P R _f la g= 0; I S D WO RK (); if ( K e y _S T O P =0) delay(20); if ( K ey _S T O P =0) for (i=100;i0;i-) if ( K ey _S T O P =1) f lag =0 x8 0; I S D W
9、O RK ( ) ; I S D _I ni t( ) ; br eak ; del ay ( 30) ; if ( f la g= 0x 80) f lag =0 0; c on ti nue ; Er ase_f lag =1; I S D WO RK ( ) ; /* * 函数原型: void IniCpuIO() 功能: C P U 及系统变量初始化 * */ void Cpu_Init(void) P0=P1=P2=P3=0xff; T M O D = 0 x 0 1 ; / / 定时器初始化 EA=0; / 关闭中断 f l a g = 0 ; / / 标 志位归 0 LED=1;
10、 /* * 函数原型: void ISD_Init(void); 功能: 系统初始化。 * */ void ISD_Init(void) uchar i=2; SS=1; S CK =1; MO S I =0; d o I S D _P U ( ) ; / 上电 delay(50); I S D _Rd _ S tatus ( ) ; / / 读取状态 while(CMD|(!PU); / if(CMD_Err=1)|(PU!=1) 则再次发送上电指令 ISD_WR_APC2(0x40,0x04); / 将 0x0440 ( 芯片出厂默认值,可根据需要更改数值) 写入 APC 寄存器 d o
11、I S D _Rd_ S tatus ( ) ; / / 等待 RDY 位置 1 while(RDY=0); doLED=0; delay(300); LED=1; delay(300); i-;while(i0); /* * 函数原 型: void ISDWORK (void) * 功 能: 对 ISD1700 进行的相 关操作 */ void ISDWORK (void) uchar i; switch (flag) c a s e 0 x 0 0 : / / 放音 d oI S D _Rd_ S tatus( ) ; w h ile( R D Y =0) ; de lay ( 10) ;
12、 I S D _P lay ( ) ; de lay ( 2) ; LED =0 ; d oI S D _Rd_ S tatus( ) ; if ( K ey _ S T O P =0) del ay ( 20) ; if ( K ey _S T O P =0) I S D _Clr _I nt( ) ; I S D _S T O P ( ) ; r et u r n; w h ile( P L A Y =1) ; L E D = 1; I S D _Clr _I nt( ) ; doI S D _ Rd_S tat us( ) ; w h ile( R D Y =0) ; del ay (
13、10) ; I S D _F W D ( ) ; doI S D _ Rd_S tat us( ) ; w h ile( R D Y =0) ; br eak ; c as e 0x 0 2: ISD_Clr_Int(); d oI S D _Rd_ S tatus( ) ; w h ile( R D Y =0) ; LED =0 ; I S D _Rec( ) ; doI S D _Rd _S tat us( ) ; if ( F U L L =1) for (i=3;i0;i-) LED =0; de lay ( 30 0) ; LED =1 ; de lay ( 20 0) ; w hi
14、l e( K ey _A N =0) ; I S D _Clr _I n t( ) ; I S D _S T O P ( ) ; L E D = 1; br eak ; cas e 0 x 10: do I S D _Rd _ S tatus ( ) ; w h ile( R D Y =0) ; de lay ( 2) ; I S D _G _Er ase( ) ; do I S D _Rd _ S tatus ( ) ; w h ile( R D Y =0) ; for (i=3;i0;i-) LED =0; de lay ( 30 0) ; LED =1 ; de lay ( 20 0)
15、; br ea k; cas e 0 x 80: I S D _Clr _I n t( ) ; I S D _S T O P ( ) ; I S D _Res e t( ) ; I S D _P D ( ) ; br eak ; /* * 函数原 型: unsigned char ISD_SendData(unsigned char dat); * 功 能: 向 CPU 发送 S CK =1 ; / / 初始条件 S S =0 ; / / 使能 ISD1700 的 SPI for(j=4;j0;j-) / 延迟 ; f or ( i= 0; i0;j-) / 延迟 ; if(BUF_ISD e
16、 ls e MO S I =0; BUF_ISD=1; / BUF_ISD 右移一位 if ( MI S O ) / / 逐个接收 MISO 端口的 数据。 将数据存在 BUF_ISD 的最高位 BU F _I S D |=0 x8 0; S CK =1 ; for(j=6;j0;j-) / 延迟 ; MO S I =0 ; return(BUF_ISD); / 返回接 收到的数据 /* * 函数原 型: void ISD_PU(void); 发送指 令后需要延迟 50ms * 功 能: 上电 */ void ISD_PU(void) ISD_SendData(0x01); / 发送 PU 命
17、令 ISD_SendData(0x00); S S =1; /* * 函数原 型: void ISD_STOP(void); * 功 能: 停止当前 操作 */ void ISD_STOP(void) ISD_SendData(0x02); / 发送 STOP 命令 ISD_SendData(0x00); S S =1; /* * 函数原 型: void ISD_Reset(void); 发送指 令后需要延迟 50ms * 功 能: ISD1700 复位 */ void ISD_Reset(void) I S D _S endD at a( 0x 03) ; / / 发送 RESET 命令 I
18、SD_SendData(0x00); S S =1; /* * 函数原 型: void ISD_Clr_Int()(void); * 功 能: 清除中断 标志 */ void ISD_Clr_Int(void) ISD_SendData(0x04); ISD_SendData(0x00); S S =1 ; /* * 函数原 型: void ISD_Rd_Status(void); * 功 能: 读取状态 寄存器内容 */ void ISD_Rd_Status(void) unsigned char i ; I S D _S en dD ata( 0 x0 5) ; / / 发送 ISD_Se
19、ndData(0x00); ISD_SendData(0x00); S S =1 ; for(i=2;i0;i-) /延迟 ; SR0_L=ISD_SendData(0x05); / 从 MISO 读出状态 SR0_H=ISD_SendData(0x00); SR1=ISD_SendData(0x00); S S =1 ; /* * 函数原 型: void ISD_Rd_PlayPtr(void); * 功 能: 读取放音 指针 */ void ISD_Rd_Playptr(void) unsigned char i; I S D _S en dD ata( 0 x0 6) ; / / 发送
20、ISD_SendData(0x00); ISD_SendData(0x00); ISD_SendData(0x00); S S =1 ; for(i=2;i0;i-) /延迟 ; SR0_L=ISD_SendData(0x06); / 从 MISO 读出状态 SR0_H=ISD_SendData(0x00); PlayAddL=ISD_SendData(0x00); / 读取放 音指针低 8 位 PlayAddH=ISD_SendData(0x00); / 读取放 音指针高 8 位 S S =1 ; /* * 函数原 型: void ISD_PD(void); 发送指 令后需要延迟 50ms
21、* 功 能: 下电 */ void ISD_PD(void) ISD_SendData(0x07); / 发送 PD 命令 ISD_SendData(0x00); S S =1; /* * 函数原 型: void ISD_Rd_RecPtr(void); * 功 能: 读取录音 指针 */ void ISD_Rd_Recptr(void) unsigned char i; I S D _S en dD ata( 0 x0 8) ; / / 发送 ISD_SendData(0x00); ISD_SendData(0x00); ISD_SendData(0x00); S S =1 ; for(i=
22、2;i0;i-) /延迟 ; SR0_L=ISD_SendData(0x08); / 从 MISO 读出状态 SR0_H=ISD_SendData(0x00); RecAddL=ISD_SendData(0x00); / 读取录 音指针低 8 位 RecAddH=ISD_SendData(0x00); / 读取录 音指针高 8 位 S S =1 ; /* * 函数原 型: unsigned char ISD_Devid (void); * 功 能: 读取 APC 寄存器内 容 */ unsigned char ISD_Devid (void) unsigned char DeviceNO,i;
23、 ISD_SendData(0x09); ISD_SendData(0x00); ISD_SendData(0x00); S S =1 ; for(i=2;i0;i-) /延迟 ; ISD_SendData(0x09); ISD_SendData(0x00); DeviceNO=ISD_SendData(0x00); S S =1 ; return DeviceNO; /* * 函数原 型: void ISD_Play()(void); * 功 能: 放音 */ void ISD_Play(void) ISD_SendData(0x40); / 发送放音 命令 ISD_SendData(0x0
24、0); S S =1; /* * 函数原 型: void ISD_Rec()(void); * 功 能: 录音 */ void ISD_Rec(void) ISD_SendData(0x41); / 发送录音 命令 ISD_SendData(0x00); S S =1; /* * 函数原 型: void ISD_Erase(void); * 功 能: 擦除 */ void ISD_Erase(void) ISD_SendData(0x42); / 发送擦除 指令 ISD_SendData(0x00); S S =1; /* * 函数原 型: void ISD_G_Erase(void); *
25、功 能: 全体擦除 */ void ISD_G_Erase(void) ISD_SendData(0x43); / 发送全体 擦除命令 ISD_SendData(0x00); S S =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); S S =1 ; for(i=2;i0;i-) /延
26、迟 ; SR0_L=ISD_SendData(0x44); SR0_H=ISD_SendData(0x00); APCL=ISD_SendData(0x00); APCH=ISD_SendData(0x00); S S =1 ; /* * 函数原 型: void ISD_WR_APC2(unsigned char apcdatl,apcdath); * 功 能: 设置 APC2 */ void ISD_WR_APC2(unsigned char apcdatl,apcdath) ISD_SendData(0x65); I S D _S en dD ata( a pc dat l ) ; / 发
27、送低 8 位数 据 I S D _S en dD ata( a pc dat h ) ; / 发送高 8 位数 据 S S =1 ; /* * 函数原 型: void ISD_WR_NVCFG(unsigned char apcdatl,apcdath); * 功 能: 将 APC 数据写入 NVCFG 寄存器中 */ void ISD_WR_NVCFG(unsigned char apcdatl,apcdath) ISD_SendData(0x46); I S D _S en dD ata( a pc dat l ) ; / 发送低 8 位数 据 I S D _S en dD ata( a
28、pc dat h ) ; / 发送高 8 位数 据 S S =1 ; /* * 函数原 型: void ISD_LD_NVCFG(void); * 功 能: 将 NVCFG 数据载入 APC 寄存器中 */ void ISD_LD_NVCFG(void) ISD_SendData(0x47); ISD_SendData(0x00); S S =1 ; /* * 函数原 型: void ISD_FWD(void); * 功 能: 放音指针 下跳一段,指向下一段语音的起始地址 */ void ISD_FWD(void) ISD_SendData(0x48); ISD_SendData(0x00);
29、 S S =1 ; /* * 函数原 型: void ISD_CHK_MEM()(void); * 功 能: 空间检查 */ void ISD_CHK_MEM(void) ISD_SendData(0x49); ISD_SendData(0x00); S S =1 ; /* * 函数原 型: void ISD_EXTCLK(void); * 功 能: 启用/关闭 外部时钟 模式 */ void ISD_EXTCLK(void) ISD_SendData(0x4a); ISD_SendData(0x00); S S =1 ; /* * 函数原 型: void ISD_SET_PLAY( unsi
30、gned char Saddl ,Saddh ,Eaddl ,Eaddh) * 功 能: 定点播放 * */ void ISD_SET_PLAY( unsigned char Saddl,Saddh,Eaddl,Eaddh) ISD_SendData(0x80); ISD_SendData(0x00); ISD_SendData(Saddl); / 开始 地址低 8 位 ISD_SendData(Saddh); / 开始 地址高 8 位 ISD_SendData(Eaddl); / 结束 地址低 8 位 ISD_SendData(Eaddh); / 结束 地址高 8 位 ISD_SendDat
31、a(0x00); SS=1; /* * 函数原 型: void ISD_SET_Rec( unsigned char Saddl ,Saddh ,Eaddl ,Eaddh) * 功 能: 定点录音 * */ void ISD_SET_Rec( unsigned char Saddl,Saddh,Eaddl,Eaddh) ISD_SendData(0x81); ISD_SendData(0x00); ISD_SendData(Saddl); / 开始 地址低 8 位 ISD_SendData(Saddh); / 开始 地址高 8 位 ISD_SendData(Eaddl); / 结束 地址低 8
32、 位 ISD_SendData(Eaddh); / 结束 地址高 8 位 ISD_SendData(0x00); SS=1; /* * 函数原 型: void ISD_SET_Erase( unsigned char Saddl ,Saddh ,Eaddl ,Eaddh) * 功 能: 定点录音 * */ void ISD_SET_Erase( unsigned char Saddl,Saddh,Eaddl,Eaddh) ISD_SendData(0x82); ISD_SendData(0x00); ISD_SendData(Saddl); / 开始 地址低 8 位 ISD_SendData(Saddh); / 开始 地址高 8 位 ISD_SendData(Eaddl); / 结束 地址低 8 位 ISD_SendData(Eaddh); / 结束 地址高 8 位 ISD_SendData(0x00); SS=1; /* * 函数原 型: void delay(unsigned int t) * 功 能: ms 级延 迟 */ void delay(unsigned int t) /ms 级延迟,12M 晶振 for(;t0;t-) T H 0