标题:
ISD4004+51单片机的录放机与复读机原理图及代码
[打印本页]
作者:
hao17568185487
时间:
2019-5-22 09:37
标题:
ISD4004+51单片机的录放机与复读机原理图及代码
做了一个复读机 直接上传压缩包了 其他的操作我也不太会
AD原理图 加 代码 已经做出来实物了
0.png
(31.5 KB, 下载次数: 33)
下载附件
2019-5-22 16:07 上传
0.png
(4.91 KB, 下载次数: 51)
下载附件
2019-5-22 16:07 上传
单片机源程序如下:
#include <reg52.h>
#include <intrins.h>
#define uchar unsigned char //定义一个常量用标识符uchar代替常量unsignerd char
#define uint unsigned int //定义一个常量用标识符uint代替常量unsignerd int
//=======分段录音首地址定义======================
//ISD4004-8录音时间为8分钟,即8*60=480S, 根据4004的资料,480秒可分为2400段,也就是1S的段数为5段,即从,0000-0005H的内容为1秒.
#define ISD_ADDS1 0x0000 //录音存放地址1 //60秒 0x0000-0x012c//300H // -0x0258 120秒
#define ISD_ADDS2 0x0259 //录音存放地址2 //60 0x012d-0x0258//600H // -0x04AF 120
#define ISD_ADDS3 0x04B0 //录音存放地址3 //60 0x0259-0x0384//900H // -0x0708 120
#define ISD_ADDS4 0x070A //录音存放地址4 //60 0x0385-0x04B0//1200H // -0x0960 120
//========ISD4004指令定义========================
#define POWER_UP 0x20 //上电指令
#define SET_PLAY 0xE0 //指定放音指令
#define PLAY 0xF0 //当前放音指令
#define SET_REC 0xA0 //指定录音指令
#define REC 0xB0 //当前录音指令
#define STOP 0x30 //停止当前操作
#define STOP_WRDN 0xF1 //停止当前操作并掉电
#define SET_MC 0xE1 //指定快进指令
#define MC 0xF1 //快进执行指令
#define RINT 0x30 //读状态:OVF和EOM
//=========ISD4004--c51接口定义=================
//P2.6----->放音指示灯
//P2.7----->录音指示灯
//P2.5----->地址1指示灯
//P2.4----->地址2
//P2.3----->地址3
//P2.2----->地址4
//P3.4----->SET
//P3.7----->REC
//P3.6----->PLAY
//P3.5----->STOP
//P1.1----->SS
//P1.2----->MOSI
//P1.5----->SCLK
sbit SS=P1^1; //片选
sbit MOSI=P1^2; //数据输入
sbit MISO=P1^3; //数据输出
sbit SCLK=P1^5; //ISD4004时钟
sbit INT=P1^6; //溢出中断
sbit RAC=P1^7; //行地址时钟
//==========按键定义==========================
sbit KY_SET=P3^4; //选择
sbit KY_REC=P3^7; //录音
sbit KY_PLAY=P3^6; //放音
sbit KY_STOP=P3^5; //停止
sbit KY_CIRCLE=P3^2; //复读
//==========指示灯定义==========================
sbit LED_PLAY=P2^6;
sbit LED_REC=P2^7;
sbit LED_ADDR1=P2^5;
sbit LED_ADDR2=P2^4;
sbit LED_ADDR3=P2^3;
sbit LED_ADDR4=P2^2;
sbit LED_CIRCLE=P2^1;
//==========ISD4004函数定义===================
void ISD_SPI_Send8( uchar isdx8 ); //spi 串行发送子程序,8位数据,从低到高
void ISD_SPI_Send16( uint isdx16 );//spi 串行发送子程序,16位数据.从低到高
void ISD_Stop(void); //发送 stop 指令
void ISD_PowerUp(void); //发送上电指令,并延迟 50ms
void ISD_PowerDown(void); //发送掉电指令,并延迟 50ms
void ISD_Play(void); //发送放音指令,并延迟 50ms
void ISD_SetPlay(uint add); //发送指定放音指令,并延迟 50ms
void ISD_Rec(void); //发送录音指令,并延迟 50ms
void ISD_SetRec(uint add); //发送指定录音指令,并延迟 50ms
//========延时函数===========================
void Delay1Ms(uchar t); //延时t*1毫秒
void Delay();
//========按键函数===========================
void Key(void);
void id_case1_key();
//=========变量定义==========================
unsigned char id=0;
bit play_flag; //定义一个变量
uchar flag = 0;
/******************************************************************
名称:ISD_SPI_Send8(uchar isdx)
功能:spi 串行发送子程序,8 位数据
指令:
调用:无
返回:无
/******************************************************************/
void ISD_SPI_Send8( uchar isd_data )
{
uchar i;
SS = 0; //选中ISD4004
SCLK = 0;
for(i=0;i<8;i++) //先发低位再发高位,依次发送。循环8次
{
if ((isd_data & 0x01) == 1) //发送最低位
MOSI = 1;
else
MOSI = 0;
isd_data >>= 1; //右移一位
SCLK = 1; //时钟下降沿发送
SCLK = 0;
}
}
/******************************************************************
名称:ISD_SPI_Send16(uint isdx16)
功能:spi 串行发送子程序,16位数据
指令:
调用:无
返回:无
/******************************************************************/
void ISD_SPI_Send16( uint isd_data )
{
uchar i;
SS = 0; //选中ISD4004
SCLK = 0;
for(i=0;i<16;i++) //先发低位再发高位,依次发送。
{
if ((isd_data&0x0001)==1) //发送最低位
MOSI = 1;
else
MOSI = 0;
isd_data = isd_data >> 1; //右移一位
SCLK=1; //时钟下降沿发送
SCLK=0;
}
}
/***************************************************************
名称:ISD_Stop(void)
功能:发送 stop 指令
指令:ISD_SPI_Send8(uchar isdx8);
调用:无
返回:无
/******************************************************************/
void ISD_Stop(void)
{
SS=0;
MOSI=0;
SCLK=0;
ISD_SPI_Send8(STOP);
SS=1;
LED_PLAY=1;
}
/******************************************************************
名称:ISD_PowerUp(void)
功能:发送上电指令
指令:ISD_SPI_Send8(uchar isdx8);
调用:无
返回:无
/******************************************************************/
void ISD_PowerUp(void)
{
SS=0;
MOSI=0;
SCLK=0;
ISD_SPI_Send8(POWER_UP);
SS = 1;
}
/******************************************************************
名称:ISD_PowerDown(void)
功能:发送掉电指令
指令:ISD_SPI_Send8(uchar isdx8);
调用:无
返回:无
/******************************************************************/
void ISD_PowerDown(void)
{
SS=0;
MOSI=0;
SCLK=0;
ISD_SPI_Send8(STOP_WRDN);
SS = 1;
}
/******************************************************************
名称:ISD_Play(void)
功能:发送play指令
指令:ISD_SPI_Send8(uchar isdx8);
调用:无
返回:无
/******************************************************************/
void ISD_Play(void)
{
SS=0;
MOSI=0;
SCLK=0;
ISD_SPI_Send8(PLAY);
SS = 1;
}
/******************************************************************
名称:ISD_Rec(void)
功能:发送rec录音指令
指令:ISD_SPI_Se nd8(uchar isdx8);
调用:无
返回:无
/******************************************************************/
void ISD_Rec(void)
{
SS=0;
MOSI=0;
SCLK=0;
ISD_SPI_Send8(REC);
SS = 1;
}
/******************************************************************
名称:ISD_SetPlay(uint add)
功能:发送setplay指令
指令:ISD_SPI_Send8(uchar isdx8);
ISD_SPI_Send16(uint isdx16);
调用:无
返回:无
/******************************************************************/
void ISD_SetPlay(uint add)
{
Delay1Ms(1);
ISD_SPI_Send16(add); //发送放音起始地址
ISD_SPI_Send8(SET_PLAY); //发送 setplay 指令字节
SS = 1;
}
/******************************************************************
名称:ISD_SetRec(uint add)
功能:发送setrec指令
指令:ISD_SPI_Send8(uchar isdx8);
ISD_SPI_Send16(uint isdx16);
调用:无
返回:无
/******************************************************************/
void ISD_SetRec(uint add)
{
Delay1Ms(1);
ISD_SPI_Send16(add); //发送录音起始地址
ISD_SPI_Send8(SET_REC); //发送 setrec 指令字节
SS = 1;
}
//************************************
/*=========================================================================
名称: void Delay1Ms(uchar t);
功能:延时1ms
参数:t,最大255
调用: 无
返回:无
=========================================================================*/
void Delay1Ms(uchar t)
{
uchar i;
for (;t>0;t--)
{
for (i=0;i<150;i++)
{
_nop_();_nop_();_nop_();_nop_();_nop_();
_nop_();_nop_();_nop_();_nop_();_nop_();
}
}
}
//========================================
void Delay()
{
uchar i;
uint d=5000;
while (d--)
{
i=255;
while (i--);
}
}
void Key(void)
{
if (!KY_STOP)
{
Delay1Ms(15);
if(!KY_STOP)
{
while(!KY_STOP);
ISD_Stop(); //发送停止命令
id=0;
LED_REC=1;
LED_PLAY=1;
play_flag=0;
SS=1;
MOSI=1;
SCLK=1;
}
}
if(!KY_SET)
{
Delay1Ms(15);
if(!KY_SET)
{
Delay1Ms(15);
while(!KY_SET);
++id;
if(id>4)
id=0;
ISD_Stop();
SS=1;
MOSI=1;
SCLK=1;
LED_REC=1;
LED_PLAY=1;
play_flag=0;
}
}
if(id==0){LED_ADDR1=1;LED_ADDR2=1;LED_ADDR3=1;LED_ADDR4=1;}
if(id==1){LED_ADDR1=0;LED_ADDR2=1;LED_ADDR3=1;LED_ADDR4=1;id_case1_key();}
if(id==2){LED_ADDR1=1;LED_ADDR2=0;LED_ADDR3=1;LED_ADDR4=1;id_case1_key();}
if(id==3){LED_ADDR1=1;LED_ADDR2=1;LED_ADDR3=0;LED_ADDR4=1;id_case1_key();}
if(id==4){LED_ADDR1=1;LED_ADDR2=1;LED_ADDR3=1;LED_ADDR4=0;id_case1_key();}
if(play_flag==1)
{
if(!INT && !flag)
{
play_flag=0;
ISD_Stop();
SS=1;
MOSI=1;
SCLK=1;
}
}
}
//==========================================================
void id_case1_key(void)
{
if (!KY_REC)
{
Delay1Ms(15);
if(!KY_REC)
{
while(!KY_REC);
ISD_PowerUp();
Delay1Ms(50);
if(id==1)
{
LED_REC=0;
ISD_SetRec(ISD_ADDS1);
}
else if(id==2)
{
LED_REC=0;
ISD_SetRec(ISD_ADDS2);
}
else if(id==3)
{
LED_REC=0;
ISD_SetRec(ISD_ADDS3);
}
else if(id==4)
{
LED_REC=0;
ISD_SetRec(ISD_ADDS4);
}
ISD_Rec();
ISD_Stop(); //发送停止命令
ISD_PowerDown();
SS=1;
MOSI=1;
SCLK=1;
}
}
if (!KY_PLAY)
{
Delay1Ms(15);
if(!KY_PLAY)
{
while(!KY_PLAY);
ISD_PowerUp();
A:
Delay1Ms(50);
if(id==1)
{
LED_PLAY=0;
ISD_SetPlay(ISD_ADDS1);
}
else if(id==2)
{
LED_PLAY=0;
ISD_SetPlay(ISD_ADDS2);
}
else if(id==3)
{
LED_PLAY=0;
ISD_SetPlay(ISD_ADDS3);
}
else if(id==4)
{
LED_PLAY=0;
ISD_SetPlay(ISD_ADDS4);
}
ISD_Play();
play_flag = 1;
while (INT)
{
Key();
}
if(flag && play_flag)
{
goto A;
}
ISD_Stop();
ISD_PowerDown();
SS=1;
MOSI=1;
SCLK=1;
}
}
}
void main(void)
{
EX0 = 1; //开外部中断1
IT0 = 0; //负边沿触发
EA = 1; //开总中断
flag = 0;
LED_CIRCLE=1;
while(1)
{
Key();
id_case1_key();
}
}
void Outside_Int1(void) interrupt 1
{
Delay1Ms(50);
if(!KY_CIRCLE)
{
flag=~flag;
LED_CIRCLE=~LED_CIRCLE;
}
while(!KY_CIRCLE);
}
复制代码
所有资料51hei提供下载:
新建 WinRAR 压缩文件.rar
(801.95 KB, 下载次数: 60)
2019-5-22 09:36 上传
点击文件名下载附件
下载积分: 黑币 -5
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1