;=================================
;ol-om-oh 为一个从低到高三字节的数据,是二
;进制的,代表输出频率,单位hz
;---------------------------------
set_f: ;-----------------
mov r0,#0
mov r1,#0
mov r2,#0
mov r3,#0;此小段程序相当于把频率数据乘以2的32次方
;-----------------
mov r4,ol
mov r5,om
mov r6,oh
mov r7,#0
mov buff8,#40h
mov buff9,#77h
mov buff10,#1bh
mov buff11,#0
mov buff12,#0
mov buff13,#0
mov buff14,#0
mov buff15,#0
lcall div8_8
lcall w_ad9851
ret
;---------------------------------
;=================================
;=================================
;---------------------------------
div8_8:
mov buff16,#64 ;设置移位次数,8字节共64次
mov buff0,#0 ;商清零
mov buff1,#0
mov buff2,#0
mov buff3,#0
mov buff4,#0
mov buff5,#0
mov buff6,#0
mov buff7,#0
;------------------------------
loopdiv: clr c
mov a,r0
rlc a
mov r0,a
;--------------
mov a,r1
rlc a
mov r1,a
;--------------
mov a,r2
rlc a
mov r2,a
;--------------
mov a,r3
rlc a
mov r3,a
;--------------
mov a,r4
rlc a
mov r4,a
;--------------
mov a,r5
rlc a
mov r5,a
;--------------
mov a,r6
rlc a
mov r6,a
;--------------
mov a,r7
rlc a
mov r7,a
;--------------
;--------------
mov a,buff0
rlc a
mov buff0,a
;--------------
mov a,buff1
rlc a
mov buff1,a
;--------------
mov a,buff2
rlc a
mov buff2,a
;--------------
mov a,buff3
rlc a
mov buff3,a
;--------------
mov a,buff4
rlc a
mov buff4,a
;--------------
mov a,buff5
rlc a
mov buff5,a
;--------------
mov a,buff6
rlc a
mov buff6,a
;--------------
mov a,buff7
rlc a
mov buff7,a
;------------------------------
yujian:
;--------------
clr c
mov a,buff0
subb a,buff8
;-------------
mov a,buff1
subb a,buff9
;-------------
mov a,buff2
subb a,buff10
;-------------
mov a,buff3
subb a,buff11
;-------------
mov a,buff4
subb a,buff12
;-------------
mov a,buff5
subb a,buff13
;-------------
mov a,buff6
subb a,buff14
;-------------
mov a,buff7
subb a,buff15
;-------------
jc loop22
inc r0
ajmp zhengshijian
loop22: ljmp loop222
zhengshijian:
;--------------
clr c
mov a,buff0
subb a,buff8
mov buff0,a
;-------------
mov a,buff1
subb a,buff9
mov buff1,a
;-------------
mov a,buff2
subb a,buff10
mov buff2,a
;-------------
mov a,buff3
subb a,buff11
mov buff3,a
;-------------
mov a,buff4
subb a,buff12
mov buff4,a
;-------------
mov a,buff5
subb a,buff13
mov buff5,a
;-------------
mov a,buff6
subb a,buff14
mov buff6,a
;-------------
mov a,buff7
subb a,buff15
mov buff7,a
;-------------
loop222:
djnz buff16,loop11
ret
loop11: ljmp loopdiv
;------------------------------------------------
;================================================
;================================================
;在程序一开始就运行这段程序,用来初始化ad9851的输入方式
;运行一次即可
;------------------------------------------------
setup_ad9851:
clr w_clk ;初始化信号脚
clr fq_ud
setb w_clk ;设置为串行输入
clr w_clk
setb fq_ud
clr fq_ud
ret
;-------------------------------------------------
;=================================================
;=================================================
;写频率数据到ad9851,时钟三倍频已经打开,如果晶振是3000000hz
;则时钟等于18000000hz
;r3-r2-r1-r0四个字节,这个32位的数据代表了将输出频率值(注意,不是等于)
;单位hz
;32位的数据=所需输出的频率值(hz)乘以2的32次方得到的积再除以18000000
;-------------------------------------------------
w_ad9851:
clr fq_ud
mov a,r0 ;数据低位字节
lcall send_data
mov a,r1
lcall send_data
mov a,r2
lcall send_data
mov a,r3 ;数据高位字节
lcall send_data
mov a,#001b
lcall send_data
setb fq_ud
clr fq_ud
ret
;--------------------------------------------------
;==================================================
;==================================================
;--------------------------------------------------
send_data:
mov c,acc.0
mov data7,c
setb w_clk
clr w_clk
mov c,acc.1
mov data7,c
setb w_clk
clr w_clk
mov c,acc.2
mov data7,c
setb w_clk
clr w_clk
mov c,acc.3
mov data7,c
setb w_clk
clr w_clk
mov c,acc.4
mov data7,c
setb w_clk
clr w_clk
mov c,acc.5
mov data7,c
setb w_clk
clr w_clk
mov c,acc.6
mov data7,c
setb w_clk
clr w_clk
mov c,acc.7
mov data7,c
setb w_clk
clr w_clk
ret
;-------------------------------------
;=====================================