📄 isd.asm
字号:
;89C51-ISD4000语音电路程序AT89C51单片机
;89C51单片机12MHz
;为ISD4002、4003的控制程序,ISD4004的程序须加些改动,请注意程序后边的注释。
SS EQU P1.2 ;片选
SCLK EQU P1.3 ;ISD4003时钟
MOSI EQU P1.1 ;数据输入
MISO EQU P1.0 ;数据输出
INT EQU P1.4 ;中断
ORG 0000H ; 初始化
AJMP start ;
start: MOV SP,#10H ;
MOV P1,#0FFH ;
MOV P2,#0FFH ;
MOV P3,#0FFH ;
MOV P0,#0FFH ;
CLR EA ; 关所有的中断
MAS0: MOV 3AH,#200 ;
MAS1: ACALL UP ;ISD上电
MOV 20H,#00H ;ISD低位地址
MOV 21H,#00H ;ISD高位地址
;SETREC 16位
;从指定地址录音 10100 <X A9 A8 A7 A6 A5 A4 A3 A2 A1 A0 >
REC: MOV A,20H ;发地址 A7-A0
ACALL ISDX ;
MOV A,21H ;发地址 A9-A8
SETB ACC.7 ;
CLR ACC.6 ;
SETB ACC.5 ;
CLR ACC.4 ;
CLR ACC.3 ;
ACALL ISDX ;
SETB SS ;关片选
;REC 8位
;从当前地址录音 10110 <X A9 A8 A7 A6 A5 A4 A3 A2 A1 A0 >
REC1: MOV 36H,#10 ;
REC2: ACALL YS50 ;延时录音
DJNZ 36H,REC2 ;
MOV A,#00H
ACALL ISDX
MOV A,#0B0H ;发 1011 0XXX
ACALL ISDX ;
SETB SS ;关片选
REC3: MOV 35H,#200 ;
REC4: JB INT,REC4 ;OVF=0芯片溢出
CALL STOPP
;SETPLAY 16位
;从指定地址放音 11100 <X A9 A8 A7 A6 A5 A4 A3 A2 A1 A0 >
PLAY:
MOV A,20H ;发地址 A7-A0
ACALL ISDX ;
MOV A,21H ;发地址 A9-A8
SETB ACC.7 ;
SETB ACC.6 ;
SETB ACC.5 ;
CLR ACC.4 ;
CLR ACC.3 ;
ACALL ISDX ;
SETB SS ;关片选
;PLAY 8位
;从当前地址放音 11110 <X A9 A8 A7 A6 A5 A4 A3 A2 A1 A0 >
PLAY1: MOV A,#00H
ACALL ISDX
MOV A,#0F0H ;发 11110 XXXXXXXX
ACALL ISDX ;发 << SETPLAY >>
SETB SS ;关片选
PLAY2:
JB INT,PLAY2 ;无OVF EOM继续放音
ACALL DSTOP ;停止当前操作
JMP start
;ISD上电 << POWERUP >>
UP: MOV A,#00H ;发00100 XXXXXXXXXXX
ACALL ISDX ;
MOV A,#20H ;
ACALL ISDX
SETB SS ;关片选
ACALL YS50 ;50mS延时
ACALL YS50 ;50mS延时
RET ;
;停止当前操作<< STOP >> 8位
STOPP: MOV A,#00H ;发 0X11 0XXX
ACALL ISDX ;
MOV A,#30H
ACALL ISDX
SETB SS ;关片选
ACALL YS50 ;50mS延时
ACALL YS50 ;50mS延时
RET ;
;停止当前操作掉电<< STOPPWRDN >> 8位
DSTOP: MOV A,#00H ;发0X010 XXXXXXXXXX
ACALL ISDX ;
MOV A,#10H
SETB SS ;关片选
ACALL YS50 ;50mS延时
ACALL YS50 ;50mS延时
RET ;
;ISD3300,4003 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延时 ****
YS1: 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
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -