论坛风格切换切换到宽版
  • 10783阅读
  • 53回复

哈!刚刚验证通过的51系列单片机DDS芯片AD9851控制源程序(汇编) [复制链接]

上一主题 下一主题
离线BD7RC
 
发帖
3283
只看楼主 倒序阅读 0楼 发表于: 2004-05-02
哈!刚刚用以下子程序在bg6qbv的板子上用51系列单片机验证通过ad9851的控制,原来真的好简单!!

;==================定义单片机与dds芯片的连接========
           dds_data      bit      p0.0
           dds_wclk      bit      p0.1
                dds_fqud      bit      p0.2
;===================================================

;==================定义dds控制数据的存放地址========
                 dds_data0      data      40h
                 dds_data1      data      41h
                 dds_data2      data      42h
                 dds_data3      data      43h
                 dds_data4      data      44h
;===================================================

;==============送数据到dds芯片(串行控制方式)==========
send_dds_data:   mov   r1,#dds_data4     ;从w4的最低位开始送出数据
                                ;一直到w0的最低位结束
              mov   r0,#05h       ;设总共要送出的字节为5x8

                  clr   dds_fqud       ;置低

loop_send_w:     mov   a,@r1         ;把数据由缓冲区送给a准备输出
              clr   c           ;清零
send_1_bit:         mov   r2,#08h       ;循环8次,每次送出一个字节
loop_send:         clr   dds_wclk
                  rrc   a           ;左移
              mov   dds_data,c     ;送出一位数据到dds
                  nop
                  setb dds_wclk
                  nop
                  djnz r2,loop_send     ;判断是否送完这一位的8个字节

              dec   r1
                  djnz r0,loop_send_w   ;判断是否送完5位
              setb dds_fqud
                  nop
                  clr   dds_fqud

                  ret
;==================送数据到dds芯片子程序结束=========
离线bg3fh
发帖
225
只看该作者 1楼 发表于: 2004-05-02
单单给9851送数很简单,如果由键盘给定十进制的频率再输出就要复杂点了!。
离线8200
发帖
1976
只看该作者 2楼 发表于: 2004-05-02
太好了,c2051也能控制吧?
离线BG9GL
发帖
82
只看该作者 3楼 发表于: 2004-05-02
李老师,祝贺祝贺 :d :d :d
离线ahzds
发帖
7423
只看该作者 4楼 发表于: 2004-05-02
'
哈!刚刚用以下子程序在bg6qbv的板子上用51系列单片机验证通过ad9851的控制,原来真的好简单!!
;==================定义单片机与dds芯片的连接========
           dds_data      bit      p0.0
           dds_wclk      bit      p0.1
                dds_fqud      bit      p0.2
;===================================================
;==================定义dds控制数据的存放地址========
                 dds_data0      data      40h
                 dds_data1      data      41h
                 dds_data2      data      42h
                 dds_data3      data      43h
                 dds_data4      data      44h
;===================================================
;==============送数据到dds芯片(串行控制方式)==========
send_dds_data:   mov   r1,#dds_data4     ;从w4的最低位开始送出数据
                                ;一直到w0的最低位结束
              mov   r0,#05h       ;设总共要送出的字节为5x8
                  clr   dds_fqud       ;置低
loop_send_w:     mov   a,@r1         ;把数据由缓冲区送给a准备输出
              clr   c           ;清零
send_1_bit:         mov   r2,#08h       ;循环8次,每次送出一个字节
loop_send:         clr   dds_wclk
                  rrc   a           ;左移
              mov   dds_data,c     ;送出一位数据到dds
                  nop
                  setb dds_wclk
                  nop
                  djnz r2,loop_send     ;判断是否送完这一位的8个字节
              dec   r1
                  djnz r0,loop_send_w   ;判断是否送完5位
              setb dds_fqud
                  nop
                  clr   dds_fqud
                  ret
;==================送数据到dds芯片子程序结束=========
'







好!!李老师!!能否告知输入数据和频率的关系?谢谢!!
离线BD7RC
发帖
3283
只看该作者 5楼 发表于: 2004-05-02
ad9851的输出频率为:
k乘以180mhz再除以2的32次方(单位:mhz)

k就是你要送给dds的参数,是一个4字节32位数据。另外要加上1字节的控制数据。因此控制数据总共为5个字节。
离线ahzds
发帖
7423
只看该作者 6楼 发表于: 2004-05-02
'
ad9851的输出频率为:
k乘以180mhz再除以2的32次方(单位:mhz)
k就是你要送给dds的参数,是一个4字节32位数据。另外要加上1字节的控制数据。因此控制数据总共为5个字节。
'
真是好贴呀!!
离线BG7TBL
发帖
2965
只看该作者 7楼 发表于: 2004-05-03
李老师,五一不去游玩?
离线BD7RC
发帖
3283
只看该作者 8楼 发表于: 2004-05-03
想去,但有一堆事情要处理,看着安排得满满的日程表,想玩都没兴趣了。谁叫俺是苦命人?5555555555......
离线BG7YDO
发帖
3654
只看该作者 9楼 发表于: 2004-05-03
老师就是老师,绝不保留。。。。
    敬礼
离线bg6qbv
发帖
5839
只看该作者 10楼 发表于: 2004-05-03
非常好啊。只要大家不断完善,相信功能会越来越强。
离线BG6AGB
发帖
915
只看该作者 11楼 发表于: 2004-05-03
9851和9850 只有一点不同,就是开不开6x的倍频。

其他的~~~~~~~~~~~一样的。
呵呵~~~
离线bd3si
发帖
13712
只看该作者 12楼 发表于: 2004-05-03
支持!!!!!!!!!!!!!
'
9851和9850 只有一点不同,就是开不开6x的倍频。
其他的~~~~~~~~~~~一样的。
呵呵~~~
'
离线ahzds
发帖
7423
只看该作者 13楼 发表于: 2004-08-26
ad9851的输出频率为:
k乘以180mhz再除以2的32次方(单位:mhz)

用51来算这个天文数字,确实太麻烦了!直接键盘置频,比如输入29。550mhz,需要这样算:
29。550乘以4294967296(2的32次方)再除以180,得出的结果705090464.4266666666666666 ,转换成16进制是2a06d3a0(小数点后都省略了),送给dds就可以了,这个程序让8位机怎么算呀?!不知道哪位有没有简便的办法?
离线bg7vi
发帖
2562
只看该作者 14楼 发表于: 2004-08-26
这个问题一定要请刘茂松老师来回答了! '
ad9851的输出频率为:
k乘以180mhz再除以2的32次方(单位:mhz)
用51来算这个天文数字,确实太麻烦了!直接键盘置频,比如输入29。550mhz,需要这样算:
29。550乘以4294967296(2的32次方)再除以180,得出的结果705090464.4266666666666666 ,转换成16进制是2a06d3a0(小数点后都省略了),送给dds就可以了,这个程序让8位机怎么算呀?!不知道哪位有没有简便的办法?
'
这个问题一定要请刘茂松老师来回答了! ;)
离线bg3fh
发帖
225
只看该作者 15楼 发表于: 2004-08-27
'
ad9851的输出频率为:
k乘以180mhz再除以2的32次方(单位:mhz)
用51来算这个天文数字,确实太麻烦了!直接键盘置频,比如输入29。550mhz,需要这样算:
29。550乘以4294967296(2的32次方)再除以180,得出的结果705090464.4266666666666666 ,转换成16进制是2a06d3a0(小数点后都省略了),送给dds就可以了,这个程序让8位机怎么算呀?!不知道哪位有没有简便的办法?
'

很好办,多字节乘法。
这个程序我做过,明天到单位再告你。
离线BA6BF
发帖
16983
只看该作者 16楼 发表于: 2004-08-27
'
这个问题一定要请刘茂松老师来回答了!
这个问题一定要请刘茂松老师来回答了! ;)
'

为什么是一定呢?哈哈,就他一个人会?

bg6agb小子,给大家说说。
离线迷思
发帖
2388
只看该作者 17楼 发表于: 2004-08-27
'
ad9851的输出频率为:
k乘以180mhz再除以2的32次方(单位:mhz)
用51来算这个天文数字,确实太麻烦了!直接键盘置频,比如输入29。550mhz,需要这样算:
29。550乘以4294967296(2的32次方)再除以180,得出的结果705090464.4266666666666666 ,转换成16进制是2a06d3a0(小数点后都省略了),送给dds就可以了,这个程序让8位机怎么算呀?!不知道哪位有没有简便的办法?
'

乘2的32次方很简单啊,直接在后面加四个字节的00h就行了,除180可以用多字节除法,简单的就就是用减法代替除法,当然不是直接在低位减180,而是从高位开始减
离线BG7TCM
发帖
173
只看该作者 18楼 发表于: 2004-08-27
http://www.hellocq.net/forum/showthread.php?t=88861
'
ad9851的输出频率为:
k乘以180mhz再除以2的32次方(单位:mhz)
用51来算这个天文数字,确实太麻烦了!直接键盘置频,比如输入29。550mhz,需要这样算:
29。550乘以4294967296(2的32次方)再除以180,得出的结果705090464.4266666666666666 ,转换成16进制是2a06d3a0(小数点后都省略了),送给dds就可以了,这个程序让8位机怎么算呀?!不知道哪位有没有简便的办法?
'
应该够十个字符了
离线BD7RC
发帖
3283
只看该作者 19楼 发表于: 2004-08-28
小梁:
你提供的那段程序好像有点小问题,我用它形成的数据送9851时,10.00000m的完全正确,别的就不对了。如果有时间的话,麻烦再看看。谢谢!