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

📄 dtmf.asm

📁 电话远程控制家电系统单片机开发电话远程控制家电系统单片机开发
💻 ASM
📖 第 1 页 / 共 4 页
字号:
;	DTMF REMOTE CONTROL
;
;	(c) 2003 Radu Constantinescu
;	constantinescuradu @yahoo.com
;	RELEASED UNDER GNU PUBLIC LICENSE
;	
;	SOFTWARE DTMF DECODER 
;	modified Goertzel algorithm
;	timer 2 used to generate interupts at 9765.625hz
;	PWM1 output at 19531.25hz NOT USED
;
;
;	Use 255 samples table	
;	FOR 16F87X / 20 Mhz
;	F sample = 5000000/512 hz = 9765. 625 hz
;
;
;	RC0 BEEP OUT 
;	RC1 DTMF Signal Input - Schmitt trigger 
;	RC2 PWM1 OUT/ not used
;	RC3 HOOK ON OUT
;
;	RB0	= OUTPUT1
;	RB1	= OUTPUT2
;	RB2	= OUTPUT3
;	RB3	= OUTPUT4
;
;	#PASS#1-4#0-1##	SET OUTPUT
;	#PASS#1-4##	VERIFY OUTPUT
;	#PASS#NEWPASS#NEWPASS##	CHANGE PASS
;	PASS IS 10 DIGITS LONG
;
;
;
;
;Started 9/1/02	
;	
;
;
;

#include <p16f877.inc>

Bank0:	MACRO
	bcf STATUS, RP0
	bcf STATUS, RP1
	ENDM
Bank1:	MACRO
	bsf STATUS, RP0
	bcf STATUS, RP1
	ENDM
Bank2:	MACRO
	bcf STATUS, RP0
	bsf STATUS, RP1
	ENDM
Bank3:	MACRO
	bsf STATUS, RP0
	bsf STATUS, RP1
	ENDM



;****************************
;
;User Variables
;
;****************************
COUNT		EQU	H'27'
RESULT		EQU	H'28'
FLAGS		EQU	H'29'
EE_Byte		EQU	H'2A'	; variable for EEwrite
;2b
;2c
;2e
;2f

A697SIN		EQU	H'30'
A697COS		EQU	H'31'	; ACC
A770SIN		EQU	H'32'
A770COS		EQU	H'33'	; ACC
A852SIN		EQU	H'34'
A852COS		EQU	H'35'	; ACC
A941SIN		EQU	H'36'
A941COS		EQU	H'37'	; ACC
A1209SIN	EQU	0X38
A1209COS	EQU	0X39	;ACC
A1336SIN	EQU	0X3A
A1336COS	EQU	0X3B	;ACC
A1447SIN	EQU	0X3C
A1447COS	EQU	0X3D	;ACC
A1633SIN	EQU	0X3E
A1633COS	EQU	0X3F	;ACC

SAMPLEBIT	EQU	0X40
FSR_SAVE_DTMF	EQU	0X41	; DTMF START ROUTINE TEMP
TEMP_VAL	EQU	0X42
TABLECOUNTER	EQU	0X43
TEMP_TIMES	EQU	0X44
LOWTEMPLATE	EQU	0X45
HIGHTEMPLATE	EQU	0X46
BYTE		EQU	0X47
RESULT1		EQU	0X48	; DECODED DIGIT OR 0
PCLATH_SAVE	EQU	0X49
W_TEMP		EQU	0X4A
STATUS_TEMP	EQU	0X4B
FSR_SAVE	EQU	0X4C
TIME0		EQU	0X4D	;TIMEOUT LSB
TIME1		EQU	0X4E
TIME2		EQU	0X4F	;TIMEOUT MSB	
	#DEFINE	DONE		FLAGS,0
	#DEFINE TIMEOUT		FLAGS,1
	#DEFINE BEEP		FLAGS,2
; Utility routines variables
	CBLOCK 0x50
	scrA:	1	; scratch pad	0X50
	scrB:	1
	scrC:	1	
	scrD:	1
	count_1:1	; counter lsb
	count_2:1
	count_3:1
	count_4:1	; counter msb
	dig_10:	1	; display digit 10
	dig_9:	1	; display digit 9
	dig_8:	1	; display digit 8
	dig_7:	1	; display digit 7
	dig_6:	1	; display digit 6
	dig_5:	1	; display digit 5
	dig_4:	1	; display digit 4
	dig_3:	1	; display digit 3
	dig_2:	1	; display digit 2
	dig_1:	1	; display digit 1
	dig_0:	1	; end of string 0 0X62

PSS0:		1	;PASSWORD 
PSS1:		1	;PASSWORD 
PSS2:		1	;PASSWORD 
PSS3:		1	;PASSWORD 
PSS4:		1	;PASSWORD 
PSS5:		1	;PASSWORD 
PSS6:		1	;PASSWORD 
PSS7:		1	;PASSWORD 
PSS8:		1	;PASSWORD
PSS9:		1	;PASSWORD 


 
	ENDC

	CBLOCK 0x72	; variables for all the RAM pages
	comA:	1
	comB:	1
	comC:	1
	comD:	1
	ENDC

;***********************************************
;EEprom Variables
;***********************************************
OUT0	EQU	0X0

PASS0	EQU	0X8
PASS1	EQU	0X9
PASS2	EQU	0XA
PASS3	EQU	0XB
PASS4	EQU	0XC
PASS5	EQU	0XD
PASS6	EQU	0XE
PASS7	EQU	0XF
PASS8	EQU	0X10
PASS9	EQU	0X11

	ORG	h'2100'		;EEPROM INITIAL VALUES
	DE	0,0,0,0,0,0,0,0
	DE	"1234567890"


;************************************************	



	ORG	0X00
	NOP
	NOP
	CLRF STATUS	; ENSURE BANK0
	GOTO	START
	;GOTO STARTPLUS

INTERRUPT_VECTOR	
	ORG	0X04

;****************************
;
;	CONTEXT SAVE
;
;****************************
C_SAVE	MOVWF	W_TEMP
	SWAPF	STATUS,W
	CLRF	STATUS		;ENSURE BANK0 SAVE
	MOVWF	STATUS_TEMP

	MOVF	PCLATH,W	; SAVE PCLATH
	MOVWF   PCLATH_SAVE

	MOVF	FSR, W
	MOVWF	FSR_SAVE

	BTFSS	PIR1,TMR2IF	; Exit ISR if it wasn't a TMR2 Overflow
	GOTO	C_RESTORE

	BCF	PIR1,TMR2IF	; RESET TIMER 2 INT FLAG


	BTFSC	TIMEOUT		; CHECK IF NOT TIMEOUT
	GOTO CONTIN1
	; DECREMENT TIMEOUT COUNTER
	DECF	TIME0, F
	BTFSS	STATUS, Z
	GOTO CONTIN1		; TIME0<>0
	DECF	TIME1, F
	BTFSS	STATUS, Z
	GOTO CONTIN1		; TIME1<>0
	BSF	TIMEOUT		; SET TIMEOUT=TRUE
CONTIN1:
	; BEEP COUNTER
	BTFSS	BEEP		; CHECK IF NOT BEEP
	GOTO CONTIN2
	DECF	scrA,F
	BTFSS	STATUS, Z
	GOTO CONTIN2		
	movlw	1
	xorwf	PORTC, F	; flip port C0
	MOVF	TIME2, W	; RELOAD DELAY
	MOVWF	scrA
CONTIN2:

	BTFSC	DONE
	GOTO	C_RESTORE	; Skip if done

;*****************************

	;TEST LEVEL of RC1 and set BYTE

	CLRF	BYTE
	BTFSS	PORTC, 1	
	GOTO	CONTINUE
PIN_HIGH
	COMF	BYTE, F
CONTINUE

;*****************************
;
;Get the expected Lowband Bits
;
;*****************************
	MOVLW	LOW	LOWBAND 
	ADDWF	TABLECOUNTER,W
	MOVLW	HIGH	LOWBAND
	BTFSC	STATUS,C
	ADDLW	1
	MOVWF	PCLATH
	
	MOVF	TABLECOUNTER,W
	CALL	LOWBAND

	CLRF	PCLATH
	MOVWF	LOWTEMPLATE
	MOVF	BYTE,W
	XORWF	LOWTEMPLATE, F	; APPLY INPUT OVER MASK
;*****************************
;
;Get the expected Highband Bits 
;
;*****************************
	MOVLW	LOW	HIGHBAND
	ADDWF	TABLECOUNTER,W
	MOVLW	HIGH	HIGHBAND
	BTFSC	STATUS,C
	ADDLW	1
	MOVWF	PCLATH
	
	MOVF	TABLECOUNTER,W
	CALL	HIGHBAND
	
	CLRF	PCLATH
	MOVWF	HIGHTEMPLATE
	MOVF	BYTE,W
	XORWF	HIGHTEMPLATE, F	; APPLY INPUT OVER MASK
;*******************************
;
;	LOWTEMPLATE AND HIGHTEMPLATE 
;	CONTAIN THE EXPECTED VALUES
;	FOR THE INCOMING BIT
;
;*******************************

	MOVLW	LOW A697SIN
	MOVWF	FSR		;ACCUMULATOR ADDR
	MOVLW	8
	MOVWF	SAMPLEBIT
COMPAREBITL
	RLF 	LOWTEMPLATE,F
	BTFSS	STATUS,C	
	GOTO	MATCHL
	DECF	INDF,F
	GOTO	CONTINL
MATCHL	
	INCF	INDF,F	
CONTINL
	INCF	FSR,F
	DECFSZ	SAMPLEBIT,F
	GOTO	COMPAREBITL	;FINISH THE BYTE

	MOVLW	LOW A1209SIN
	MOVWF	FSR		;ACCUMULATOR ADDR
	MOVLW	8
	MOVWF	SAMPLEBIT
COMPAREBITH
	RLF 	HIGHTEMPLATE,F
	BTFSS	STATUS,C	
	GOTO	MATCHH
	DECF	INDF,F
	GOTO	CONTINH
MATCHH	
	INCF	INDF,F	
CONTINH
	INCF	FSR,F
	DECFSZ	SAMPLEBIT,F
	GOTO	COMPAREBITH	;FINISH THE BYTE

;********************************
;
; Increment Tablecounter 0..255
;
;********************************
	
	INCF	TABLECOUNTER,F
	MOVF	TABLECOUNTER,W
	XORLW	D'255'		;This is the number of samples to test against (max 7f)
	BTFSS	STATUS,Z
	GOTO	C_RESTORE
	BSF	DONE
; DTMF DECISION ALGORITHM
; compute absolute value  acc = ABS(acc)
	
	MOVLW	H'30'	
	MOVWF	FSR
TESTFORNEG
	BTFSC	INDF,7
	GOTO	NEG
	GOTO	NEXT
NEG
;	SUBTRACT F FROM 0

	MOVF	INDF,W
	SUBLW	0
	MOVWF	INDF
NEXT
	INCF	FSR,F
	MOVF	FSR,W
	XORLW	H'40'
	BTFSS	STATUS,Z
	GOTO	TESTFORNEG

; add acumulator results for sin and cos

	MOVLW	H'30'
	MOVWF	FSR
MORERESULTS
	MOVF	INDF,W
	CLRF	INDF
	INCF	FSR,F
	ADDWF	INDF,F
	MOVF	FSR,W
	INCF	FSR,F
	XORLW	H'3F'
	BTFSS	STATUS,Z
	GOTO	MORERESULTS

; compare acc with 64 of 255 

	MOVLW	0X31
	MOVWF	FSR
TEMPX1
	MOVF	INDF,W
	SUBLW	D'64'		;THRESHOLD
	RRF	RESULT,F
	INCF	FSR,F
	INCF	FSR,F
	MOVF	FSR,W
	XORLW	0X41
	BTFSS	STATUS,Z
	GOTO 	TEMPX1		
	COMF	RESULT,F
; RESULT IS 1633/1477/1336/1209/941/852/770/697 FOR VALUE>64
; DECISION ALGORITHM : A VALUE MUST BE DETECTED AT LEAST 2-3 TIMES 
; BEFORE IS CONSIDERED VALID / 

	MOVF	RESULT, W
	XORWF	TEMP_VAL,W	; COMPARE RESULT WITH TEMP_VAL
	BTFSC	STATUS, Z
	GOTO 	DECI1		; ==
	
	CLRF	TEMP_TIMES	
	MOVF	RESULT,W 	; TEMP_TIMES = 0
	MOVWF	TEMP_VAL	; TEMP_VAL = RESULT
	GOTO	CLEANUP		; START AGAIN
DECI1
	MOVLW	0XFF
	XORWF	TEMP_TIMES,W	; COMPARE TEMP_TIMES/255
	BTFSC	STATUS,Z
	GOTO CLEANUP		; ==255, START AGAIN
	INCF TEMP_TIMES, F	; <> 255, INC TEMP_TIMES
DECI3	
	
	MOVLW	.1		; 2 TIMES DETECTED -1 

	XORWF	TEMP_TIMES,W
	BTFSS	STATUS,Z
	GOTO	CLEANUP		; <> START AGAIN
; GOT ONE VALUE 2 TIMES !!!!!!!!!!!
	CLRW
	XORWF	TEMP_VAL, W	; COMPARE TEMP_VAL / 0
	BTFSC	STATUS,Z
	GOTO CLEANUP		; ==0, START AGAIN
DECI2				; <>0

;**********************************************
; GOT ONE CHARACTER, CONVERT IT TO ASCII....
;**********************************************

	MOVF	RESULT,W	
	XORLW	D'17'
	BTFSC	STATUS,Z
	GOTO	GOTCHA1
	MOVF	RESULT,W
	XORLW	D'33'
	BTFSC	STATUS,Z
	GOTO	GOTCHA2
	MOVF	RESULT,W
	XORLW	D'65'
	BTFSC	STATUS,Z
	GOTO	GOTCHA3
	MOVF	RESULT,W
	XORLW	D'18'
	BTFSC	STATUS,Z
	GOTO	GOTCHA4
	MOVF	RESULT,W
	XORLW	D'34'
	BTFSC	STATUS,Z
	GOTO	GOTCHA5
	MOVF	RESULT,W
	XORLW	D'66'
	BTFSC	STATUS,Z
	GOTO	GOTCHA6
	MOVF	RESULT,W
	XORLW	D'20'
	BTFSC	STATUS,Z
	GOTO	GOTCHA7
	MOVF	RESULT,W
	XORLW	D'36'
	BTFSC	STATUS,Z
	GOTO	GOTCHA8
	MOVF	RESULT,W
	XORLW	D'68'
	BTFSC	STATUS,Z
	GOTO	GOTCHA9
	MOVF	RESULT,W
	XORLW	D'40'
	BTFSC	STATUS,Z
	GOTO	GOTCHA0
	MOVF	RESULT,W
	XORLW	D'72'
	BTFSC	STATUS,Z
	GOTO	GOTCHAPOUND
	MOVF	RESULT,W
	XORLW	D'24'
	BTFSC	STATUS,Z
	GOTO	GOTCHASTAR
; GOT ONLY TRASH...
	CLRF	TEMP_TIMES
	GOTO CLEANUP

; CONVERT ASCII	
	
GOTCHAPOUND
	MOVLW	H'23'
	GOTO	SENDIT
GOTCHASTAR
	MOVLW	H'2A'
	GOTO	SENDIT
GOTCHA1
	MOVLW	H'31'
	GOTO	SENDIT
GOTCHA2
	MOVLW	H'32'
	GOTO	SENDIT
GOTCHA3
	MOVLW	H'33'
	GOTO	SENDIT
GOTCHA4
	MOVLW	H'34'
	GOTO	SENDIT
GOTCHA5
	MOVLW	H'35'
	GOTO	SENDIT
GOTCHA6
	MOVLW	H'36'
	GOTO	SENDIT
GOTCHA7
	MOVLW	H'37'
	GOTO	SENDIT
GOTCHA8
	MOVLW	H'38'
	GOTO	SENDIT
GOTCHA9
	MOVLW	H'39'
	GOTO	SENDIT
GOTCHA0
	MOVLW	H'30'
	GOTO	SENDIT

SENDIT
	
	MOVWF	RESULT1		; PLACE RECEIVED CHAR IN RESULT1
	GOTO	C_RESTORE


CLEANUP
	MOVLW	0X2F		; start -1
	MOVWF	FSR
TEMPXX
	INCF	FSR,F
	CLRF	INDF
	MOVF	FSR,W
	XORLW	0X3F		; CLEAR RAM FROM 0X30-0X3F
	BTFSS	STATUS,Z
	GOTO	TEMPXX
			; table read pointer
	CLRF	TABLECOUNTER
	BCF	DONE		; CLEAR DONE, START 


;********************************
;
; Context Restore
;
;********************************

C_RESTORE
	CLRF	STATUS		;ENSURE BANK0 RESTORE
	MOVF	FSR_SAVE,W
	MOVWF	FSR
	MOVF	PCLATH_SAVE,W
	MOVWF	PCLATH		; RESTORE PCLATH
	SWAPF	STATUS_TEMP,W
	MOVWF	STATUS
	SWAPF	W_TEMP,F
	SWAPF	W_TEMP,W
	RETFIE

⌨️ 快捷键说明

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