欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136
標題:
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.raoushi.com/bbs/)
Powered by Discuz! X3.1