📄 main3.c
字号:
#include <reg51.h>
sbit SS=P1^1; //片选
sbit SCLK=P1^0; //ISD4004时钟
sbit MOSI=P1^2; //数据输入
sbit MISO=P1^3; //数据输出
sbit LED=P1^7; //指示灯
sbit ISD_INT=P3^2; //中断
sbit AN=P3^7; //执行
sbit STOP=P3^6; //复位
sbit PR=P1^4;//PR=1 录音 PR=0放音
void delay(unsigned int time) //延时n微秒
{while(time!=0)
{time--;
}
}
void delayms(unsigned int time) //延时n毫秒
{TMOD=0x01;
for(time;time>0;time--)
{TH0=0xfc;
TL0=0x18;
TR0=1;
while(TF0!=1)
{;}
TF0=0;
TR0=0;
}
}
//************************************
//IS4004 spi串行发送子程序,8位数据
//************************************
void spi_send(unsigned char isdx)
{
unsigned char isx_counter;
SS=0;
SCLK=0;
for(isx_counter=0;isx_counter<8;isx_counter++)//先送低位,再送高位
{if((isdx&0x01)==1)
MOSI=1;
else
MOSI=0;
isdx=isdx>>1;
SCLK=1;
delay(2);
SCLK=0; //送数MOSI
delay(2);
}
}
//*****************************************
//发送stop指令
//*****************************************
void isd_stop(void)
{delay(10);
spi_send(0x30);
SS=1;
delayms(50);
}
//**************************************
//发送上电指令,并延时50ms
//**************************************
void isd_pu(void)
{delay(10);
SS=0;
spi_send(0x20);
SS=1;
delayms(50);
}
//**************************************
//发送掉电指令,并延时50ms
//**************************************
void isd_pd(void)
{delay(10);
spi_send(0x10);
SS=1;
delayms(50);
}
//***************************************
//发送play指令
//***************************************
void isd_play(void)
{LED=0;
spi_send(0xf0);
SS=1;
}
//***************************************
//发送rec指令
//***************************************
void isd_rec(void)
{LED=0;
spi_send(0xb0);
SS=1;
}
//*******************************************
//发送setplay指令
//*******************************************
void isd_setplay(unsigned char adl,unsigned char adh)
{delayms(1);
spi_send(adl);//发送放音起始地址低位
delay(2);
spi_send(adh); //发送放音起始地址高位
delay(2);
spi_send(0xe0);
SS=1;
}
//*******************************************
//发送setrec指令
//*******************************************
void isd_setrec(unsigned char adl,unsigned char adh)
{
delayms(1);
spi_send(adl);//发送录音起始地址低位
delay(2);
spi_send(adh); //发送录音起始地址高位
delay(2);
spi_send(0xa0);
SS=1;
}
//**********************************************
//芯片益出,LED闪烁提醒停止录音
//**********************************************
void isd_overflow(void)
{while(AN==0)
{LED=1;
delayms(300);
LED=0;
delayms(300);
}
}
//**********************************************
//检查芯片是否益出(读OVF,并返回OVF值)
//**********************************************
unsigned char chk_isdovf(void)
{SS=0;
delay(2);
SCLK=0;
delay(2);
SCLK=1;
SCLK=0;
delay(2);
if(MISO==1)
{SCLK=0;
SS=1;//关闭spi通信端
isd_stop();//发送stop指令
return 1; //OVF为1,返回1
}
else
{SCLK=0; //关闭spi通信端
SS=1;
isd_stop(); //发送stop指令
return 0;//OVF为0,返回0
}
}
void ledflash()
{LED=1;
delayms(600);
LED=0;
delayms(600);
LED=1;
delayms(600);
LED=0;
delayms(600);
LED=1;
delayms(600);
LED=0;
delayms(600);
LED=1;
delayms(600);
LED=0;
delayms(600);
}
RECORD()
{LED=0;
delay(10);
SS=0;
spi_send(0x20);
SS=1;
delayms(100);
SS=0;
spi_send(0x20);
SS=1;
delayms(100);
spi_send(0);//发送录音起始地址低位
spi_send(0); //发送录音起始地址高位
spi_send(0xa0);
spi_send(0xb0);
delayms(6600);
delayms(6600);
spi_send(0x30);
ledflash();
}
PLAY0000H()
{
LED=1;
delay(10);
SS=0;
spi_send(0x20);
SS=1;
delayms(50);
SS=0;
spi_send(0x20);
SS=1;
delayms(100);
spi_send(0);//发送录音起始地址低位
spi_send(0); //发送录音起始地址高位
spi_send(0xe0);
spi_send(0xf0);
delayms(6600);
delayms(6600);
spi_send(0x30);
spi_send(0x10);
LED=0;
}
main()
{ ledflash();
if(!AN) //按下KEY4实现录音操作
RECORD();
if(AN) //放开KEY4实现放音操作
{PLAY0000H(); //从0000H地址放音
LED=1;
delayms(100);
LED=0;
delayms(100);
}
while(1)
{;
}
}
/*
//**********************************************
//主程序
//功能:1.录音时,按住AN键,LED点亮开始录音,松开AN键即可停止录音
//再次按下AN键,LED点亮开始录音第二段,依次类推,直至芯片溢出
//按stop键芯片复位
//2.放音时,按下AN键,即可播放一段语音,按stop键芯片复位.
//***************************************************
void main(void)
{unsigned char ovflog;
while(1)
{P0=P1=P2=P3=0xff;//初始化
while(AN==1)//等待AN键按下
{if(AN==0) //按键防抖动
{delayms(20);}
}
isd_pu();//AN键按下,isd上电并延迟50ms
isd_pd();
isd_pu();
if(PR==1) //如果PR==1则转入录音部分
{delayms(200);//延时录音
isd_setrec(0x00,0x00);//发送0x0000h地址的setplay指令
do
{isd_rec();//发送rec指令
while(AN==0)//等待录音完毕
{if(ISD_INT==0) //如果芯片益出,进行LED闪烁指示
isd_overflow();//如果取消录音(松下AN键)则停止录音,芯片复位
}
if(ISD_INT==0)
break;
LED=1;//录音完毕,LED熄灭
isd_stop();//发送停止命令
while(AN==1) //如果AN再次按下,开始录制下一段语音
{if(STOP==0) //如果按下STOP按键,则芯片复位
break;
if(AN==0)
delayms(500);
}
}while(AN==0);
}
else //如果PR=0则转入放音部分
{
while(AN==0){;}
isd_setplay(0x00,0x00);//发送setplay指令,从0x0000地址开始录音
do
{isd_play();//发送放音指令
delay(20);
while(ISD_INT==1) //等待放音完毕的EOM中断信号
{;}
LED=1;
isd_stop();//放音完毕,发送stop指令
if(ovflog=chk_isdovf()) //检查芯片是否溢出,如溢出则停止放音,芯片复位
break;
while(AN==1) //等待AN键再次按下
{if(STOP==0)
break;
if(AN==0)
delayms(20);
}
}while(AN==0);//An键再次按下,播放下一段语音
}
isd_stop();
isd_pd();
}
}
*/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -