ISD1760语音芯片播放音程序,基于AVR单片机实现

      该程序中的录音地址是我的ISD1760中录的,你应该先录音到ISD1760中,在修改录音地址才能准确播放出来。对与SPI模式录的音可以通过按键模式放出来,这也是本人最近才知道的。在处理ISD1760录放音时,最容易出现地址错误导致录不进去,这是可以通过按键模式检测是否是地址错误。按一下播放键,如果led灯闪两下,说明没问题,如果是连续闪7下,说明地址错误,需完全擦出芯片才能正确录音,否则根本录不进去。这个长时间擦出时间大约是长按擦除键不放,等led灯闪烁7下之后继续按住不放,过几秒后喇叭里面会传来“滋滋”的声音,这时表示芯片完全擦出成功。

#include <mega128.h> 
#include <delay.h>
#define uchar unsigned char 
#define uint unsigned int

#define SS      PORTE.0
#define SCLK    PORTE.1
#define MOSI    PORTE.2
#define MISO    PORTE.3
uchar nu= 99 ;
/*-----------------------1#--录音地址列表-------------------------------*/
uint Rec_Adr[]={0x0021,0x0022,0x0025,0x0026,0x0029,0x002a,0x002d,0x002e,  
                //    0             1              2             3   
                0x0031,0x0032,0x0035,0x0037,0x0039,0x003a,0x003d,0x003e,  
                //    4             5              6             7
                0x0040,0x0042,0x0045,0x0046,0x0048,0x004a,0x004d,0x004e,  
                //    8             9              十            百
                //    8             9              10            11
                0x0051,0x0052,0x0055,0x0056,0x0059,0x005a,0x005d,0x005f,  
                //   千             点           米            厘米
                //   12             13             14            15
                0x0061,0x0063,0x0065,0x0068,0x006a,0x006c,0x006f,0x0070,  
                //   毫米           小时            分           秒
                //   16             17             18            19
                0x0073,0x0074,0x0077,0x007a,0x007c,0x007f,0x0081,0x0084,  
                //   度             长度         距离           角度
                //   20             21             22            23   
                0x0086,0x0088,0x008a,0x008d,0x008f,0x0092,0x0094,0x0097,
                //  颜色          红色           蓝色          黄色    
                //   24              25            26            27
                0x0099,0x00a2,0x00a4,0x00a8,0x00aa,0x00ae,0x00b0,0x00b6};
                //距离前方障碍物  任务完成   谢谢大家       演示开始   
                //    28             29          30             31
/*************************************************************************/

//变量定义

uchar statu;                 //状态位
uint StartAdr=0x0010,EndAdr=0x01df;        //录放音起始地址 与终止地址
uint Play_rec_num[3];        //录音播放表


void Play(uchar Play_flag);               //放音函数
void Rec();                              //录音函数
uchar ISD_SendData(uchar BUF_ISD);        //SPI发送函数
void Erase_All();                        //全部擦除函数
void delay_SPI(uint Start,uint End);      //SPI放音,录音结束等待函数
void Comput_Num(uint num);                //数据位分离函数
void Play_3Num(uint Data);                //播放三位数据函数
void main()

  uchar i;
  DDRE=0xff;
  PORTE=0xff; 
  
  while(1)
  {  //Erase_All();
            delay_ms(1300);
             
            //Rec();
            Play_3Num(nu);               //播放三位数据
            //Play(nu);
            nu++;      
  }

/********************************
**********三位数据播报函数
********************************/
void Play_3Num(uint Data)
{
    Comput_Num(Data);                   //计算播报数据
    if(Data>99)                         //数据是三位数
    {
        Play(Play_rec_num[0]);          //播放百位数据
        Play(11);                       //播放百位
        if(Play_rec_num[1]==0)          //十位数据为0
            if(Play_rec_num[2]!=0)      //个位数据不为零
            {   
                Play(0);                //播放 0   
                Play(Play_rec_num[2]);  //播放个位数据
            }
            else ;     //十位数据为零,个位数据为零           
        else           //十位数据不为零    
        {
            Play(Play_rec_num[1]);      //播放十位数据
            Play(10);                   //播放十位
            if(Play_rec_num[2]!=0)      //个位数据不为0
                Play(Play_rec_num[2]);  //播放个位数据
        }
    }
    else if(Data>9)                     //数据是两位数
    {     
        if(Play_rec_num[1]==1)          //十位为1
        {
            Play(10);                   //播放十位
        }
        else  if(Play_rec_num[1]!=0)    //十位数据不为0,也不为1
        {
            Play(Play_rec_num[1]);      //播放十位数据
            Play(10);                   //播放十位
        }
        if(Play_rec_num[2]!=0)          //个位数据不为0
            Play(Play_rec_num[2]);      //播放个位数据
    }
    else  
        Play(Play_rec_num[2]);          //数据为一位数,直接播放个位数据
}
/***********************************
*********三位数据播报取值函数
***********************************/
void Comput_Num(uint num)
{
    Play_rec_num[0]=num/100;             //分离百位数
    Play_rec_num[1]=num%100/10;          //分离十位数据
    Play_rec_num[2]=num%10;              //分离个位数据
}


void Rec()    //16个地址是2秒。
{
  ISD_SendData(0x03);// RESET
  ISD_SendData(0x00); 
  SS=1; 
     delay_ms(50);
  ISD_SendData(0x01);// pu
  ISD_SendData(0x00); 
  SS=1; 
     delay_ms(50);
  ISD_SendData(0x45);//  WR_APC
  ISD_SendData(0x40); 
  ISD_SendData(0x04); //
  SS=1; 
     delay_ms(50);
  statu=0;
  while((statu&0x01)==0x00)
  {
  ISD_SendData(0x05);//  READSTATU
  ISD_SendData(0x00); 
  statu=ISD_SendData(0x00); //
  SS=1; 
  }
     delay_ms(50);
 
  ISD_SendData(0x81);//  SETREC
  ISD_SendData(0x00); 
  ISD_SendData(StartAdr&0x00ff);//  
  ISD_SendData(StartAdr>>8); 
  ISD_SendData(EndAdr&0x00ff);// 
  ISD_SendData(EndAdr>>8); 
  ISD_SendData(0x00); 
  SS=1;
  ISD_SendData(0x05);//  READSTATU
  ISD_SendData(0x00); 
  statu=ISD_SendData(0x00); //
  SS=1; 
  while((statu&0x08)==0x08)
     {
  ISD_SendData(0x05);//  READSTATU
  ISD_SendData(0x00); 
  statu=ISD_SendData(0x00); //
  SS=1; 
  }        
  ISD_SendData(0x07);   //pd
  ISD_SendData(0x00); 
  SS=1; 
 
}

 

void Play(uchar Play_flag)    //形参=1放1段,2放2段,3放3段,4放4段。16个地址是2秒。
{   
     uint start,end;
  StartAdr=Rec_Adr[Play_flag*2];
  EndAdr=Rec_Adr[Play_flag*2+1];
  start=StartAdr;
  end=EndAdr;
  ISD_SendData(0x03);// RESET
  ISD_SendData(0x00); 
  SS=1; 
     delay_ms(20);
  ISD_SendData(0x01);// pu
  ISD_SendData(0x00); 
  SS=1; 
     delay_ms(20);
  ISD_SendData(0x45);//  WR_APC
  ISD_SendData(0x08); 
  ISD_SendData(0x0C); //
  SS=1; 
     delay_ms(20);
  statu=0;
  while((statu&0x01)==0x00)
  {
  ISD_SendData(0x05);//  READSTATU
  ISD_SendData(0x00); 
  statu=ISD_SendData(0x00); //
  SS=1; 
  }
     delay_ms(20);
//  ISD_SendData(0x49);   //CHECK_mem
//  ISD_SendData(0x00); //
//  SS=1; 
  ISD_SendData(0x80);//  SETPLAY
  ISD_SendData(0x00); 
  ISD_SendData(StartAdr&0x00ff);//  
  ISD_SendData(StartAdr>>8); 
  ISD_SendData(EndAdr&0x00ff);// 
  ISD_SendData(EndAdr>>8); 
  ISD_SendData(0x00); 
  SS=1;
  ISD_SendData(0x05);//  READSTATU
  ISD_SendData(0x00); 
  statu=ISD_SendData(0x00); //
  SS=1; 
//   while((statu&0x04)==0x04)
//      {
//   ISD_SendData(0x05);//  READSTATU
//   ISD_SendData(0x00); 
//   statu=ISD_SendData(0x00); //
//   SS=1; 
//   } 
     delay_SPI(start,end);    
  ISD_SendData(0x07);   //pd
  ISD_SendData(0x00); 
  SS=1; 
  
}

void delay_SPI(uint Start,uint End)
{     
    uint len;
    len=End-Start;        //地址差值
    len*=230;            //转换为时间 ms
    delay_ms(len);
}

void  I_delay(void)
{
 uchar i;
 for(i=0;i<1;i++);
}


/************************************************************************** 
*    函数原型: uchar ISD_SendData(uchar BUF_ISD); 
*    功    能: 发送数据 返回接收数据
**************************************************************************/ 
uchar ISD_SendData(uchar BUF_ISD)

 uchar i,dat;
 dat=BUF_ISD; 
 SCLK=1; 
 SS=0; 
 for(i=0;i<8;i++)
 { 
  SCLK=0; 
  I_delay(); 
  if(dat&0x01)
  { 
   MOSI=1; 
  } 
  else
  { 
   MOSI=0; 
  } 
  dat>>=1; 
  if(MISO)
  { 
   dat|=0x80; 
  } 
  SCLK=1; 
  I_delay(); 
 } 
 MOSI=0; 
// SS=1; 
 return(dat);  
}

/************************************************************************** 
*    函数原型: void Erase_All(); 
*    功    能: 全部删除 
**************************************************************************/

void Erase_All()

  ISD_SendData(0x42); 
  ISD_SendData(0x00); 
  SS=1; 
  delay_ms(20);               //延迟10ms 
}

 

转载于:https://www.cnblogs.com/feng-bxr/articles/2302079.html

  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值