当前位置:文档之家› AT89C51与ISD4004的接口及录音放音程序设计

AT89C51与ISD4004的接口及录音放音程序设计

AT89C51与ISD4004的接口及录音/放音程序设计

SS EQU P1.0 ;片选
SCLK EQU P1.1 ;ISD4004时钟
MOIS EQU P1.2 ;数据输入
MISO EQU P1.3 ;数据输出
INT EQU P1.4 ;中断
;初始化
ORG 0000H ;
LJMP MAIN ;
MAIN: ORG SP,#10H;
MOV P1,#0FFH;
MOV P2,#0FFH;
MOV P3,#0FFH;
MOV P0,#0FFH;
CLR EA;

MAIN: SETB LED ;关指示灯
LCALL DSTOP ;ISD掉电
MISO: MOV 3AH,#200;
MOSI: JB AN,MISO ;等按AN键
DJNZ 3AH,MOS1 ;
LCALL UP ;ISD上电
MOV 20H,#00H ;低8位地址
MOV 21H,#00H ;高8位地址
JB PR, REC ;PR=1 录音
LJMP PLAY ;PR=0 放音
SETREC: ;指定地址录音
MOV 20H,#00H ;低八为地址
MOV 21H,#00H ;高八位地址
MOV 22H,#0a0H ;操作码
MOV A,20H
LCALL ISDX
MOV A,21H
LCALL ISDX
MOV A,22H
LCALL ISDX
SETB SS

;REC 8位
;从当前地址录音 10110
REC1: MOV 36H,#10;
REC2:LCALL YS50 ;延时录音
DJNZ 36H,REC2 ;
MOV A,0B0H ; 发 1011 0XXX
LCALL ISDX;
SETB SS ;关片选
REC3: MOV 35H,#200;
REC4: JNB INT,REC7 ;OVF=0芯片溢出
JNB AN,REC3 ;
DJNZ 35H,REC4
LCALL STOPP ;停止当前操作
REC5: JNB STOP,REC6 ;中断RESET
JB AN,REC5 ;等待AN=0
LCALL STOPP ;停止当前操作
LJMP REC1;
REC6: CLR SCLK ;时钟SCLK=0
SETB SS ;关片选
LCALL STOPP ;停止当前操作
LJMP MAII ;
REC7: LCALL YS50 ;延时录音
JB AN,REC6 ;等待AN=1
DJNZ 36H,REC7 ;
SETPLAY: ;指定地址录音
MOV 20H,#00H ;低八为地址
MOV 21H,#00H ;高八位地址
MOV 22H,#0E0H ;操作码
MOV A,20H
LCALL ISDX
MOV A,21H
LCALL ISDX
MOV A,22H
LCALL ISDX
SETB SS

;PLAY 8位
;从当前地址放音 11110
PLAY1:MOV A,#0F0H ;发 11110 XXXXXXXX
LCALL ISDX ;发 << SETPLAY >>
SETB SS ;关片选
PLAY2: JNB STOP,REC6 ;STOP=0停止放音
JB INT,PLAY2 ;无OVF、 EOM继续放音
LCALL STOPP ;停止当前操作
;检测OVF
CL

R SS ;开片选
CLR SCLK ;时钟SCLK=0
SETB SCLK ;时钟SCLK=1
JB MISO,REC6 ;芯片到未
CLR SCLK ;时钟SCLK=0
SETB SS ;关片选
LCALL STOPP ;停止当前操作
PLAY3: JNB STOP,REC6 ;中断放音
JB AN,PLAY3 ;等待AN=0
LJMP PLAY1 ;顺序放音
;ISD上电 << POWERUP >>
UP: MOV A,#20H ;发00100 XXXXXXXXXXX
LCALL ISDX;
SETB SS ;关片选
LCALL YS50 ;50mS延时
LCALL YS50 ;50mS延时
RET;

;停止当前操作<< STOP >> 8位
STOPP: MOV A,#30H ;发 0X11 0XXX
LCALL ISDX ;
SETB SS ;关片选
LCALL YS50 ;50mS延时
LCALL YS50 ;50mS延时
RET ;

;停止当前操作掉电<< STOPPWRDN >> 8位
DSTOP: MOV A,#10H ;发0X010 XXXXXXXXXX
LCALL ISDX;
SETB SS ;关片选
LCALL YS50 ;50mS延时
LCALL YS50 ;50mS延时
RET ;
;ISD4004 SPI写入程序 8位数据在A
ISDX: CLR SS ;开片选
MOV R6,#8 ;
CLR SCLK ;时钟SCLK=0
ISD1: MOV C,ACC.0;
MOV MOSI,C ;数据写 MOSI
SETB SCLK ;时钟SCLK=1
RR A;
CLR SCLK ;时钟SCLK=0
DJNZ R6,ISD1;
RET;

;**** 10mS延时 ****
YS10: MOV TMOD,#01H ;
MOV TH0,#0D8H ;10mS延时初值置入
MOV TL0,#0F0H ;(65536-X)*1=10MS
SETB TR0; 65536-(10000/1)=D8F0H
JNB TF0,$ ;
CLR TF0;
CLR TR0;
RET;


;**** 50mS延时 ****
YS50: MOV TMOD,#01H ;
MOV TH0,#3CH ;50mS延时初值置入
MOV TL0,#0B0H ;(65536-X)*1=50MS
SETB TR0 ;65536-(50000/1)
JNB TF0,$ ;
CLR TF0;
CLR TR0;
RET;
END;

LCALL ISDX
SETB SS

















相关主题
文本预览
相关文档 最新文档