标题:
单片机89C52 控制ISD4004语音芯片,多段录放音源码
[打印本页]
作者:
几许轻唱
时间:
2018-4-9 17:49
标题:
单片机89C52 控制ISD4004语音芯片,多段录放音源码
单片机89C52 控制ISD4004语音芯片,多段录放音
单片机源程序如下:
//AT89c52,ISD4004
//录制k1键要按2次,led1亮,才可以K2播放。
//录制并播放后,地址变为下一个,可以进行第二段语音的录放。
#include <reg51.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
////////定义放音命令,定义常量//////
#define ISDPOWERUP 0X20 //ISD4004上电
#define ISDSTOP 0X10 //ISD4004下电
#define OPERSTOP 0X30 //ISD4004停止当前操作
#define PLAYSET 0XE0 //ISD4004从指定地址开始放音
#define PLAYCUR 0XF0 //ISD4004从当前地址开始放音
#define RECSET 0XA0 //ISD4004从指定地址开始录音
#define RECCUR 0XB0 //ISD4004从当前地址开始录音
sbit SS=P1^0;
sbit MOSI=P1^1;
sbit SCLK=P1^3;
sbit INT = P1^4;
sbit k1=P3^1; ////k1键,录音
sbit k2=P3^2; /// k2键,放音
sbit k3=P3^3; /// k3键,停止
sbit LED1=P0^0;
sbit LED2=P0^1;
uint addr;////全局变量,录放音地址
void delay10ms(uint c) //延时
{
unsigned char a, b;
for (;c>0;c--)
{
for (b=38;b>0;b--)
{
for (a=130;a>0;a--);
}
}
}
////////////////放音部分子程序,放音地址由ADDR决定////
void play()
{
uint y;
SS=0;
MOSI=0;//发送开始
SCLK=0;
for(y=0;y<8;y++) //上电
{
SCLK=0;
if((0x20>>y)&0x01)
MOSI=1;
else
MOSI=0;
_nop_();
_nop_();
_nop_();
SCLK=1;
_nop_();
_nop_();
_nop_();
}//发送结束
SS=1;//上电结束
delay10ms(5);
SS=0;
MOSI=0;//发送地址
SCLK=0;
for(y=0;y<16;y++)
{
SCLK=0;
if((addr>>y)&0x01)
MOSI=1;
else
MOSI=0;
_nop_();
_nop_();
_nop_();
SCLK=1;
_nop_();
_nop_();
_nop_();
} //发送地址结束
MOSI=0;//放音
SCLK=0;
for(y=0;y<8;y++)
{
SCLK=0;
if((0xe0>>y)&0x01)
MOSI=1;
else
MOSI=0;
_nop_();
_nop_();
_nop_();
SCLK=1;
_nop_();
_nop_();
_nop_();
}
SS=1;
SS=0;
MOSI=0;//放音
SCLK=0;
for(y=0;y<8;y++)
{
SCLK=0;
if((0xf0>>y)&0x01)MOSI=1;
else MOSI=0;
_nop_();
_nop_();
_nop_();
SCLK=1;
_nop_();
_nop_();
_nop_();
}
SS=1;
}
//////////////////////////录音部分子程序,地址由ADDR决定/////////////////////////
void rec()
{
uint y;
SS=0;
MOSI=0;//发送开始
SCLK=0;
for(y=0;y<8;y++)
{
SCLK=0;
if((0x20>>y)&0x01)MOSI=1;
else MOSI=0;
_nop_();
_nop_();
_nop_();
SCLK=1;
_nop_();
_nop_();
_nop_();
} //发送结束
SS=1; //上电结束
delay10ms(5);
SS=0;
MOSI=0; //发送开始
SCLK=0;
for(y=0;y<8;y++)
{
SCLK=0;
if((0x20>>y)&0x01)MOSI=1;
else MOSI=0;
_nop_();
_nop_();
_nop_();
SCLK=1;
_nop_();
_nop_();
_nop_();
} //发送结束
SS=1; //上电结束
delay10ms(5);
SS=0;
MOSI=0; //发送地址
SCLK=0;
for(y=0;y<16;y++)
{
SCLK=0;
if((addr>>y)&0x01)MOSI=1;
else MOSI=0;
_nop_();
_nop_();
_nop_();
SCLK=1;
_nop_();
_nop_();
_nop_();
} //发送地址结束
MOSI=0;
SCLK=0;
for(y=0;y<8;y++)
{
SCLK=0;
if((0xa0>>y)&0x01)MOSI=1;
else MOSI=0;
_nop_();
_nop_();
_nop_();
SCLK=1;
_nop_();
_nop_();
_nop_();
}
SS=1;
SS=0;
MOSI=0;
SCLK=0;
for(y=0;y<8;y++)
{
SCLK=0;
if((0xb0>>y)&0x01)MOSI=1;
else MOSI=0;
_nop_();
_nop_();
_nop_();
SCLK=1;
_nop_();
_nop_();
_nop_();
}
SS=1;
}
void stop()
{
uchar y;
SS=1;
SS=0;
MOSI=0;//放音
SCLK=0;
for(y=0;y<8;y++)
{
SCLK=0;
if((0x30>>y)&0x01)MOSI=1;
else MOSI=0;
_nop_();
_nop_();
_nop_();
SCLK=1;
_nop_();
_nop_();
_nop_();
}
SS=1;
}
void main()
{
uchar addressArr[]={0x05,0x1E,0x37}; //地址数组,可以自由添加,实现多段语音录放。此处为3段。
uint recNum=0; //recNum为录放地址选择
P1=0xff; //初始化
P2=0xff;
P3=0xff;
while(1)
{
LED1=INT;
LED2=0;
if(k1==0) //录制
{
……………………
…………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码
所有资料51hei提供下载:
89c52 ISD4004.zip
(39.73 KB, 下载次数: 130)
2018-4-9 17:47 上传
点击文件名下载附件
下载积分: 黑币 -5
作者:
cjxpdsxxx
时间:
2018-10-13 16:19
有图没
作者:
小精灵2003
时间:
2020-11-28 14:53
你好,我下载了你的软件,你有没有具体的电路图啊?
作者:
moon84523
时间:
2021-2-27 17:21
只有代码没有电路图,有点坑。对小白来说难实现
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1