⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 1730.c

📁 isd1700系列语音芯片用C51实现~! 很好
💻 C
字号:
#include<SPI.H>  
#include <reg52.H> 
#include <absacc.h> 
#include <intrins.h> 
#include <math.h> 

sbit SS=P2^3;  
sbit SCLK=P2^2;  
sbit MOSI= P2^1;  
sbit MISO =P2^0;  


uchar bdata SR0_L;  
uchar bdata SR0_H;  
uchar bdata SR1;  



/*************延时n ms子函数**************************/ 
void delay_ms(unsigned int tt)//延时1ms 
{ 
        unsigned char j; 
        while(tt--) 
    { 
                for(j=0;j<125;j++); 
        } 
}  

void I_delay(void) 
{      
    unsigned char i; 
   for(i=0;i<18;i++) 
     _nop_(); 
}
/**************************************************************************  
*    函数原型: void ISD_ERASE(void) 
*    功    能: 擦出当前段
**************************************************************************/ 
void ISD_ERASE(void) 
{
   ISD_SendData (0x52);
   ISD_SendData (0x00);
   SS=1;
   delay_ms(10);
  
}



/**************************************************************************  
*    函数原型: void init_serialcomm(void) 
*    功    能: 串口 
**************************************************************************/  
void init_serialcomm(void) 
{ 
    SCON  = 0x40;       //选择串口工作于方式1 
    TMOD  =  0x20;       //定时器T1 设置为工作方式2,用作波特率发生器 
    PCON  =  0x00;       //SMOD=1;  
    TH1   = 0xFd;       //按照波特率为9600 计算初值  
    TL1   = 0xFd;        
//    IE   |= 0x80;       //Enable Serial Interrupt  
    EA    = 1;
	ES=1; 
    TR1   = 1;          // timer 1 run  
} 
void send_char_com(uchar ch)   
{ 
	TI=0;
    SBUF=ch;
	

} 
/*/**************************************************************************  
*    函数原型: void RD_APC(void);  
*    功    能: 读取APC  
**************************************************************************/ 
void ISD_FWD(void)

{  ISD_SendData(0x58);
   ISD_SendData(0x00);
   SS=1;
   delay_ms(10)	;


}



/*/**************************************************************************  
*    函数原型: void RD_APC(void);  
*    功    能: 读取APC  
**************************************************************************/  
void RdAPC(void){ 

		uchar APCH,APCL;
        ISD_SendData(RD_APC);  
        ISD_SendData(0x00);  
        ISD_SendData(0x00);  
        ISD_SendData(0x00);  
        SS=1;  
        delay_ms(10);               //延迟10ms  

        SR0_L        =ISD_SendData(RD_APC);  
        SR0_H        =ISD_SendData(0x00);  
        APCL        =ISD_SendData(0x00);  
        APCH        =ISD_SendData(0x00);  
        SS=1;  
        delay_ms(10);               //延迟10ms  
  
        SBUF=SR0_H;
		  
        delay_ms(500);  
        SBUF=SR0_L;  
        delay_ms(500);  
        SBUF=APCH;  
        delay_ms(500);  
        SBUF=APCL;  
  	 
}  
/**************************************************************************  
*    函数原型:void ISD_STOP(void)  
*    功    能: 停止当前操作
**************************************************************************/ 
void ISD_STOP(void)
{
  ISD_SendData(STOP);
  ISD_SendData(0X00);
  SS=1;
  delay_ms(20);

}



/**************************************************************************  
*    函数原型: uchar RD_DevID(void)  
*    功    能: 读ID 
**************************************************************************/ 

uchar RD_DevID(void)
{		uchar ID;
        ISD_SendData(RD_DEVID);  
        ISD_SendData(0x00);  
        ISD_SendData(0x00);  
        SS=1;  
        delay_ms(10);               //延迟10ms  
        SR0_L  =ISD_SendData(RD_DEVID);  
        SR0_H  =ISD_SendData(0x00);  
        ID    =ISD_SendData(0x00);  
        SS=1;  
        delay_ms(10);  
        return(ID);  

}
/**************************************************************************  
*    函数原型: void ISD_Reset(void)  
*    功    能: 复位
**************************************************************************/ 
void ISD_Reset(void)
{ 
  ISD_SendData(0x13);
  ISD_SendData(0x00);
  SS=1;
  delay_ms(50) ;


}

/**************************************************************************  
*    函数原型: void ISD_WR_NVCFG(void);  
*    功    能: 永久写入寄存器  
**************************************************************************/  
void ISD_WR_NVCFG(void)
{  
        ISD_SendData(WR_NVCFG);  
        ISD_SendData(0x00);  
        SS=1;  
        delay_ms(10);               //延迟10ms  
}  


/**************************************************************************  
*    函数原型: void ISD_Init(void);  
*    功    能: 初始化  
**************************************************************************/  
void   ISD_Init(void)
{  
        ISD_Reset();  
        do{   
                 P1=0; 
                ISD_PU();  
                RdStatus();  
               
        }while((SR0_L&0x01)||(!(SR1&0x01)));        //if(SR0_L^0==1){system Err}<CMD_Err==1>  
                 
        SBUF=RD_DevID();//读取芯片ID,----1760为0xa0  
        ClrInt();  
        ISD_WR_APC2();  
        RdAPC();  
}  
/**************************************************************************  
*    函数原型: void SetREC(uchar cNum);  
*    功    能: 定点录音  
**************************************************************************/  
void SetREC(void) 
{  
          uchar Add_ST_H, Add_ST_L, Add_ED_H, Add_ED_L;  

        do{  
                RdStatus();  
             
           }while((SR0_L&0x01)||(!(SR1&0x01)));       

         ClrInt();  
         Add_ST_L=0x00; 
         Add_ED_L=0xFF; 
         Add_ST_H=0X00;
         Add_ED_H=0X00; 
         
        ISD_SendData(0x91);  
        ISD_SendData(0x00);  
        ISD_SendData(Add_ST_L);                  //S7:S0  开始地址  
        ISD_SendData(Add_ST_H);                  //S10:S8  
        ISD_SendData(Add_ED_L);                  //E7:E0  结束地址  
        ISD_SendData(Add_ED_H);                 //E10:E8  
        ISD_SendData(0x00);  
        SS=1;  
        delay_ms(10);               //延迟10ms  

      do{  
               RdStatus();  
            
         }while((SR0_L&0x01)||(!(SR1&0x01)));        //if(SR0_L^0==1){system Err}<CMD_Err==1> 
                  
}  

/**************************************************************************  
*    函数原型: void SetPLAY(uchar cNum);  
*    功    能: 定点播放  
**************************************************************************/  
void SetPLAY(void) 
    {  
	    uchar Add_ST_H, Add_ST_L, Add_ED_H, Add_ED_L; 
       do{  
               RdStatus();  
                
         }while((SR0_L&0x01)||(!(SR1&0x01)));        //if(SR0_L^0==1){system Err}<CMD_Err==1>   
        
	      ClrInt();  
		  Add_ST_L=0x00; 
          Add_ED_L=0xFF; 
          Add_ST_H=0X00; 		    
          Add_ED_H=0X00;		  
        ISD_SendData(0x90);  
        ISD_SendData(0x00);  
        ISD_SendData(Add_ST_L);                 //S7:S0  开始地址  
        ISD_SendData(Add_ST_H);                  //S10:S8  
        ISD_SendData(Add_ED_L);                  //E7:E0  结束地址  
        ISD_SendData(Add_ED_H);                  //E10:E8  
        ISD_SendData(0x00);  
        SS=1;  
        delay_ms(10);               //延迟10ms  

        do{  
                RdStatus();  
             
        }while((SR0_L&0x01)||((SR1&0x04)));        
                     
       
} 
/****************************************************************************
*函数类型:void ISD_REC(void);
*从当前开始录音;,
******************************************************************************/
void ISD_REC(void)
{ 
  ISD_SendData(0x41);
  ISD_SendData(0x00);
  SS=1;
  delay_ms(10);
}
/****************************************************************************
*函数类型:void ISD_WR_APC2(void);
*写APC寄存器,
******************************************************************************/
 void ISD_WR_APC2(void)
 {
   ISD_SendData(0x75);
   ISD_SendData(0x47);
   ISD_SendData(0x04);
   SS=1;
   delay_ms(20);
   ISD_WR_NVCFG();
 }


/****************************************************************************
*函数类型:void ISD_PLAY(void);
*播放当前端语音
******************************************************************************/
void ISD_PLAY(void)
{
  ISD_SendData(0x40);
  ISD_SendData(0x00);
  SS=1;
  delay_ms(10);
}



/**************************************************************************  
*    函数原型: void ISD_PU(void);  
*    功    能: 上电  
**************************************************************************/  
void  ISD_PU(void) 
{  
        ISD_SendData(0x11);  
        ISD_SendData(0x00);  
        SS=1;  
       delay_ms(50);  
}  

/**************************************************************************  
*    函数原型: void ISD_PD(void);  
*    功    能: 掉电  
**************************************************************************/  
  
void ISD_PD(void) 
{  
        ISD_SendData(PD);  
        ISD_SendData(0x00);  
        SS=1;  
}  

/**************************************************************************  
*    函数原型: void ISD_SendData(uchar BUF_ISD);  
*    功    能: 发送数据  
**************************************************************************/  
uchar ISD_SendData(uchar BUF_ISD) 
{  
        uchar i,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;  
     return(dat);  
}  

/**************************************************************************  
*    函数原型: void RdStatus(void);  
*    功    能: 读取状态  
**************************************************************************/  
void RdStatus(void) 
{  
        ISD_SendData(RD_STATUS);  
        ISD_SendData(0x00);  
        ISD_SendData(0x00);  
        SS=1;  
        delay_ms(10);               //延迟10ms  
        SR0_L =ISD_SendData(RD_STATUS); 
		 
        SR0_H =ISD_SendData(0x00);  
        SR1  =ISD_SendData(0x00);  
        SS=1;
		delay_ms(10);

	 /*   SBUF=SR0_H;  
        delay_ms(500);
		ES=1;  
        SBUF=SR0_L;  
        delay_ms(500);
		ES=1;  
        SBUF=SR1;  */
       
  	   
 
			   
} 
/**************************************************************************  
*    函数原型: void ISD_RD_PLAY_PTR(void)  
*    功    能: 读取状态寄存器,当前地址和播放指针;  
**************************************************************************/  
void ISD_RD_PLAY_PTR(void)
{
   	uchar APCH,APCL;
   ISD_SendData(0X16);
   ISD_SendData(0X00);
   ISD_SendData(0X00);
   ISD_SendData(0X00);
   SS=1;
         
		SBUF=SR0_H;  
        delay_ms(500);  
        SBUF=SR0_L;  
        delay_ms(500);  
        SBUF=APCH;  
        delay_ms(500);  
        SBUF=APCL;  
 // 	   while(1);

}



/**************************************************************************  
*    函数原型: void ClrInt(void);  
*    功    能: 清除中断  
**************************************************************************/  
void ClrInt(void) 
{  
        ISD_SendData(CLI_INT);  
        ISD_SendData(0x00);  
        SS=1;  
        delay_ms(10);               //延迟10ms  
}  

/**************************************************************************  
*    函数原型: void Erase_All(void);  
*    功    能: 全部删除  
**************************************************************************/  
void Erase_All(void) 
{  
        ISD_SendData(G_ERASE);  
        ISD_SendData(0x00);  
        SS=1;  
        delay_ms(100);               //延迟10ms  
}  

/**************************************************************************  
*    END  
*    END  
**************************************************************************/  
void com(void)  interrupt 4 using 2
{
   
   	TI=0;
	ES=0;

}




void main(void)                                                                                                                         
{ 
   delay_ms(10);
   ISD_PU();
   delay_ms(50);
   
  do {   
        ISD_PU();  
        RdStatus();  
              
      }while((SR0_L&0x01)||(!(SR1&0x01)));

     ISD_REC();
 /* do {
       ISD_REC();
     
      }while(SR0_L&0x01);
 
  do {   
        RdStatus();  
                                           
      }while((SR0_L&0x01)||(!(SR1&0x08)));*/
   
     delay_ms(100000);
     ISD_STOP();
    
     delay_ms(3000);

      ISD_PLAY();
  
   
  
                     
     
     delay_ms(3000);

  //   ISD_ERASE();
  

   
   	 
  
  
          
   
  

   

 
 //  ISD_STOP();


 while(1);
  	

  
	  
 		
   
   
    
 }      
                 
        
        
                  

 

       
 




        
        

                      


         

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -