哪位有做过的可以帮我看下程序?或提供点参考程序
主模块程序:
#include<reg52.h>
#include<isd1730.h>
sbit r_led=P1^0; //录音指示灯
sbit p_led=P1^1; //放音指示灯
sbit e_led=P1^2; //清除指示灯
sbit r_key=P1^3; //录音开关
sbit p_key=P1^4; //放音开关
sbit e_key=P1^5;
sbit s_key=P1^6;
//sbit ft_key=P1^7;
sbit mic_anal=P2^7;
sbit p_r_sl=P2^6;
bit fplayend; //初始放音标志位,1表示正在放音,初始化为0
//bit ft;
void isd_play();
void isd_rec();
void isd_erase();
void main ()
{
delay_ms(200); //延时200ms,使系统工作稳定
init();
r_key=1; //置高,保持稳定
p_key=1;
e_key=1;
s_key=1;
mic_anal=1;
fplayend=0;
// ft_key=1;
while(1)
{
if(!r_key)
{
delay_ms(10);
if(!r_key)
{
isd_rec();
}
}
if(!p_key)
{
delay_ms(10);
if(!p_key)
{
isd_play();
}
}
// if(!e_key)
// {
// delay_ms(10);
// if(!e_key)
// {
// isd_erase();
// }
// }
// if(!s_key)
// {
// delay_ms(10);
// if(!s_key)
// {
// isd_stop();
// }
// }
if(fplayend)
{
if((read_sr1()&0x01)) //判断isd1730是否处于空闲,空闲则表示放音结束
{
fwd();
pd();
fplayend=0;
p_led=1;
}
}
}
}
void isd_play()
{
// while(!p_key); //等待按键释放,再执行放音
// if(!ft_key)
// {
//
// }
reset(); //复位
pu(); //上电
play(); //放音
p_led=0; //开led灯
fplayend=1; //开放音标志
}
void isd_rec()
{
// if(mic_anal)
// wr_apc2(0x07); //音量最大,关监听,直通,可音效编辑,AUD
// else
// wr_apc2(0x40); //音量最大,关监听,非直通,可音效编辑,AUD
//// while(!r_key); //等待按键释放
// while(!(read_sr1()&0x01) ); //等待写apc2结束
reset();
pu();
rec();
r_led=0;
while(!r_key) //录音过程需一直按着录音键
{
if((read_sr0()&0x02)) //判断录音空间是否满
break;
}
stop(); //isd1730掉电
pd();
r_led=1;
}
分模块程序
#include<reg52.h>
#include"isd1730.h"
#define uchar unsigned char
#define uint unsigned int
sbit ss=P0^0;
sbit sclk=P0^1;
sbit si=P0^2;
sbit so=P0^3;
//uchar bdata SR0_L;
//uchar bdata SR0_H;
//uchar bdata SR1;
//uchar APCL=0,APCH=1;
//uchar RecAddL=0,RecAddH=1;
//uchar PlayAddL=0,playAddH=1;
//
//sbit CMD=SR0_L^0;
//sbit FULL=SR0_L^1;
//sbit PU=SR0_L^2;
//sbit EOM=SR0_L^3;
//sbit INIT=SR0_L^4;
//sbit RDY=SR1^0;
//sbit ERASE=SR1^1;
//sbit PLAY=SR1^2;
//sbit REC=SR1^3;
void init() //isd1730的初始化
{
ss=1; //片选信号置高
sclk=1;
si=0; //isd1730接收端置低,
}
uchar r_w(uchar add) //单片机模拟spi接口读写一个字节
{
uint i;
for( i=0;i<8;i++)
{
sclk=0;
if(add&0x01) //字节传送从低位开始传
{
si=1;
}
else si=0;
add>>=1;
if(so) //与此同时,芯片状态以及当前行信息以数据队列的方式通过MISO被返给主机。
{
add|=0x80;
}
sclk=1;
}
return(add);
}
void pu() //isd1730上电
{
ss=0; //片选信号拉低,选择isd1730
r_w(0x01);
r_w(0x00);
ss=1;
delay_ms(50); //上电延时时间的典型值是50ms
}
void stop() //isd停止当前操作
{
ss=0;
r_w(0x02);
r_w(0x00);
ss=1;
}
void reset()
{
ss=0;
r_w(0x03);
r_w(0x00);
ss=1;
}
void clrint() //isd1730清除中断标志
{
ss=0;
r_w(0x04);
r_w(0x00);
ss=1;
}
uchar read_sr0() //读isd1730状态寄存器sr0
{
uchar sr0; //状态寄存器sr0字节1的暂存单元
ss=0;
sr0=r_w(0x05); //读状态寄存器sr0的字节1
r_w(0x00);
r_w(0x00); //读状态寄存器sr1
ss=1;
return sr0;
}
uchar read_sr1() //读isd1730状态寄存器sr1
{
uchar sr1;
ss=0;
r_w(0x05);
r_w(0x00);
sr1=r_w(0x00); //前两个字节读sr0,第三个字节读sr1
ss=1;
return sr1;
}
void pd() //掉电命令,isd1730完成录放音或擦出后执行掉电
{
ss=0;
r_w(0x07);
r_w(0x00);
ss=1;
}
void play() //放音命令,从当前地址开始放音,直到存储器终点或接收到停止命令结束
{
ss=0;
r_w(0x40);
r_w(0x00);
ss=0;
}
void rec() //录音命令,从当前地址开始录音
{
ss=0;
r_w(0x41);
r_w(0x00);
ss=1;
}
void erase()
{
ss=0;
r_w(0x42);
r_w(0x00);
ss=1;
}
void g_erase()
{
ss=0;
r_w(0x43);
r_w(0x00);
ss=1;
}
void wr_apc2(uchar buf) //写apc(模拟路径配置)寄存器2,写12位apc寄存器控制命令,音量<D2:D0>配置
{
ss=0;
r_w(0x65);
r_w(buf);
r_w(0x04);
ss=1;
}
void fwd() //放音快进,在放音过程中,使放音地址指针指向下一段语音信息
{
ss=0;
r_w(0x48);
r_w(0x00);
ss=1;
}
/*------------------------------------------------
uS延时函数,含有输入参数 unsigned char t,无返回值
unsigned char 是定义无符号字符变量,其值的范围是
0~255 这里使用晶振12M,精确延时请使用汇编,大致延时
长度如下 T=tx2+5 uS
------------------------------------------------*/
void DelayUs2x(unsigned char t)
{
while(--t);
}
/*------------------------------------------------
mS延时函数,含有输入参数 unsigned char t,无返回值
unsigned char 是定义无符号字符变量,其值的范围是
0~255 这里使用晶振12M,精确延时请使用汇编
------------------------------------------------*/
void delay_ms(unsigned char t)
{
while(t--)
{
//大致延时1mS
DelayUs2x(245);
DelayUs2x(245);
}
} |