求助 ISD4004 录音问题(只能放,不能录)
#include <reg52.h>
sbit SS =P2^0; //片选
sbit SCLK=P2^1; //ISD4003时钟
sbit MOSI=P2^2; //数据输入
sbit MISO=P2^3; //数据输出
sbit LED =P1^4; //指示灯
sbit INT =P1^0; //中断
sbit AN =P3^5; //执行
sbit STOP=P3^4; //复位
sbit PR =P3^7; //PR=1录音,PR=0放音
void delay(unsigned int time) //延迟n微秒
{
while(time!=0)
{
time--;
}
}
void delayms(unsigned int time) //延迟n毫秒
{
TMOD=0x01;
for(time;time>0;time--)
{
TH0=0xfc;
TL0=0x18;
TR0=1;
while(TF0!=1)
{;}
TF0=0;
TR0=0;
}
}
void isd_send(unsigned char isdx)//spi串行发送子程序,8位数据
{
unsigned char isx_counter;
SS=0;//ss=0,打开spi通信端
SCLK=0;
for(isx_counter=0;isx_counter<8;isx_counter++)//先发低位再发高位,依次发送。
{
if((isdx&0x01)==1)
MOSI=1;
else
MOSI=0;
isdx=isdx>>1;
SCLK=1;
delay(2);
SCLK=0;
delay(2);
}
}
void isd_stop()//stop指令(停止当前操作)
{
delay(10);
isd_send(0x30);
SS=1;
delayms(50);
}
void isd_powerup()//发送上电指令
{
delay(10);
SS=0;
isd_send(0x20);
SS=1;
delayms(50);
}
void isd_stopwrdn()//发送掉电指令
{
delay(10);
isd_send(0x10);
SS=1;
delayms(50);
}
void isd_play()//发送play指令
{
LED=0;
isd_send(0xf0);
SS=1;
}
void isd_rec()//发送rec指令
{
LED=0;
isd_send(0xb0);
SS=1;
}
void isd_setplay(unsigned char adl,unsigned char adh)//发送setplay指令
{
delayms(1);
isd_send(adl); //发送放音起始地址低位
delay(2);
isd_send(adh); //发送放音起始地址高位
delay(2);
isd_send(0xe0); //发送setplay指令字节
SS=1;
}
void isd_setrec(unsigned char adl,unsigned char adh)//发送setrec指令
{
delayms(1);
isd_send(adl); //发送放音起始地址低位
delay(2);
isd_send(adh); //发送放音起始地址高位
delay(2);
isd_send(0xa0); //发送setplay指令字节
SS=1;
}
void isd_overflow()//芯片溢出,LED闪烁提醒停止录音
{
while(AN==0)
{
LED=1;
delayms(300);
LED=0;
delayms(300);
}
}
unsigned char chk_isdovf()//检查芯片是否溢出(读OVF,并返回OVF值)
{
SS=0;
delay(2);
SCLK=0;
delay(2);
SCLK=1;
SCLK=0;
delay(2);
if(MISO==1)
{
SCLK=0;
SS=1; //关闭spi通信端
isd_stop(); //发送stop指令
return 1; //OVF为1,返回1
}
else
{
SCLK=0;
SS=1; //关闭spi通信端
isd_stop(); //发送stop指令
return 0; //OVF为0,返回0
}
}
void main()
{
unsigned char ovflog;
while(1)
{
P0=P1=P2=P3=0xff; //初始化
while(AN==1) //等待AN键按下
{
if(AN==0) //按键防抖动
{
delayms(20);
}
}
isd_powerup(); //AN键按下,ISD上电并延迟50ms
isd_stopwrdn();
isd_powerup();
if(PR==0) //如果PR=0则转入录音部分
{
delayms(1500); //延迟500ms录音
isd_setrec(0x00,0x00); //发送0x0000h地址的setplay指令
do
{
isd_rec(); //发送rec指令
while(AN==0) //等待录音完毕
{
if(INT==0) //如果芯片溢出,进行LED闪烁提示,
isd_overflow(); //如果取消录音(松开AN键)则停止录音,芯片复位
}
if(INT==0) break;
LED=1; //录音完毕,LED熄灭
isd_stop(); //发送停止命令
while(AN==1) //如果AN再次按下,开始录制下一段语音
{
if(isd_stop==0) //如果按下STOP按键,则芯片复位
break;
if(AN==0)
delayms(500);
}
}
while(AN==0);
}
else //如果PR==1则转入放音部分
{
while(AN==0)
{;}
isd_setplay(0x00,0x00); //发送setplay指令,从0x0000地址开始放音
do
{
isd_play(); //发送放音指令
delay(20);
while(INT==1) //等待放音完毕的EOM中断信号
{;}
LED=1;
isd_stop(); //放音完毕,发送stop指令
if (ovflog=chk_isdovf()) //检查芯片是否溢出 ,如溢出则停止放音,芯片复位
break;
while(AN==1) //等待AN键再次按下
{
if(isd_stop==0)
break;
if(AN==0)
delayms(20);
}
}
while(AN==0); // AN键再次按下,播放下一段语音
}
isd_stop();
isd_stopwrdn();
}
}
:强烈建议您在main函数组成一个大while(1)循环,然后把录音部分改成if判断吧,你的程序里可能有死循环了!
在录音段,有一个if(INT==0) break;
isd.rar_isd
版权申诉
164 浏览量
2022-09-19
15:15:25
上传
评论
收藏 2KB RAR 举报
钱亚锋
- 粉丝: 88
- 资源: 1万+
最新资源
- 简单理解深度学习,轻松易学
- Rust 最牛的超级算法集.zip
- Mpush Client Object-C.zip
- 辽宁移动办税安全下载-1.apk
- 毕业设计联邦学习框架下基于Memae的异常检测python源码+运行说明.zip
- 基于知识图谱的推荐算法MCRec的python实现源码+项目说明+数据集.zip
- 一个由C++编写的简单的命令行学生信息管理系统大一Cpp课程实验课项目
- Spire.Doc for Java 11.4.2和aspose-words-24.01全功能无限制使用,无水印,亲测可用
- 基于知识图谱的推荐算法KARN的python实现+项目说明+数据集.zip
- swift 和 Javascript的交互,javascript可以调用swift .zip
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈