⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 at89c51

📁 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 <X A9 A8 A7 A6 A5 A4 A3 A2 A1 A0 >
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 <X A9 A8 A7 A6 A5 A4 A3 A2 A1 A0 >
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
        CLR      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
















⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -