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

📄 1760.c

📁 2007年刚推出的语音芯片ISD1760和单片机STC89C58配套的C51源程序
💻 C
字号:
#include<SPI.H> 


uchar bdata SR0_L; 
uchar bdata SR0_H; 
uchar bdata SR1; 
uchar ID,APCL=0,APCH=0; 

/************************************************************************** 
*    函数原型: void ISD_Init(void); 
*    功    能: 初始化 
**************************************************************************/ 
void   ISD_Init(void){ 
        ISD_Reset(); 
        do{ 
                ISD_PU(); 
                RdStatus(); 
                DogReset(); 
        }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(0xaf); 
        RdAPC(); 
} 

/************************************************************************** 
*    函数原型: void ISD_PU(void); 
*    功    能: 空间检查 
**************************************************************************/ 
void ISD_CHK_MEM(void){ 
        ISD_SendData(CHK_MEM); 
        ISD_SendData(0x00); 
        SS=1; 
        delay_ms(10); 
} 

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

/************************************************************************** 
*    函数原型: void ISD_Stop(void); 
*    功    能: 停止 
**************************************************************************/ 
/* 
void ISD_Stop(void){ 
        ISD_SendData(STOP); 
        ISD_SendData(0x00); 
        SS=1; 
    delay_ms(50); 
} 

/************************************************************************** 
*    函数原型: void ISD_Reset(void); 
*    功    能: 复位 
**************************************************************************/ 
void ISD_Reset(void){ 
        ISD_SendData(RESET); 
        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; 
//        SS=1; 
        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); 

} 

/************************************************************************** 
*    函数原型: void RdStatus(void); 
*    功    能: 读取ID 
**************************************************************************/ 
uchar RD_DevID(void){ 
        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 RD_APC(void); 
*    功    能: 读取APC 
**************************************************************************/ 
void RdAPC(void){ 
        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_L; 
        delay_ms(1); 
        SBUF=SR0_H; 
        delay_ms(1); 
        SBUF=APCL; 
        delay_ms(1); 
        SBUF=APCH; 
*/ 
} 

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

/************************************************************************** 
*    函数原型: void ISD_WR_APC2(uchar voiceValue); 
*    功    能: 设置APC2 
**************************************************************************/ 
void ISD_WR_APC2(uchar voiceValue){ 
        ISD_SendData(WR_APC2); 
        ISD_SendData(0xa8|voiceValue);                //0xa8声音最大,0xaf声音最小 
        ISD_SendData(0x0c);                //D11=1,在SETPLAY模式下,执行到EOM自动结束。或者在连续两个SET_PLAY命令后,执行到第一个EOM自动跳到第二段开始 
        SS=1; 
        delay_ms(10);               //延迟10ms 
        ISD_WR_NVCFG();                        //永久写入寄存器 
} 

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

/************************************************************************** 
*    函数原型: void GetToneAdd(uchar cNum, Uint * ipStartAdd, Uint * ipEndAdd); 
*    功    能: 取出当前语音的首末地址 
**************************************************************************/ 
/* 
void GetToneAdd(uchar cNum, uint * ipStartAdd, uint * ipEndAdd){ 

        *ipStartAdd=caToneAdd[cNum*2]; 
        *ipEndAdd=caToneAdd[cNum*2+1]; 
} 

/************************************************************************** 
*    函数原型: void SetPLAY(uchar cNum); 
*    功    能: 定点播放 
**************************************************************************/ 
void SetPLAY(uchar cNum){ 

        uint Add_ST, Add_ED; 
        uchar Add_ST_H, Add_ST_L, Add_ED_H, Add_ED_L; 

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

        ClrInt(); 

        GetToneAdd(cNum, &Add_ST, &Add_ED); 

        Add_ST_L=(uchar)(Add_ST&0x00ff); 
        Add_ST_H=(uchar)((Add_ST>>8)&0x00ff); 
        Add_ED_L=(uchar)(Add_ED&0x00ff); 
        Add_ED_H=(uchar)((Add_ST>>8)&0x00ff); 
/* 
delay_ms(1); 
SBUF=Add_ST_L; 
delay_ms(1); 
SBUF=Add_ST_H; 
delay_ms(1); 
SBUF=Add_ED_L; 
delay_ms(1); 
SBUF=Add_ED_H; 
delay_ms(1); 
*/ 
        ISD_SendData(SET_PLAY); 
        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(); 
                DogReset(); 
        }while((SR0_L&0x01)||((SR1&0x04)));        //if(SR0_L^0==1){system Err}<CMD_Err==1> 

} 

/************************************************************************** 
*    函数原型: void SetREC(uchar cNum); 
*    功    能: 定点录音 
**************************************************************************/ 
void SetREC(uchar cNum){ 

        uint Add_ST, Add_ED; 
        uchar Add_ST_H, Add_ST_L, Add_ED_H, Add_ED_L; 

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

        ClrInt(); 

        GetToneAdd(cNum, &Add_ST, &Add_ED); 

        Add_ST_L=(uchar)(Add_ST&0x00ff); 
        Add_ST_H=(uchar)((Add_ST>>8)&0x00ff); 
        Add_ED_L=(uchar)(Add_ED&0x00ff); 
        Add_ED_H=(uchar)((Add_ST>>8)&0x00ff); 

        ISD_SendData(SET_REC); 
        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(); 
                DogReset(); 
//        }while((SR0_L&0x01)||((SR1&0x08)));        //if(SR0_L^0==1){system Err}<CMD_Err==1> 
        }while((SR0_L&0x01)||(!(SR1&0x01)));        //if(SR0_L^0==1){system Err}<CMD_Err==1> 
} 

/************************************************************************** 
*    函数原型: void SetERASE(uchar cNum); 
*    功    能: 定点删除,容易破坏存储结构(CMA),所以不用 
**************************************************************************/ 
/* 
void SetERASE(uchar cNum){ 

        uchar Add_ST_H, Add_ST_L, Add_ED_H, Add_ED_L; 

        Add_ST_L=(uchar)(Add_ST&0xff); 
        Add_ST_H=(uchar)(Add_ST>>8); 
        Add_ED_L=(uchar)(Add_ED&0xff); 
        Add_ED_H=(uchar)(Add_ED>>8); 

        ISD_SendData(SET_ERASE); 
        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(120); 
} 

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

/************************************************************************** 
*    END 
*    END 
**************************************************************************/ 

 

⌨️ 快捷键说明

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