📄 8-isd4004.c
字号:
#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芯片驱动*/
/********************************50mS延时*********************************/
void YS50()
{
TMOD=1;
TH0=0x3C; //50mS延时初值置入
TL0=0xB0;
TR0=1;
while(!TF0);
TF0=0;
TR0=0;
}
/*ISD3300.4003 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(); //50mS延时
YS50(); //50mS延时
}
/*停止当前操作*/
void STOPP()
{
ISDX(30); //发 0X110XXX
SS=1; //关片选
YS50(); //50mS延时
YS50(); //50mS延时
}
/*停止当前操作掉电*/
void DSTOP()
{
ISDX(10); //发0X010XXXXXXXXXX
SS=1; //关片选
YS50(); //50mS延时
YS50(); //50mS延时
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -