?? 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 + -