搜索
bottom↓
回复: 7

关于ISD1730的录放程序

[复制链接]

出0入0汤圆

发表于 2010-5-4 00:27:13 | 显示全部楼层 |阅读模式
小弟 在这个网站找的ISD1760语音录放程序,但是我现在的主控芯片是STC89C52RC,操作的ISD1730,我把那个程序改了好久,还是不能用,现在不知道怎么办了,哪位高手能给我看看,到底是处在那点错了。最好是你们那个写过这个程序给小弟参考一下,小弟的邮箱是:274814951@qq.com
#include <REGX52.H>
#include <intrins.h>
#include "typedef.h"
#define  PU   0x01                     //上电
#define  STOP   0x02            //停止
#define  RESET   0x03                         //复位,后边需要发上电
#define  CLI_INT  0x04                         //清除中断或者EOM
#define  RD_STATUS 0x05                 //读状态寄存器,后跟2个字节,并读取状态寄存器和当前地址
#define  RD_PLAY_PTR   0x06         //播放器存器,后跟3个字节,读取状态寄存器的状态和当前地址和播放指针
#define  PD   0x07                                 //掉电
#define  RD_REC_PTR   0x08                 //录音寄存器,后跟3个字节,读取状态寄存器、当前地址和录音指针
#define  RD_DEVID 0x09                         //读取芯片ID
#define  G_ERASE 0x43                         //察出除提示音外的所有内容
#define  RD_APC   0x44                         //读取模拟通道APC,后跟3个字节,当前状态、地址指针
#define  WR_APC1   0x45                 //后跟2个字节,将D1:D0写入APC寄存器,由VOC引脚控制音量
#define  WR_APC2   0x65                 //后跟2个字节,将D11:D0写入APC寄存器,并由D2:D0调节
#define  WR_NVCFG   0x46                 //将APC的内容写入NVCFG
#define  CHK_MEM 0x49                         //检查环形存储结构
#define  SET_PLAY   0x80                 //从起始地址开始播放到结束地址
#define  SET_REC   0x81                 //从起始地址开始录音到结束地址
#define  SET_ERASE   0x82                 //从起始地址开始察除,到结束地址
typedef unsigned char uchar;
typedef unsigned int uint;
sbit SS=P0^3;
sbit SCLK=P0^2;
sbit MOSI=P0^1;
sbit MISO=P0^0;
sbit key1=P3^4;
sbit key2=P3^5;
sbit key3=P3^6;
sbit BELL=P2^3;
uchar code caToneAdd[]={0x10,0x40,0x80,0xc0,0xff};
uchar SR0_L,SR0_H,SR1;
uchar ID,APCL=0,APCH=0;
void ISD_CHK_MEM(void);
void  ISD_PU(void);
void ISD_Stop(void);
void ISD_Reset(void);
void ISD_PD(void);
uchar ISD_SendData(uchar BUF_ISD);
void RdStatus(void);
uchar RD_DevID(void);
void ISD_WR_NVCFG(void);
void RdAPC(void);
void ClrInt(void);
void ISD_WR_APC2(uchar voiceValue);
void GetToneAdd(uchar cNum,uint *ipStartAdd,uint *ipEndAdd);
void SetPLAY(uchar cNum);
/***************************************************************************/
void delay_ms(int xms)
{
    while(xms--)
        {;}
}
/**************************************************************************
*                延时函数 delay_ms(unsigned int xms)          
*
*************************************************************************/
void I_delay(void)
{
        int a;
        for(a=17;a>=0;a--)
                {
                _nop_();
                }
}
/**************************************************************************
*    函数原型: void ISD_Init(void);
*    功    能: 初始化
**************************************************************************/
void  ISD_Init(void)
{
                ISD_Reset();
                do{
                        ISD_PU();
                        RdStatus();
                        }while((SR0_L&0x01)||(!(SR1&0x01)));
                SBUF=RD_DevID();                       
                ClrInt();
                ISD_WR_APC2(0xaf);
                RdAPC();
}
/*************************************************************************/       
void di()
{
        BELL=0;
        delay_ms(5000);
        BELL=1;       
}
/**************************************************************************
*    函数原型: void ISD_PU(void);
*    功    能: 空间检查
**************************************************************************/
void ISD_CHK_MEM(void)
{
        ISD_SendData(CHK_MEM);
        ISD_SendData(0x00);
        SS=1;
        delay_ms(50);
}
/**************************************************************************
*    函数原型: 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;
        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=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);
}
/**************************************************************************
*    函数原型: void RdStatus(void);
*    功    能: 读取ID
**************************************************************************/
uchar RD_DevID(void)
{
        ISD_SendData(RD_DEVID);
        ISD_SendData(0x00);
        ISD_SendData(0x00);
        SS=1;
        delay_ms(100);               //延迟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  
}

/**************************************************************************
*    函数原型: 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();
                }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_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();
        }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();
                }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();
                }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(10);               //延迟10ms
}
/*************************************************************************/
void main()
{  char num;
        ISD_Init();
        while(1)
                {
                        if(key1==0)
                        {
                                delay_ms(5);
                                if(key1==0)
                                {
                                        while(!key1);di();
                                        num++;
                                        if(num==3)
                                        num=0;
                                        switch(num)
                                                {
                                                        case 0:
                                                                        {
                                                                        Erase_All();
                                                                        break;
                                                                        }
                                                        case 1:
                                                                        {
                                                                        ISD_CHK_MEM();
                                                                        RdStatus();
                                                                        SetREC(0);
                                                                        break;       
                                                                        }
                                                        case 2:
                                                                        {
                                                                        SetPLAY(0);
                                                                        break;       
                                                                        }
                                                               
                                                }       
                                }
                        }
                        if(key2==0)
                        {
                                delay_ms(5);
                                if(key2==0)
                                {
                                        while(!key2);di();
                                        ISD_Stop();
                                }        ISD_PU();
                        }
       
                }       
}

阿莫论坛20周年了!感谢大家的支持与爱护!!

你熬了10碗粥,别人一桶水倒进去,淘走90碗,剩下10碗给你,你看似没亏,其实你那10碗已经没有之前的裹腹了,人家的一桶水换90碗,继续卖。说白了,通货膨胀就是,你的钱是挣来的,他的钱是印来的,掺和在一起,你的钱就贬值了。

出0入0汤圆

发表于 2012-5-13 12:57:54 | 显示全部楼层
正学这个,顶

出0入0汤圆

发表于 2012-11-7 15:37:35 | 显示全部楼层
isd1730有没有贴片式的呢

出0入0汤圆

发表于 2013-3-27 00:06:07 | 显示全部楼层
木v风 发表于 2012-11-7 15:37
isd1730有没有贴片式的呢

有的,正使用呢

出0入0汤圆

发表于 2013-7-17 14:35:25 | 显示全部楼层
hameyou 发表于 2010-5-4 08:26
我看不是程序的问题,应该是电路的问题,把你的电路贴上来看看

初始化 都通过不了  是什么原因呢?程序和这上面的一样的啊?

出0入0汤圆

发表于 2013-7-17 14:36:24 | 显示全部楼层
hameyou 发表于 2010-5-4 08:26
我看不是程序的问题,应该是电路的问题,把你的电路贴上来看看

电路图就是那个 资料里面的图  可以用独立按键实现录放音的。。

出0入0汤圆

发表于 2013-7-18 14:21:44 | 显示全部楼层
ISD系列的芯片驱动起来挺方便的,音质还可以,有需要的可以联系我。
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-10-3 07:14

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表