📄 ad9832_fsk.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 + -