isd4004录音播放时错乱播放,可能是地址分配调用错误,可是我不懂改,求教

2019-07-16 15:46发布

//#include "stc15f2k60s2.h"
#include "reg51.h"
#include <intrins.h>


#define uchar unsigned  char
#define uint  unsigned  int

bit playbit,recbit;        //定义两个位变量,放音和录音位
uint playcout,reccout;         //放音和录音次数

////////定义放音命令,定义常量//////
#define ISDPOWERUP      0X20           //ISD4004上电
#define ISDSTOP         0X10           //ISD4004下电
#define OPERSTOP        0X30           //ISD4004停止当前操作
#define PLAYSET         0XE0           //ISD4004从指定地址开始放音
#define PLAYCUR         0XF0           //ISD4004从当前地址开始放音
#define RECSET          0XA0                 //ISD4004从指定地址开始录音
#define RECCUR          0XB0                   //ISD4004从当前地址开始录音

sbit   SS=P1^5;            //定义引脚
sbit   MOSI=P1^1;
sbit   MISO=P1^7;
sbit   SCLK=P1^4;

sbit key1=P0^0;     //时间
sbit key2=P0^1;     //温度湿度
sbit key3=P0^2;     //GPS
sbit key4=P0^3;      //录音


void delay(unsigned int i)  //延时程序
{
  while(i--);
}
void delayms(uchar ms)          
{                                               
        uchar j;
        while(ms--)
        {
                for(j = 0; j < 120; j++);
        }
}

/*
void stop()    //停止程序
{
    uchar y;
        SS=1;
        SS=0;          //ss=0时芯片才是有效的
        MOSI=0;        //放音
        SCLK=0;
        for(y=0;y<8;y++)
        {
                SCLK=0;
                if((0x30>>y)&0x01)  //停止当前操作指令地址0x30,从最低位读取数据
                   MOSI=1;
                else
                   MOSI=0;
                _nop_();
                _nop_();
                _nop_();
                SCLK=1;            //一个上升沿  时钟
                _nop_();
                _nop_();
                _nop_();
        }
        SS=1;
}
*/

//////////////////////////lu音部分子程序,地址由ADDR决定/////////////////////////
void luyin(addr)               
{         uint y;       
        SS=0;
        MOSI=0;         //发送开始
        SCLK=0;
        for(y=0;y<8;y++)
        {
                SCLK=0;
                if((0x20>>y)&0x01)
                       MOSI=1;
                else
                       MOSI=0;
                _nop_();
                _nop_();
                _nop_();
                SCLK=1;
                _nop_();
                _nop_();
                _nop_();
        }                      //发送结束
        SS=1;                  //上电结束
        delayms(50);

/*        SS=0;
        MOSI=0;                //发送开始
        SCLK=0;
        for(y=0;y<8;y++)
        {
                SCLK=0;
                if((0x20>>y)&0x01)        //应该是下电?
                         MOSI=1;
                else
                          MOSI=0;
                _nop_();
                _nop_();
                _nop_();
                SCLK=1;
                _nop_();
                _nop_();
                _nop_();
        }
        SS=1;//上电结束
        delayms(50);
        delayms(50);                  */
       
        SS=0;
        MOSI=0;              //发送地址
        SCLK=0;
        for(y=0;y<16;y++)
        {
                SCLK=0;
                if((addr>>y)&0x01)
                  MOSI=1;
                else
                  MOSI=0;
                _nop_();
                _nop_();
                _nop_();
                SCLK=1;
                _nop_();
                _nop_();
                _nop_();
        }                   //发送地址结束

        MOSI=0;
        SCLK=0;
        for(y=0;y<8;y++)           //从当前地址录音
        {
                SCLK=0;
                if((0xa0>>y)&0x01)
                    MOSI=1;
                else
                    MOSI=0;
                _nop_();
                _nop_();
                _nop_();
                SCLK=1;
                _nop_();
                _nop_();
                _nop_();
        }
        SS=1;

        SS=0;
        MOSI=0;
        SCLK=0;
        for(y=0;y<8;y++)            //从指定地址录音
        {
                SCLK=0;
                if((0xb0>>y)&0x01)
                     MOSI=1;
                else
                     MOSI=0;
                _nop_();
                _nop_();
                _nop_();
                SCLK=1;
                _nop_();
                _nop_();
                _nop_();
        }
        SS=1;          
}

////////////////放音部分子程序,放音地址由ADDR决定////
void fangyin(uint addr)
{         uint y;
        SS=0;
        MOSI=0;//发送开始
        SCLK=0;
        for(y=0;y<8;y++)
        {
                SCLK=0;
                if((0x20>>y)&0x01)MOSI=1;
                else MOSI=0;
                _nop_();
                _nop_();
                _nop_();
                SCLK=1;
                _nop_();
                _nop_();
                _nop_();
        }//发送结束
        SS=1;//上电结束
        delayms(50);
        SS=0;
        MOSI=0;//发送地址
        SCLK=0;
        for(y=0;y<16;y++)
        {
                SCLK=0;
                if((addr>>y)&0x01)MOSI=1;
                else MOSI=0;
                _nop_();
                _nop_();
                _nop_();
                SCLK=1;
                _nop_();
                _nop_();
                _nop_();
        }//发送地址结束
        MOSI=0;//放音
        SCLK=0;
        for(y=0;y<8;y++)
        {
                SCLK=0;
                if((0xe0>>y)&0x01)MOSI=1;
                else MOSI=0;
                _nop_();
                _nop_();
                _nop_();
                SCLK=1;
                _nop_();
                _nop_();
                _nop_();
        }
        SS=1;
        SS=0;
        MOSI=0;//放音
        SCLK=0;
        for(y=0;y<8;y++)
        {
                SCLK=0;
                if((0xf0>>y)&0x01)MOSI=1;
                else MOSI=0;
                _nop_();
                _nop_();
                _nop_();
                SCLK=1;
                _nop_();
                _nop_();
                _nop_();
        }
        SS=1;          }

////////////////////////////////
playsound()        ///录放音子函数

{


  if(recbit)                       
   {recbit=0;
    switch(reccout)
    {case 1:{luyin(0x00);}break;
     case 2:{luyin(0x100);}break;
     case 3:{luyin(0x200);}break;
     case 4:{luyin(0x300);}break;
     }
    }
}

void scankey4()
{
playsound();
}

void scankey3()
{
fangyin(0x100);
}

void scankey2()
{
fangyin(0x300);
}



void keyscan()
{
uchar value=0;
P0=0x0f;
value=P0&0x0f;
if(value!=0x0f)
{
if(key2==0)
{
  delay(10);
  while(key2==0)
  scankey2();
}

if(key3==0)
{
  delay(10);
  while(key3==0)
  scankey3();
}

if(key4==0)
{
  delay(10);
  while(key4==0)
{ recbit=1;
   reccout++;
   if(reccout>4)
   {
   reccout=0;
   break;
   }
  scankey4();
}
}
}
}


void main()
{
while(1)
{
keyscan();
}
}

新建 Microsoft Word 97-2003 文档.doc 下载积分: 积分 -1 分
39.5 KB, 下载次数: 3, 下载积分: 积分 -1 分
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。