📄 isd4004.txt
字号:
#include <reg51.h>
sbit SS = P1^0; //片选
sbit SCLK = P1^1; //ISD4004时钟
sbit MOSI = P1^2; //数据输入
sbit MISO = P1^3; //数据输出
sbit LED = P1^7; //指示灯
sbit AN = P1^6; //执行
sbit STOP = P1^5; //复位
sbit PR = P1^4; //PR = 1录音,PR = 0放音
sbit INT = P3^4; //中断
void YS50();
void ISDX( unsigned char d );
void UP();
void STOPP();
void DSTOP();
main()
{
unsigned char delay; //延时参数
unsigned char isdl,isdh; //ISD高、低位
unsigned char n1;
//单片机初始化
SP = 0x10;
P0 = 0xFF;
P1 = 0xFF;
P2 = 0xFF;
P3 = 0xFF;
EA = 0;
lab1:
LED = 1; //关指示灯
DSTOP(); //ISD掉电
delay = 200;
while( AN ); //等按AN键
while( delay-- ); //延时
UP(); //ISD上电
isdl = isdh = 0; //ISD高低位地址置0
if( PR ) //PR = 1录音
{
ISDX( isdl );
ISDX( isdl );
ISDX( isdh );
SS = 1;
b1:
n1 = 10;
while( n1-- )
{
YS50( );
}
LED = 0;
ISDX( 0xB0 );
SS = 1;
if( INT )
{
while( !AN );
n1 = 200;
while( n1-- );
LED = 1; //关指示灯
STOPP(); //停止当前操作
if( STOP )
{
while( !AN );
STOPP();
goto b1;
}
}
else
{
b2:
LED = 1;
n1 = 15;
while( !AN )
{
while( !n1-- )
{
YS50( );
}
LED = 0;
n1 = 15;
while( !AN )
{
while( !n1 )
{
YS50( );
}
goto b2;
}
}
}
}
else //PR = 0 放音
{
while( !AN );
ISDX( isdl );
ISDX( ( isdh | 0xE0 ) & 0xE7 );
SS = 1;
b3:
LED = 0;
ISDX( 0xF0 );
SS = 1;
if( STOP )
{
while( INT );
LED = 1;
STOPP( );
SS = 0;
SCLK = 0;
SCLK = 1;
if( !MISO )
{
SCLK = 0;
SS = 1;
STOPP( );
if( STOP)
{
while( !AN )
{
goto b3;
}
}
}
}
}
SCLK = 0;
SS = 1;
STOPP( );
goto lab1;
}
/* ISD4004 芯片驱动*/
/**********************************************50 ms 延时 **********************************************/
void YS50( )
{
TMOD = 1;
TH0 = 0x3C; //50ms延时初值置入
TL0 = 0xB0;
TR0 = 1;
while( !TF0 );
TF0 = 0;
TR0 = 0;
}
/* ISD4004 SPI 写入程序 */
void ISDX( unsigned char d)
{
unsigned char i,j;
SS = 0; //开片选
SCLK = 0; //时钟 SCLK = 0
j = d;
for( i = 0;i < 8;i++)
{
if( j & 0x01 ) //数据写 MOSI
{
MOSI = 1;
}
else
{
MOSI = 0;
}
SCLK = 1; //时钟 SCLK = 1
j = j >> 1;
SCLK = 0; //时钟 SCLK = 0
}
}
/* ISD 上电 */
void UP( )
{
ISDX( 20 ); //发 00100XXXXXXXXXXX
SS = 1; //关片选
YS50( ); //延时 50 ms
YS50( ); //延时 50 ms
}
void STOPP( )
{
ISDX( 30 ); //发 0X110XXX
SS = 1; //关片选
YS50( ); //延时 50 ms
YS50( ); //延时 50 ms
}
void DSTOP( )
{
ISDX( 10 ); //发 0X010XXXXXXXXXX
SS = 1; //关片选
YS50( ); //延时 50 ms
YS50( ); //延时 50 ms
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -