ISD4002做的录音放音模块
时间:10-02
整理:3721RD
点击:
放音是声音总是有很大的回声,不清晰,喇叭总是嘟嘟声,每次都需要把芯片拔下重插上去才能放音,到底程序哪里出了问题?
#include <reg51.h>#define uint unsigned int#define uchar unsigned charsbit ISD_SS = P1^0; //ISD4002片选sbit ISD_SCLK = P1^1; //ISD4002时钟sbit ISD_MOSI = P1^2; //ISD4002数据输入sbit ISD_MISO = P1^3; //ISD4002数据输出sbit ISD_INT = P2^2; //ISD4002溢出或放音结束中断sbit RecKey = P0^0;//录音按键sbit PlayKey = P0^4;//放音按键sbit RecLed = P2^0;//录音指示灯sbit PlayLed = P2^1;//放音指示//************** 函数声明 **********************void ISD_WRITE(uchar isdx); //SPI串行发送一个字节子程序void ISD_STOP(void); //发送stop指令程序void ISD_PU(void); //发送上电指令程序void ISD_PD(void); //发送省电指令程序void ISD_PLAY(void); //发送play指令程序void ISD_REC(void); //发送rec指令程序void ISD_SETPLAY(uchar adl,uchar adh); //发送setplay指令程序void ISD_SETREC(uchar adl,uchar adh); //发送setrec指令程序uchar READ_ISD_OVF(void); //读溢出标志OVF程void DELAY(uint n); //延迟n微秒void DELAYms(uint n); //延迟n毫秒//************************************************************************//主程序//功能:1.录音时,按住RUN键,LED点亮开始录音,松开RUN即可停止录音// 再次按下RUN键,LED点亮开始录第二段音,依次类推,直到芯片溢出。// 按stop键芯片复位// 2.放音时,按一下RUN键,即播放一段语音。 按stop键芯片复位。//************************************************************************void main(void){ P0=P1=P2=P3=0xff; //初始化 while(1) { if (RecKey==0) //录音键被按下 { ISD_PU(); //ISD上电并延迟50ms ISD_PD(); //停止本次操作并进入省电状态 ISD_PU(); //SD上电并延迟50ms DELAYms(500); //延迟 ISD_SETREC(0x00,0x00); //发送0x0000h地址的setplay指令 do { ISD_REC(); //发送rec指令 下一个地址开始录音 if (READ_ISD_OVF()==1) //检查芯片是否溢出 ,如溢出则停止放音,芯片复位 { ISD_PD(); //停止本次操作并进入省电状态 break; } RecLed = 0; //录音指示灯亮 }while(RecKey==0); RecLed=1; //按键释放,未满,录音完毕,LED熄灭 ISD_STOP(); //发送停止命令 } else if ( PlayKey == 0 ) //如果放音键被按下则转入放音部分 { ISD_PU(); //ISD上电并延迟50ms ISD_PD(); //停止本次操作并进入省电状态 ISD_PU(); //SD上电并延迟50ms ISD_SETPLAY(0x00,0x00); //发送setplay指令,从0x0000地址开始放音 do { ISD_PLAY(); //发送放音指令 DELAY(20); if (READ_ISD_OVF()==1) //检查芯片是否溢出 ,如溢出则停止放音,芯片复位 { ISD_PD(); //停止本次操作并进入省电状态 break; } PlayLed = 0; //放音指示灯亮 }while(PlayKey==0); PlayLed = 1; //按键释放,放音音完毕,LED熄灭 ISD_STOP(); //发送stop指令 } }}//************************************//ISD4002 SPI串行发送一个字节子程序,8位数据//************************************void ISD_WRITE(uchar isdx) //SPI串行发送一个字节子程序{ uchar i; ISD_SS=0; //片选使能,打开SPI通信端 ISD_SCLK=0; //时钟置0 for(i=0;i<8;i++) //8位依次发送 { if ((isdx&0x01)==1) //取最低位,为1则数据线置1 { ISD_MOSI=1; } else //为0则数据线置0 { ISD_MOSI=0; } isdx=isdx>>1; //先发低位再发高位,依次发送 ISD_SCLK=1; //时钟产生上升沿 锁存输入的数据 DELAY(2); //延时使数据稳定 ISD_SCLK=0; //回复时钟低电平 DELAY(2); }}//*******************************//发送stop指令//*******************************void ISD_STOP(void) //发送stop指令程序{ DELAY(10); ISD_WRITE(0x30); //停止录音或放音操作,指令代码0X11 0 ISD_SS=1; DELAYms(50);}//*******************************//发送上电指令,并延迟50ms//*******************************void ISD_PU(void) //发送上电指令程序{ DELAY(10); ISD_SS=0; ISD_WRITE(0x20); //器件上电,指令代码0010 0 ISD_SS=1; DELAYms(50);}//*******************************//发送省电指令,并延迟50ms//*******************************void ISD_PD(void) //发送省电指令程序{ DELAY(10); ISD_WRITE(0x10); //停止本次操作并进入省电状态,指令代码0X01 X ISD_SS=1; DELAYms(50);}//*******************************//发送play指令//*******************************void ISD_PLAY(void) //发送play指令程序{ ISD_WRITE(0xf0); //在下一个地址开始放音,指令代码1111 1/0 ISD_SS=1;}//*******************************//发送rec指令//*******************************void ISD_REC(void) //发送rec指令程序{ ISD_WRITE(0xb0); //从下一个地址开始录音 ISD_SS=1;}//*******************************//发送setplay指令//*******************************void ISD_SETPLAY(uchar adl,uchar adh) //发送setplay指令程序{ ISD_WRITE(adl); //发送放音起始地址低位 adh=adh||0xe0; //从地址<A9~A0>开始放音 ISD_WRITE(adh); //发送放音起始地址高位 ISD_SS=1;}//*******************************//发送setrec指令//*******************************void ISD_SETREC(uchar adl,uchar adh) //发送setrec指令程序{ ISD_WRITE(adl); //发送录音起始地址低位 adh=adh||0xa0; //从地址<A9~A0>开始录音 ISD_WRITE(adh); //发送录音起始地址高位 ISD_SS=1;}//************************************//检查芯片是否溢出(读OVF,并返回OVF值)//************************************uchar READ_ISD_OVF(void) //读溢出标志OVF程序{ ISD_SS=0; //片选有效 DELAY(2); ISD_SCLK=0; //先产生时钟上升沿 DELAY(2); ISD_SCLK=1; ISD_SCLK=0; //时钟信号下降沿时输出数据 DELAY(2); if (ISD_MISO==1) //只读第1位数据 { ISD_SS =1; //关闭SPI通信端 ISD_STOP(); //发送stop指令 return 1; //OVF为1,返回1 } else { ISD_SS =1; //关闭SPI通信端 ISD_STOP(); //发送stop指令 return 0; //OVF为0,返回0 }}void DELAY(uint n) //延迟n微秒{ while(n!=0) { n--; }}void DELAYms(uint n) //延迟n毫秒{ TMOD=0x01; //T0 16位定时 while(n!=0) { TH0=0xfc; //12MHZ晶振时 定时1ms TL0=0x18; TR0=1; while(TF0!=1) {;} TF0=0; TR0=0; n--; }}
#include <reg51.h>#define uint unsigned int#define uchar unsigned charsbit ISD_SS = P1^0; //ISD4002片选sbit ISD_SCLK = P1^1; //ISD4002时钟sbit ISD_MOSI = P1^2; //ISD4002数据输入sbit ISD_MISO = P1^3; //ISD4002数据输出sbit ISD_INT = P2^2; //ISD4002溢出或放音结束中断sbit RecKey = P0^0;//录音按键sbit PlayKey = P0^4;//放音按键sbit RecLed = P2^0;//录音指示灯sbit PlayLed = P2^1;//放音指示//************** 函数声明 **********************void ISD_WRITE(uchar isdx); //SPI串行发送一个字节子程序void ISD_STOP(void); //发送stop指令程序void ISD_PU(void); //发送上电指令程序void ISD_PD(void); //发送省电指令程序void ISD_PLAY(void); //发送play指令程序void ISD_REC(void); //发送rec指令程序void ISD_SETPLAY(uchar adl,uchar adh); //发送setplay指令程序void ISD_SETREC(uchar adl,uchar adh); //发送setrec指令程序uchar READ_ISD_OVF(void); //读溢出标志OVF程void DELAY(uint n); //延迟n微秒void DELAYms(uint n); //延迟n毫秒//************************************************************************//主程序//功能:1.录音时,按住RUN键,LED点亮开始录音,松开RUN即可停止录音// 再次按下RUN键,LED点亮开始录第二段音,依次类推,直到芯片溢出。// 按stop键芯片复位// 2.放音时,按一下RUN键,即播放一段语音。 按stop键芯片复位。//************************************************************************void main(void){ P0=P1=P2=P3=0xff; //初始化 while(1) { if (RecKey==0) //录音键被按下 { ISD_PU(); //ISD上电并延迟50ms ISD_PD(); //停止本次操作并进入省电状态 ISD_PU(); //SD上电并延迟50ms DELAYms(500); //延迟 ISD_SETREC(0x00,0x00); //发送0x0000h地址的setplay指令 do { ISD_REC(); //发送rec指令 下一个地址开始录音 if (READ_ISD_OVF()==1) //检查芯片是否溢出 ,如溢出则停止放音,芯片复位 { ISD_PD(); //停止本次操作并进入省电状态 break; } RecLed = 0; //录音指示灯亮 }while(RecKey==0); RecLed=1; //按键释放,未满,录音完毕,LED熄灭 ISD_STOP(); //发送停止命令 } else if ( PlayKey == 0 ) //如果放音键被按下则转入放音部分 { ISD_PU(); //ISD上电并延迟50ms ISD_PD(); //停止本次操作并进入省电状态 ISD_PU(); //SD上电并延迟50ms ISD_SETPLAY(0x00,0x00); //发送setplay指令,从0x0000地址开始放音 do { ISD_PLAY(); //发送放音指令 DELAY(20); if (READ_ISD_OVF()==1) //检查芯片是否溢出 ,如溢出则停止放音,芯片复位 { ISD_PD(); //停止本次操作并进入省电状态 break; } PlayLed = 0; //放音指示灯亮 }while(PlayKey==0); PlayLed = 1; //按键释放,放音音完毕,LED熄灭 ISD_STOP(); //发送stop指令 } }}//************************************//ISD4002 SPI串行发送一个字节子程序,8位数据//************************************void ISD_WRITE(uchar isdx) //SPI串行发送一个字节子程序{ uchar i; ISD_SS=0; //片选使能,打开SPI通信端 ISD_SCLK=0; //时钟置0 for(i=0;i<8;i++) //8位依次发送 { if ((isdx&0x01)==1) //取最低位,为1则数据线置1 { ISD_MOSI=1; } else //为0则数据线置0 { ISD_MOSI=0; } isdx=isdx>>1; //先发低位再发高位,依次发送 ISD_SCLK=1; //时钟产生上升沿 锁存输入的数据 DELAY(2); //延时使数据稳定 ISD_SCLK=0; //回复时钟低电平 DELAY(2); }}//*******************************//发送stop指令//*******************************void ISD_STOP(void) //发送stop指令程序{ DELAY(10); ISD_WRITE(0x30); //停止录音或放音操作,指令代码0X11 0 ISD_SS=1; DELAYms(50);}//*******************************//发送上电指令,并延迟50ms//*******************************void ISD_PU(void) //发送上电指令程序{ DELAY(10); ISD_SS=0; ISD_WRITE(0x20); //器件上电,指令代码0010 0 ISD_SS=1; DELAYms(50);}//*******************************//发送省电指令,并延迟50ms//*******************************void ISD_PD(void) //发送省电指令程序{ DELAY(10); ISD_WRITE(0x10); //停止本次操作并进入省电状态,指令代码0X01 X ISD_SS=1; DELAYms(50);}//*******************************//发送play指令//*******************************void ISD_PLAY(void) //发送play指令程序{ ISD_WRITE(0xf0); //在下一个地址开始放音,指令代码1111 1/0 ISD_SS=1;}//*******************************//发送rec指令//*******************************void ISD_REC(void) //发送rec指令程序{ ISD_WRITE(0xb0); //从下一个地址开始录音 ISD_SS=1;}//*******************************//发送setplay指令//*******************************void ISD_SETPLAY(uchar adl,uchar adh) //发送setplay指令程序{ ISD_WRITE(adl); //发送放音起始地址低位 adh=adh||0xe0; //从地址<A9~A0>开始放音 ISD_WRITE(adh); //发送放音起始地址高位 ISD_SS=1;}//*******************************//发送setrec指令//*******************************void ISD_SETREC(uchar adl,uchar adh) //发送setrec指令程序{ ISD_WRITE(adl); //发送录音起始地址低位 adh=adh||0xa0; //从地址<A9~A0>开始录音 ISD_WRITE(adh); //发送录音起始地址高位 ISD_SS=1;}//************************************//检查芯片是否溢出(读OVF,并返回OVF值)//************************************uchar READ_ISD_OVF(void) //读溢出标志OVF程序{ ISD_SS=0; //片选有效 DELAY(2); ISD_SCLK=0; //先产生时钟上升沿 DELAY(2); ISD_SCLK=1; ISD_SCLK=0; //时钟信号下降沿时输出数据 DELAY(2); if (ISD_MISO==1) //只读第1位数据 { ISD_SS =1; //关闭SPI通信端 ISD_STOP(); //发送stop指令 return 1; //OVF为1,返回1 } else { ISD_SS =1; //关闭SPI通信端 ISD_STOP(); //发送stop指令 return 0; //OVF为0,返回0 }}void DELAY(uint n) //延迟n微秒{ while(n!=0) { n--; }}void DELAYms(uint n) //延迟n毫秒{ TMOD=0x01; //T0 16位定时 while(n!=0) { TH0=0xfc; //12MHZ晶振时 定时1ms TL0=0x18; TR0=1; while(TF0!=1) {;} TF0=0; TR0=0; n--; }}
能不能把程序发给我
liutongny1992@163.com
请问一下ISD4002音量可调节吗