原创 用单片机进行语音的录放 汇编程序

2010-10-9 23:18 1520 4 4 分类: MCU/ 嵌入式

程序如下


;录音地址为1、00~32H、2、33H~64H、3、65H~96H、4、97H~0C8H、5、0C9H~0FAH、6、0FBH~12CH、7、12DH~15EH、8、


;15FH~190H、9、191H~1C2H、10、1C3H~1F4H


SS      EQU P1.1       ;片选这个程序设计的每次的语音时间为5S


SCLK   EQU P1.0       ;ISD4003时钟


MOSI   EQU P1.2       ;数据输入


MIC    EQU P1.3       ;数据输出


INT     EQU P3.2       ;中断


AN0    EQU P0.7       ;执行


AN1    EQU P2.0


AN2    EQU P2.1


AN3    EQU P2.2


AN4    EQU P2.3


AN5    EQU P2.4


AN6    EQU P2.5


AN7    EQU P2.6


AN8    EQU P2.7


LED    EQU P1.7       ;指示灯


;初始化


ORG  0000H          ;


MAIN:


     MOV  SP,#30H    ;设置堆栈


     MOV  P1,#0FFH   ;


     MOV  P2,#0FFH   ;


     MOV  P3,#0FFH   ;


     MOV  P0,#0FFH   ;


     CLR  EA         ;


     SETB LED        ;


;+++++++录音程序+++++++++++


MAS0:


     MOV  R0,#200   ;


MAS1:


     JB    AN0,MAS0            ;等按AN键


     DJNZ  R0,MAS1  


     MOV A,#01H;                  ;有健按下显示录音段


     LCALL DISPLAY


    


     CALL UP        ;ISD上电


     CALL UP        ;再次上电


;******发送SET REC指令******     ;第一段地址00~32H


SETREC:


     MOV   A,#00H                ;发送录音地址低位


     CALL  ISDX


     MOV   A,#0A0H               ;发送录音地址高位和SET REC指令


     CALL  ISDX


     SETB  SS                    ;关片


    


   


;******发送REC指令**********    


REC1:


     MOV   R0,#10    


REC2:


     CALL  YS50                  ;延时录音


     DJNZ   R0,REC2    ;


     CLR   LED                   ;开指示灯


     MOV    A,#0B0H              ;发送REC指令


     CALL   ISDX       ;


     SETB   SS                   ;关片选


     LCALL DELAY10S             ;十秒录音后发送停止命令


     SETB LED                    ;关指示灯


     CALL  STOPP                ;停止当前操作


    


                 


    JB AN0,$                    ;开始第二段录音;


    MOV A,#02H                  ;显示录音段


    LCALL DISPLAY


SETREC2:


     MOV   A,#33H               ;发送录音地址低位    33~64H


     CALL  ISDX


     MOV   A,#0A0H              ;发送录音地址高位和SET REC指令


     CALL  ISDX


     SETB  SS                   ;关片选


    


REC21:                          ;发送REC指令


     MOV   R0,#10     ;


REC22:


     CALL  YS50                  ;延时录音


     DJNZ   R0,REC22    ;


     CLR   LED                   ;开指示灯


     MOV    A,#0B0H              ;发送REC指令


     CALL   ISDX       ;


     SETB   SS                   ;关片选


     LCALL DELAY10S                


     SETB LED                    ;关指示灯


     CALL  STOPP                 ;停止当前操作


     JB AN0,$


    ; 录第三段录音;地址65~96H


     MOV A,#03H


    LCALL DISPLAY


   


SETREC3:              ;发送SETREC指令  


     MOV   A,#65H    ;发送录音地址低位


     CALL  ISDX


     MOV   A,#0A0H   ;发送录音地址高位和SET REC指令


     CALL  ISDX


     SETB  SS        ;关片选


 


REC31:                ;发送REC指令


     MOV   R0,#10     ;


REC32:


     CALL  YS50       ;延时录音


     DJNZ   R0,REC32    ;


     CLR   LED        ;开指示灯


     MOV    A,#0B0H    ;发送REC指令


     CALL   ISDX       ;


     SETB   SS         ;关片选


     LCALL DELAY10S             


     SETB LED        ;关指示灯


     CALL  STOPP      ;停止当前操作


     JB AN0,$


     ;第四段语音  录音地址 97~0C8


     MOV A,#04H


     LCALL DISPLAY


SETREC4:


     MOV   A,#97H    ;发送录音地址低位             第四段


     CALL  ISDX


     MOV   A,#0A0H   ;发送录音地址高位和SET REC指令


     CALL  ISDX


     SETB  SS        ;关片选


;******发送REC指令**********    


REC41:


     MOV   R0,#10     ;


REC42:


     CALL  YS50       ;延时录音


     DJNZ   R0,REC42    ;


     CLR   LED        ;开指示灯


     MOV    A,#0B0H    ;发送REC指令


     CALL   ISDX       ;


     SETB   SS         ;关片选


     LCALL DELAY10S                 ;


     SETB LED        ;关指示灯


     CALL  STOPP      ;停止当前操作


     JB AN0,$


     ;第五段录音    地址0C9H~0FAH


     MOV A,#05H


     LCALL DISPLAY


SETREC5:


     MOV   A,#0C9H    ;发送录音地址低位          


     CALL  ISDX


     MOV   A,#0A0H   ;发送录音地址高位和SET REC指令


     CALL  ISDX


     SETB  SS        ;关片选


;******发送REC指令**********    


REC51:


     MOV   R0,#10     ;


REC52:


     CALL  YS50       ;延时录音


     DJNZ   R0,REC52    ;


     CLR   LED        ;开指示灯


     MOV    A,#0B0H    ;发送REC指令


     CALL   ISDX       ;


     SETB   SS         ;关片选


     LCALL DELAY10S               


     SETB LED         ;关指示灯


     CALL  STOPP      ;停止当前操作


     JB AN0,$


     ;第六段录音  地址0FB~12CH


     MOV A,#06H


     LCALL DISPLAY


SETREC6:


     MOV   A,#0FBH    ;发送录音地址低位       


     CALL  ISDX


     MOV   A,#0A0H   ;发送录音地址高位和SET REC指令


     CALL  ISDX


     SETB  SS        ;关片选


;******发送REC指令**********    


REC61:


     MOV   R0,#10     ;


REC62:


     CALL  YS50       ;延时录音


     DJNZ   R0,REC62    ;


     CLR   LED        ;开指示灯


     MOV    A,#0B0H    ;发送REC指令


     CALL   ISDX       ;


     SETB   SS         ;关片选


     LCALL DELAY10S


     SETB LED        ;关指示灯


     CALL  STOPP      ;停止当前操作


     JB AN0,$


     ;第七段语音     地址12D~15E


     MOV A,#07H


     LCALL DISPLAY


SETREC7:


     MOV   A,#2DH    ;发送录音地址低位           第七段


     CALL  ISDX


     MOV   A,#0A1H   ;发送录音地址高位和SET REC指令


     CALL  ISDX


     SETB  SS        ;关片选


;******发送REC指令**********    


REC71:


     MOV   R0,#10     ;


REC72:


     CALL  YS50       ;延时录音


     DJNZ   R0,REC72    ;


     CLR   LED        ;开指示灯


     MOV    A,#0B0H    ;发送REC指令


     CALL   ISDX       ;


     SETB   SS         ;关片选


     LCALL DELAY10S             


     SETB LED         ;关指示灯


     CALL  STOPP      ;停止当前操作


     JB AN0,$


     ;第八段录音   地址15FH~190H


     MOV A,#08H


     LCALL DISPLAY


SETREC8:


     MOV   A,#5FH    ;发送录音地址低位


     CALL  ISDX


     MOV   A,#0A1H   ;发送录音地址高位和SET REC指令


     CALL  ISDX


     SETB  SS        ;关片选


;******发送REC指令**********    


REC81:


     MOV   R0,#10     ;


REC82:


     CALL  YS50       ;延时录音


     DJNZ  R0,REC82    ;


     CLR   LED        ;开指示灯


     MOV   A,#0B0H    ;发送REC指令


     CALL   ISDX       ;


     SETB   SS         ;关片选


     LCALL DELAY10S                  ;


     SETB LED        ;关指示灯


     CALL  STOPP      ;停止当前操作


     LJMP LETPLAY


 


;*********延时2s**************    


LCALL DELAY1S     


;******播放刚才的录音********


LETPLAY:


     CALL  UP         ;上电


     CALL  UP


     JNB AN1,FIRST


     JNB AN2,SECOND


     JNB AN3,THIRD


     JNB AN4,FOUR


     JNB AN5,FIVE


     JNB AN6,SIX


     JNB AN7,SEVEN


     JNB AN8,EIGHT


     LCALL  YS50


     JMP LETPLAY


FIRST:NOP


SETPLAY:LCALL  FIRST1


        LCALL PLAY


SECOND: LCALL SECOND1


        LJMP PLAY


THIRD:  LCALL THIRD1


        LJMP PLAY


FOUR:   LCALL FOUR1


        LJMP PLAY


FIVE:   LCALL FIVE1


        LJMP PLAY   


SIX:    LCALL SIX1


        LJMP PLAY


SEVEN:  LCALL SEVEN1


        LJMP PLAY


EIGHT:  LCALL EIGHT1


PLAY:    


     MOV   A,#0F0H    ;发送PLAY指令


     CALL  ISDX       ;


     SETB  SS         ;关片选


;******等待EOM标志************  


    JB INT,$


     LJMP LETPLAY


 FIRST1:MOV A,#01H


     LCALL DISPLAY


     MOV   A,#00H     ;发送播放地址低位


     CALL  ISDX


     MOV   A,#0E0H    ;发送播放地址高位及SET PLAY指令


     CALL  ISDX     


     SETB  SS         ;关片选


    


     CLR  LED        ;开指示灯


     RET


   SECOND1:MOV A,#02H


        LCALL DISPLAY


     


        MOV   A,#33H     ;发送播放地址低位


        CALL  ISDX


        MOV   A,#0E0H    ;发送播放地址高位及SET PLAY指令


        CALL  ISDX     


        SETB  SS         ;关片选


        CLR  LED        ;开指示灯


         RET


THIRD1: MOV A,#03H


       LCALL DISPLAY


      MOV   A,#65H     ;发送播放地址低位


     CALL  ISDX


     MOV   A,#0E0H    ;发送播放地址高位及SET PLAY指令


     CALL  ISDX     


     SETB  SS         ;关片选


     CLR  LED        ;开指示灯


     RET


 FOUR1: MOV A,#04H


     LCALL DISPLAY


     MOV A,#97H


     CALL ISDX


     MOV A,#0E0H


     CALL ISDX


     SETB SS


     RET


FIVE1:MOV A,#05H


     LCALL DISPLAY


     MOV A,#0C9H


     CALL ISDX


     MOV A,#0E0H


     CALL ISDX


     SETB SS


     RET


 SIX1:MOV A,#06H


     LCALL DISPLAY


     MOV A,#0FBH


     CALL ISDX


     MOV A,#0E0H


     CALL ISDX


     SETB SS


     RET


 SEVEN1:MOV A,#07H           


     LCALL DISPLAY


     MOV A,#2DH


     CALL ISDX


     MOV A,#0E1H


     CALL ISDX


     SETB SS 


     RET


EIGHT1:MOV A,#08H           ;


     LCALL DISPLAY


     MOV A,#5FH


     CALL ISDX


     MOV A,#0E1H


     CALL ISDX


     SETB SS 


     RET


;ISD上电 << POWERUP >>


UP:


      MOV    A,#20H     ;发00100 XA9~A0


      CALL   ISDX     ;


      SETB   SS        ;关片选


      ACALL YS50     ;50mS延时


      ACALL YS50     ;50mS延时


      RET            ;


;停止当前操作<< STOP >> 8位


STOPP:


      MOV     A,#30H     ;发 0X11 0XXX


      ACALL  ISDX     ;


      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:


      RRC    A         ;


      MOV    MOSI,C     ;数据写 MOSI


      SETB   SCLK      ;时钟SCLK=1


      CLR     SCLK       ;时钟SCLK=0


      DJNZ    R6,ISD1   ;


      RET            ; 


DELAY10S:MOV R3,#2EH


     ST0: MOV R4,#0FFH


     ST1:MOV R5,#0FFH


     ST2:NOP


     DJNZ R5,ST2


     DJNZ R4,ST1


     DJNZ R3,ST0


     RET 


DELAY1S: :MOV R3,#07H


     ST0: MOV R4,#0FFH


     ST1:MOV R5,#0FFH


     ST2:NOP


     DJNZ R5,ST2


     DJNZ R4,ST1


     DJNZ R3,ST0


     RET 


DISPLAY :


        MOV DPTR,#TAB


        MOVC A,@A+DPTR


        MOV P0,A


   RET


TAB: DB 81H,0EDH,0C2H,92H,0B4H,98H,88H,0B3H,80H,90H,0FFH,88H,0BFH


;共阳段码表          "0""1""2" "3""4""5""6""7" "8""9""不亮"“A”“-”


      END        

PARTNER CONTENT

文章评论0条评论)

登录后参与讨论
EE直播间
更多
我要评论
0
4
关闭 站长推荐上一条 /3 下一条