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

📄 voice.txt

📁 isd4003参考程序
💻 TXT
字号:
;该程序是简单的测试程序
.include "8515def.inc"
.org $0000
rjmp reset
reset: ldi r16,low(ramend)  ;堆栈指针置初值     
       out spl,r16
       ldi r16,high(ramend)
       out sph,r16
        
                  
       ldi r16,$00          ;设初值,"现在温度是:" ,录音时间范围约3.5s
       sts $0060,r16  
       ldi r16,$20          ;"点" ,录音时间范围约3.5s
       sts $0061,r16       
       ldi r16,$40          ;"摄氏度",录音时间范围约3.5s
       sts $0062,r16
       ldi r16,$50          ;"0",录音时间范围约1.7s,"0-9"都为1.7s
       sts $0063,r16
       ldi r16,$60          ;"1"
       sts $0064,r16
       ldi r16,$70          ;"2"
       sts $0065,r16
       ldi r16,$80          ;"3"
       sts $0066,r16
       ldi r16,$90          ;"4"
       sts $0067,r16
       ldi r16,$a0          ;"5"
       sts $0068,r16
       ldi r16,$b0          ;"6"
       sts $0069,r16
       ldi r16,$20          ;"7"
       sts $006a,r16
       ldi r16,$20          ;"8"
       sts $006b,r16
       ldi r16,$20          ;"9"
       sts $006c,r16
       ldi r16,$ff          ;用来判断X指针是否已指到到这里
       sts $006d,r16       
 
;******************************初始化****************************************************************            
;设置A,B,C,D口
       ldi r16,$b0         ;定义B口:MOSI,MISO,SCK,SS,INT所用PB的I/O口方向,
       out ddrb,r16
       ldi r16,$ff           ;PB0~PB3带内部上拉电阻
       out portb,r16

	   ldi r16,$04         ;定义C口
	   out ddrc,r16
	   ldi r16,$fb
	   out portc,r16

	   ldi r16,0
	   out ddra,r16
	   ldi r16,$ff
	   out porta,r16 
	   
	   ldi r16,0
	   out ddrd,r16
	   ldi r16,$ff
	   out portd,r16  
;设置外部中断控制方式	   
       ldi r16,0	   ;先禁止INT1和INT0中断  
       out gimsk,r16
       ldi r16,0
       out mcucr,r16       ;INT1和INT0都设为低电平中断
       ldi r16,$c0
       out gimsk,r16	   ;开放INT1和INT0中断 
	   
;设置T/C记时器	   
       ldi r16,0           ;设置T/C中断屏蔽寄存器TIMSK,不允许T0溢出中断
       out timsk,r16
       ldi r16,$05         ;1024分频
       out tccr0,r16

       ldi r16,0           ;清TIFR中的TOV0(T/C0溢出中断标志位)
       out tifr,r16
       rcall delay1
              
       ldi r18,$3c         ;设初值为60,溢出时间为0.025088s,一写入就开始计时       
       out tcnt0,r18
;设置SPI	           
       ldi r16,$70        ;设置SPI控制寄存器 /
       out spcr,r16
       ldi r16,0
       out spsr,r16

        
bb:    ldi Xl,$60         ;指针X,Y置初值,初始化时指向SRAM中$0060
       ldi Xh,$00
ee:    ldi Yl,$60
       ldi Yh,$00

;*********************MAIN程序入口********************************
cc:     ldi r16,0           ;主程序入口,清溢出标志
       out spsr,r16
       clz
	   cbi portc,2
       ld r16,X            ;判断X指针
       cpi r16,$ff
       breq bb
       ld r16,Y            ;判断Y指针
       cpi r16,$ff
       breq ee       
       sbis pina,1        ;pa1=0放音,pa=1录音
	   rcall EXT_INT1
	   rcall EXT_INT0

;录音子程序
;*********************开始录音********************************
EXT_INT0: 
an:    in r16,pina        ;等待an启动
       andi r16,$08
	   cpi r16,0
	   brne an 
	   sbi portc,2         ;开led	      
       in r1,sreg         ;保护标志寄存器
	   
       ldi r16,0          ;清溢出标志
       out spsr,r16       
	                    	   			   
	   rcall pup
	   rcall delay1
	   rcall pup
	   rcall delay1
	   rcall delay1
	   
	   cbi portb,4	    ;SS置低
	   
	   ld r17,X+          ;设定发送录入的地址,共16位,格式为11+5
       out spdr,r17        ;先发低8位,再发高8位
                            ;地址在SRAM里,从0060开始             
dd1:   sbis spsr,7
       rjmp dd1            ;不相等转移
       ldi r16,$a0        
       out spdr,r16
dd2:   sbis spsr,7
       rjmp dd2            ;不相等转移       	                 
          
 
       sbi portb,4          ;把SS拉高,关闭SPI
       
;*************************************************
;等待STOP信号和ISD的INT中断信号,这段时间进行录音     
uu:    sbis pina,2       ;判断stop信号
       rjmp ue
       sbis pind,2       ;判断ISD的INT信号
       rjmp ue
	   rjmp uu
;*************************************************
;发送STOP命令                         
ue:    cbi portb,4          ;把SS拉低,开启SPI
       ldi r16,0          ;清溢出标志
       out spsr,r16    
       ldi r16,$00        ;发送STOP命令
       out spdr,r16
       clz
dd5:   sbis spsr,7
       rjmp dd5            ;不相等转移
       ldi r16,$30
       out spdr,r16
dd6:   sbis spsr,7
       rjmp dd6       
       sbi portb,4          ;把SS拉高,关闭SPI
       
;还需要延时50ms       
       ldi r16,0           ;清TIFR中的TOV0
       out tifr,r16       
       rcall delay1       ;延时约50ms,Tpause|stop
       ldi r16,0           ;清TIFR中的TOV0
       out tifr,r16       
       rcall delay1
      
       out sreg,r1        ;恢复SREG 
	              
       ret                ;子程序返回
;***********************************************************


;放音子程序,从最开始开始放
;*****************开始放音*********************
EXT_INT1:
       in r1,sreg         ;保护标志寄存器

       ldi r16,0          ;清溢出标志
       out spsr,r16
       
	   cbi portb,4    ;SS置低
	   rcall pup
	   rcall delay1
	   
       ld r17,Y+        ;设放音地址,先发低8位,再发高8位
       out spdr,r17
dd7:   sbis spsr,7
       rjmp dd7           ;不相等转移
       ldi r16,$e0               
       out spdr,r16
       
dd8:   sbis spsr,7
       rjmp dd8           ;不相等转移
       rcall delay1
       sbi portb,4         ;把SS拉高,关闭SPI
            
;放音中,等待ISD4003的INT产生中断低电平
;*************************************************
;等待STOP信号和ISD的INT中断信号,这段时间进行放音     
uu1:   sbis pina,2       ;判断stop信号
       rjmp ue1
       sbis pind,2       ;判断ISD的INT信号
       rjmp ue1
	   rjmp uu1
;*************************************************
ue1:   cbi portb,4          ;把SS拉低,开启SPI
       ldi r16,0          ;清溢出标志
       out spsr,r16    
       ldi r16,$00        ;发送STOP命令
       out spdr,r16
       clz
dd10:  sbis spsr,7
       rjmp dd10            ;不相等转移
       ldi r16,$30
       out spdr,r16
dd11:  sbis spsr,7
       rjmp dd11       
       sbi portb,4          ;把SS拉高,关闭SPI
;*************************************************      
;还需要延时50ms       
       ldi r16,0           ;清TIFR中的TOV0
       out tifr,r16       
       rcall delay1       ;延时约50ms,Tpause|stop
       ldi r16,0           ;清TIFR中的TOV0
       out tifr,r16       
       rcall delay1 
       rjmp cc
       ret
;***********************************************************
;***********************启动ISD4003子程序***********************************  
pup:   cbi portb,4	    ;SS置低

       ldi r16,$00        ;先送低8位,LSB先送
       out spdr,r16
d0:    sbis spsr,7
       rjmp d0            
       ldi r16,$20        ;如果低8位发完,继续发高8位
       out spdr,r16               
d1:    sbis spsr,7
       rjmp d1            ;不相等转移 

       ldi r16,0          ;清溢出标志
       out spsr,r16
       sbi portb,4	    ;SS置高	   
	   ret
;*********************延时程序*****************************
delay1:
     ldi r26,0x82
delay2:
     dec r28
     brne delay2
     dec r26
     brne delay2
     ldi r26,0x82
delay3:
     dec r28
     brne delay3
     dec r26
     brne delay3
     ret
;***********************************************************

⌨️ 快捷键说明

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