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

📄 ad9832_fsk.asm

📁 FSK信号发生器,用于AD98XX等DDS芯片,能够更改频率
💻 ASM
字号:
;*******************************************************;	
;							;
;	文件:AD9832_FSK.ASM				;
;	功能:利用AD9832实现FSK调制			;				
;	创建日期:2007.7.31				;
;	作者:曾涛,All rights reserved.		;
;	当前版本:1.0					;
;							;
;*******************************************************;

;	注意事项:
;	AD9832的控制方式:频率和相位选择为内部比特位选择,
;	波特率只能做到4800bps,
;	两个频率字分别为19200hz,9600hz	
;	由于单片机发送数据是先低后高,故需对数据进行按位反转


;*******************************************************:
;		变量及端口定义				;
;*******************************************************;

	FSYNC	EQU	P1.0			;FSYNC为低时,表示要写入数据
	FSELECT	EQU	P1.1			;频率选择管脚
	PSEL0	EQU	P1.3			;相位选择管脚
	PSEL1	EQU	P1.2			

	FRE_WORD00	EQU	30H		;第一个频率字
	FRE_WORD01	EQU	31H	
	FRE_WORD02	EQU	32H
	FRE_WORD03	EQU	33H
	FRE_WORD10	EQU	34H		;第二个频率字
	FRE_WORD11	EQU	35H
	FRE_WORD12	EQU	36H
	FRE_WORD13	EQU	37H

	PHASE_WORD00	EQU	38H		;第一个相位寄存器
	PHASE_WORD01	EQU	39H
	PHASE_WORD10	EQU	3AH		;第二个相位寄存器
	PHASE_WORD11	EQU	3BH	
	PHASE_WORD20	EQU	3CH		;第三个相位寄存器
	PHASE_WORD21	EQU	3DH
	PHASE_WORD30	EQU	3EH		;第四个相位寄存器
	PHASE_WORD31	EQU	3FH

	TEST		EQU	40H		;测试字

	ORG	0000H
	LJMP	START
	ORG	0030H

;*******************************************************;
;		主程序					;
;*******************************************************;

START:	MOV	TEST,#55H
	MOV	SP,#70H
	MOV	SCON,#00H			;串行口工作在方式0
		
	MOV	FRE_WORD00,#55H		;置第一个频率字:0x00192A73
	MOV	FRE_WORD01,#55H			;F0=phase/MCLK*2^32=9600Hz
	MOV	FRE_WORD02,#55H
	MOV	FRE_WORD03,#54H
	MOV	FRE_WORD10,#0AAH		;置第二个频率字:0x003254E7
	MOV	FRE_WORD11,#0AAH			;F1=19200Hz
	MOV	FRE_WORD12,#0AAH
	MOV	FRE_WORD13,#0AAH

	MOV	PHASE_WORD00,#0			;第一个相位寄存器:0
	MOV	PHASE_WORD01,#0
	MOV	PHASE_WORD10,#0FFH		;第二个相位寄存器:pi/2
	MOV	PHASE_WORD11,#0C0H	
	MOV	PHASE_WORD20,#0FFH		;第三个相位寄存器:pi
	MOV	PHASE_WORD21,#0E0H
	MOV	PHASE_WORD30,#0FFH		;第四个相位寄存器:3*pi/2
	MOV	PHASE_WORD31,#0D0H
	
	SETB	FSYNC
	MOV	R3,#1FH			
	MOV	R4,#0
	CALL	WRITE_WORD			;初始化,复位 sleep=1,reset=1,clr=1
	MOV	R3,#03H
	CALL	WRITE_WORD			;RESET=0,sleep=0,clr=0
	
	CALL	SET_FRE				;设置初始频率和相位
	CALL	SET_PHASE
	
	MOV	R3,#05H				;设置资源选择,SELSRC=0,SYNC=1
	CALL	WRITE_WORD			;根据管脚FSELECT选择频率寄存器,R3=0DH时,通过位选
	CLR	PSEL0
	CLR	PSEL1
LOOP:	
	SETB	FSELECT
	NOP
	NOP
	CLR	FSELECT
	JMP	LOOP	
;	MOV	A,TEST
;	RL	A
;	MOV	TEST,A
;	JB	ACC.7,F1			;跳至高频
;	MOV	R3,#0AH				;写控制字改变频率
;	MOV	R4,#0
;	CALL	WRITE_WORD
;	CLR	FSELECT	
;	CALL	BIT_TIME
;	JMP	LOOP
;F1:	;MOV	R3,#1AH
	;MOV	R4,#0
;	CALL	WRITE_WORD
;	SETB	FSELECT
;	CALL	BIT_TIME
;	JMP	LOOP


;*******************************************************;
;		写一个字(控制字或者数字字)		;
;	用R3,R4作为入口参数				;
;*******************************************************;

WRITE_WORD:
	CLR	FSYNC
	MOV	SBUF,R3				;R3高四位存放控制字,低四位存放地址
	JNB	TI,$
	CLR	TI
	MOV	SBUF,R4
	JNB	TI,$
	CLR	TI
	SETB	FSYNC
	RET	


;*******************************************************;
;		设置频率				;
;*******************************************************;
SET_FRE:MOV	R3,#0CH
	MOV	R4,FRE_WORD00
	CALL	WRITE_WORD			;写第一个频率字
	MOV	R3,#84H
	MOV	R4,FRE_WORD01
	CALL	WRITE_WORD			
	MOV	R3,#4CH
	MOV	R4,FRE_WORD02
	CALL	WRITE_WORD			
	MOV	R3,#0C4H
	MOV	R4,FRE_WORD03
	CALL	WRITE_WORD				

	MOV	R3,#2CH
	MOV	R4,FRE_WORD10
	CALL	WRITE_WORD			;写第二个频率字
	MOV	R3,#0A4H
	MOV	R4,FRE_WORD11
	CALL	WRITE_WORD			
	MOV	R3,#6CH
	MOV	R4,FRE_WORD12
	CALL	WRITE_WORD			
	MOV	R3,#0E4H
	MOV	R4,FRE_WORD13
	CALL	WRITE_WORD			
	RET

;*******************************************************;
;		设置相位				;
;*******************************************************;
SET_PHASE:
	MOV	R3,#18H
	MOV	R4,PHASE_WORD00
	CALL	WRITE_WORD			;写第一个相位寄存器
	MOV	R3,#90H
	MOV	R4,PHASE_WORD01
	CALL	WRITE_WORD			
	MOV	R3,#58H
	MOV	R4,PHASE_WORD10
	CALL	WRITE_WORD			;写第二个相位寄存器
	MOV	R3,#0D0H
	MOV	R4,PHASE_WORD11
	CALL	WRITE_WORD			
	MOV	R3,#38H
	MOV	R4,PHASE_WORD20
	CALL	WRITE_WORD			;写第三个相位寄存器
	MOV	R3,#0B0H
	MOV	R4,PHASE_WORD21
	CALL	WRITE_WORD			
	MOV	R3,#78H
	MOV	R4,PHASE_WORD30
	CALL	WRITE_WORD			;写第四个相位寄存器
	MOV	R3,#0F0H
	MOV	R4,PHASE_WORD31
	CALL	WRITE_WORD			
	RET

;*******************************************************;
;		发送一个位的时间			;
;	波特率:9600bps					;
;	时间估算:11.0592M/12/9600=96个机器周期	;
;	前面写控制字时,已经用掉39个机器周期		;
;	剩57个机器周期					;
;*******************************************************;
BIT_TIME:
	MOV	R5,#29				;1  1+(1+2)*18+2=57
D0:	NOP					;1
	DJNZ	R5,D0				;2
	RET					;2
;18为位选的时间延时,当用管脚选时,前面的时间延时为6个机器周期,		

	END

⌨️ 快捷键说明

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