📄 isd4004.asm
字号:
;参考程序B: ISD4004.ASM
;SPI接口芯片ISD4004实验(16分种语音录放)
;从分段地址0000H 开始录音,连续录音120秒后停止录音1秒钟,
;再从ISD4004分段地址0000H 开始放音,再连续放音120秒后停止放音。
;ISD4004.ASM 用I/O口操作ISD4004录放音的程序
;按下KEY4为录音操作.放开KEY4为放音操作
$include (c8051f020.inc)
CS EQU P0.7
SCLK EQU P0.0
MISO EQU P0.1
MOSI EQU P0.2
ADDRL EQU 22H ;存放地址低8位的工作单元
ADDRH EQU 20H ; 存放地址高8位的工作单元
COM EQU 23H ; 存放单字节指令的工作单元
ORG 0
AJMP MAIN
ORG 30H
MAIN: MOV SP,#10H
MOV WDTCN, #0DEH ;禁止看门狗
MOV WDTCN,#0ADH
MOV XBR2,#40H ;允许功能选择开关有效
SS: JB P3.7,PPLAY
ACALL RECORD
PPLAY: ACALL PLAY
AJMP SS
RECORD: LCALL BELL ;蜂鸣器响
LCALL POWERUP ;上电指令
LCALL DEL25MS ; 延时25毫秒
LCALL DEL25MS
LCALL POWERUP ;上电指令
LCALL DEL25MS ; 延时25毫秒
LCALL DEL25MS
LCALL BELL ;蜂鸣器响
LCALL BELL ;蜂鸣器响
LCALL SETREC0000;设置录音起始地址为0000H
LCALL REC
LCALL DEL65S
LCALL DEL65S
LCALL STOP ;停止录音。
LCALL BELL;
RET
PLAY: LCALL POWERUP ;上电指令
LCALL DEL25MS ; 延时25毫秒
LCALL DEL25MS
LCALL SETPLAY0000;设置放音起始地址为0000H
LCALL PLAY0
LCALL DEL65S ;延时65秒
LCALL DEL65S
LCALL STOP ;停止放音。
LCALL BELL ;蜂鸣器响
RET
;主机向ISD4004连续发送三字节指令的子程序COMM:
;操作指令(单字节)在COM中,起始地址的高8位在ADDRH中,低8位在ADDRL中。
COMM: CLR CS
MOV A,ADDRL
LCALL TRANSFER
MOV A,ADDRH
LCALL TRANSFER
MOV A,COM
LCALL TRANSFER
SETB CS
LCALL DEL
RET
;延时25毫秒的子程序DEL25MS:
DEL25MS: MOV R7,#50 ;延时25毫秒的子程序(假设主机晶振为6MHZ)
PPP: MOV R6,#00
DJNZ R6,$
DJNZ R7 ,PPP
RET
;延时65秒的子程序DEL65S:
DEL65S: MOV R7,#0H ;延时65秒(假设主机晶振为6MHZ)
PP : MOV R6,#0
PK : MOV R5,#00
DJNZ R5,$
DJNZ R6 ,PK
DJNZ R7, PP
RET
;延时1秒的子程序DEL10S:
DEL1S: MOV R7 , #4 ;延时1秒(假设主机晶振为6MHZ)
AJMP PP
;实验30 16分种语音录放芯片ISD4004实验
;送快进指令的子程序MC:
MC: MOV A ,#0F8H ; 单字节指令:F8H
CLR CS
ACALL TRANSFER
SETB CS
LCALL DEL
RET
;送连续录音指令的子程序:
PLAY0: MOV A ,#0F0H ;送单字节指令:F0H
CLR CS
ACALL TRANSFER
SETB CS
LCALL DEL
RET
;送上电指令(20H)的子程序POWERUP:
POWERUP: MOV A,#20H ; 发送上电指令
CLR CS
ACALL TRANSFER
ACALL DEL25MS ;延时25毫秒
SETB CS
LCALL DEL
RET
;送连续录音指令的子程序:
REC: MOV A,#0B0H ;送单字节指令:B0H
CLR CS
ACALL TRANSFER
SETB CS
LCALL DEL
RET
;送读状态位指令的子程序RINT:
RINT: MOV A ,#30H ; 单字节指令:30H
CLR CS
ACALL TRANSFER
SETB CS
LCALL DEL
RET
;设置快进起始地址为0000H的子程序SETMC:
SETMC: MOV COM ,#0E8H ;送单字节指令:E8H
MOV ADDRL,#0 ;送地址0000H
MOV ADDRH,#0
ACALL COMM
RET
;设置录音起始地址为0000H的子程序SETREC0000:
SETREC0000: CLR CS
MOV COM,#0A0H ;送录音起始地址的指令(0A0H)
MOV ADDRL,#0 ;送录音起始地址0000H
MOV ADDRH,#00
ACALL COMM
SETB CS
RET
SETREC0500: CLR CS
MOV COM,#0A0H ;送录音起始地址的指令(0A0H)
MOV ADDRL,#0 ;送录音起始地址0500H
MOV ADDRH,#05
ACALL COMM
SETB CS
RET
;设置放音起始地址0000H的子程序SETPLAY0000:
SETPLAY0000: CLR CS
MOV COM ,#0E0H ;送单字节指令:E0H
MOV ADDRL,#0 ;送放音起始地址0100H
MOV ADDRH,#0
ACALL COMM
SETB CS
RET
SETPLAY0500: CLR CS
MOV COM ,#0E0H ;送单字节指令:E0H
MOV ADDRL,#0 ;送放音起始地址0100H
MOV ADDRH,#05
ACALL COMM
SETB CS
RET
;送停止指令的子程序STOP:
STOP: MOV A ,#30H ; 单字节指令:30H
CLR CS
ACALL TRANSFER
SETB CS
LCALL DEL
RET
;送停止并掉电指令的子程序STOPWRDN:
STOPWRDN: MOV A ,#10H ; 单字节指令:10H
CLR CS
ACALL TRANSFER
SETB CS
LCALL DEL
RET
;SPI按位串行传送数据的子程序TRANSFER:
;主机通过数据线SOMI将一个字节的数据按位分8次传送到ISD4004中去。
TRANSFER: CLR MOSI
CLR SCLK
MOV R7,#8
BITOUT: CLR SCLK
RRC A
MOV MOSI,C
NOP
NOP
NOP
SETB SCLK
NOP
NOP
NOP
DJNZ R7, BITOUT
RET
DEL:MOV R6,#0FFH
TM0: MOV R7,#0FFH
DJNZ R7,$
DJNZ R6,TM0
RET
;长延时子程序
DELY:MOV R5,#10H
TTM1: ACALL DEL
DJNZ R5,TTM1
RET
DELYL:MOV R5,#0FFH
TTM2:CALL DEL
DJNZ R5,TTM2
RET
;响蜂鸣器
BELL: CLR P3.5
LCALL DELY
SETB P3.5
LCALL DELY
RET
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -