微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > ISD4002做的录音放音模块

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--;        }}

能不能把程序发给我

liutongny1992@163.com

请问一下ISD4002音量可调节吗

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top