|
小弟 在这个网站找的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碗,继续卖。说白了,通货膨胀就是,你的钱是挣来的,他的钱是印来的,掺和在一起,你的钱就贬值了。
|