圣源电子制作

 找回密码
 立即注册
查看: 8995|回复: 0
打印 上一主题 下一主题

AD9851 应用 DDS信号发生器-制作-C51程序-制作文档

[复制链接]
跳转到指定楼层
楼主
发表于 2011-10-25 13:49:11 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
AD9850/AD9851模块是采用ADI应用最广泛的DDS(AD9850和AD9851)制作的模块。ADI的性能就不用多说了。模块主要参考AD9850和AD9851的资料做的。
  主要功能特点:
  *  模块能够输出正弦波和方波,2个正弦波和2个方波输出。
AD9850:  0-40MHz
AD9851: 0-70MHz
频率在20-30MHz后谐波越来越大,波形会越来越不干净。
方波:     0-1MHz
  *  采用70MHz的低通滤波器,使波形的SN比更好
  *  并口和串口数据输入可以通过一个跳帽选择
  *  产生DA基准的管脚(PIN12)引出,方便做输出波形的幅度调节应用。
  *  比较器的基准输入端电压由可变电阻产生,调节该电阻可以得到不同的占空比方波
  * AD9850模块采用125MHz的有源晶振,AD9851模块采用30MHZ的有源晶振
  AD9850和AD9851主要区别
*  AD9850的时钟频率最高125MHz,AD9851的时钟频率最高180MHz。输出最高频率AD9851要比AD9850高。
  * AD9850没有6倍频,AD9851

AD9851-并行  测试程序

  1. //***************************************************//
  2. //函数1:           ad9851_reset()                    //
  3. //函数2:           ad9851_reset_serial()             //
  4. //函数3:           ad9851_wr_parrel(unsigned char w0,double frequence)//
  5. //函数4:           ad9851_wr_serial(unsigned char w0,double frequence)//
  6. //版本:              V1.1                            //
  7. //日期:             2008/12/19                      //
  8. //修改日期:         2008/12/19                      //
  9. //编写者:         my_dds(my_dds@163.com)            //
  10. //***************************************************//
  11. //                  子程序说明                       //
  12. //***************************************************//
  13. //函数1:  ad9851_reset()
  14. //        复位ad9851,之后为并口写入模式        
  15. //函数2:  ad9851_reset_serial()
  16. //        复位ad9851,之后为串口写入模式
  17. //函数3:  ad9851_wr_parrel(unsigned char w0,double frequence)
  18. //        并口写ad9851数据,w0为ad9851中w0的数据,frequence
  19. //        为写入的频率        
  20. //函数4:  ad9851_wr_serial(unsigned char w0,double frequence)
  21. //        串口写ad9851数据,w0为ad9851中w0的数据,frequence
  22. //        为写入的频率        
  23. //需定义的位:
  24.          //ad9851_w_clk    ;
  25.          //ad9851_fq_up    ;
  26.          //ad9851_rest     ;
  27.          //ad9851_bit_data ;
  28. //例:
  29.          //sbit ad9851_w_clk    =P2^2;
  30.          //sbit ad9851_fq_up    =P2^1;
  31.          //sbit ad9851_rest     =P2^0;
  32.          //sbit ad9851_bit_data =P1^7;
  33. //***************************************************//
  34. //                 写数据说明                        //
  35. //***************************************************//
  36. //写数据例:
  37. //       ad9851_reset()
  38. //       wr_lcd02_data(unsigned char x)
  39. //       ad9851_wr_parrel(0x01,1000)
  40. //       ad9851_wr_serial(0x01,1000)
  41. //***************************************************//
  42. //---------------------------------------------------//
  43. //                   程序                            //
  44. //---------------------------------------------------//
  45. # include <reg51.h>
  46. # include <stdio.h>
  47. # include <intrins.h>
  48. sbit ad9851_w_clk    =P2^2;  //P2.2口接AD9851的w_clk脚/PIN7
  49. sbit ad9851_fq_up    =P2^1;  //P2.1口接AD9851的fq_up脚/PIN8
  50. sbit ad9851_rest     =P2^0;  //P2.0口接AD9851的rest脚/PIN12
  51. sbit ad9851_bit_data =P1^7;  //P1.7口接AD9851的D7脚/PIN25
  52. //P1为8位数据口
  53. //***************************************************//
  54. //              ad9851复位(并口模式)                 //
  55. //---------------------------------------------------//
  56. void ad9851_reset()
  57. {
  58. ad9851_w_clk=0;
  59. ad9851_fq_up=0;
  60. //rest信号
  61. ad9851_rest=0;
  62. ad9851_rest=1;
  63. ad9851_rest=0;
  64. }
  65. //***************************************************//
  66. //              ad9851复位(并口模式)                 //
  67. //---------------------------------------------------//
  68. void ad9851_reset_serial()
  69. {
  70. ad9851_w_clk=0;
  71. ad9851_fq_up=0;
  72. //rest信号
  73. ad9851_rest=0;
  74. ad9851_rest=1;
  75. ad9851_rest=0;
  76. //w_clk信号
  77. ad9851_w_clk=0;
  78. ad9851_w_clk=1;
  79. ad9851_w_clk=0;
  80. //fq_up信号
  81. ad9851_fq_up=0;
  82. ad9851_fq_up=1;
  83. ad9851_fq_up=0;
  84. }
  85. //***************************************************//
  86. //          向ad9851中写命令与数据(并口)             //
  87. //---------------------------------------------------//
  88. void ad9851_wr_parrel(unsigned char w0,double frequence)
  89. {
  90. unsigned char w;
  91. long int y;
  92. double x;
  93. //计算频率的HEX值
  94. x=4294967295/180;//适合180M晶振/180为最终时钟频率(或30M六倍频)
  95. //如果时钟频率不为180MHZ,修改该处的频率值,单位MHz !!!
  96. frequence=frequence/1000000;
  97. frequence=frequence*x;
  98. y=frequence;
  99. //写w0数据
  100. w=w0;   
  101. P1=w;      //w0
  102. ad9851_w_clk=1;
  103. ad9851_w_clk=0;
  104. //写w1数据
  105. w=(y>>24);
  106. P1=w;      //w1
  107. ad9851_w_clk=1;
  108. ad9851_w_clk=0;
  109. //写w2数据
  110. w=(y>>16);
  111. P1=w;      //w2
  112. ad9851_w_clk=1;
  113. ad9851_w_clk=0;
  114. //写w3数据
  115. w=(y>>8);
  116. P1=w;      //w3
  117. ad9851_w_clk=1;
  118. ad9851_w_clk=0;
  119. //写w4数据
  120. w=(y>>=0);
  121. P1=w;      //w4
  122. ad9851_w_clk=1;
  123. ad9851_w_clk=0;
  124. //移入始能
  125. ad9851_fq_up=1;
  126. ad9851_fq_up=0;
  127. }
  128. //***************************************************//
  129. //          向ad9851中写命令与数据(串口)             //
  130. //---------------------------------------------------//
  131. void ad9851_wr_serial(unsigned char w0,double frequence)
  132. {
  133. unsigned char i,w;
  134. long int y;
  135. double x;
  136. //计算频率的HEX值
  137. x=4294967295/180;//适合180M晶振/180为最终时钟频率(或30M六倍频)
  138. //如果时钟频率不为180MHZ,修改该处的频率值,单位MHz  !!!
  139. frequence=frequence/1000000;
  140. frequence=frequence*x;
  141. y=frequence;
  142. //写w4数据
  143. w=(y>>=0);
  144. for(i=0;i<8;i++)
  145. {
  146. ad9851_bit_data=(w>>i)&0x01;
  147. ad9851_w_clk=1;
  148. ad9851_w_clk=0;
  149. }
  150. //写w3数据
  151. w=(y>>8);
  152. for(i=0;i<8;i++)
  153. {
  154. ad9851_bit_data=(w>>i)&0x01;
  155. ad9851_w_clk=1;
  156. ad9851_w_clk=0;
  157. }
  158. //写w2数据
  159. w=(y>>16);
  160. for(i=0;i<8;i++)
  161. {
  162. ad9851_bit_data=(w>>i)&0x01;
  163. ad9851_w_clk=1;a
  164. ad9851_w_clk=0;
  165. }
  166. //写w1数据
  167. w=(y>>24);
  168. for(i=0;i<8;i++)
  169. {
  170. ad9851_bit_data=(w>>i)&0x01;
  171. ad9851_w_clk=1;
  172. ad9851_w_clk=0;
  173. }
  174. //写w0数据
  175. w=w0;   
  176. for(i=0;i<8;i++)
  177. {
  178. ad9851_bit_data=(w>>i)&0x01;
  179. ad9851_w_clk=1;
  180. ad9851_w_clk=0;
  181. }
  182. //移入始能
  183. ad9851_fq_up=1;
  184. ad9851_fq_up=0;
  185. }
  186. //***************************************************//
  187. //                   测试程序1000Hz                  //
  188. //---------------------------------------------------//
  189. main()
  190. {
  191. P0=0x00;
  192. P1=0x00;
  193. P2=0x00;
  194. P3=0x00;
  195. //---------------------------------------------------//
  196. //并行写1000Hz程序
  197. ad9851_reset();
  198. ad9851_wr_parrel(0x01,1000);
  199. //0X01为开六备频
  200. //ad9851_wr_parrel(0x00,1000);
  201. //0X00为不开六备频
  202. //---------------------------------------------------//
  203. //---------------------------------------------------//
  204. //串行写1000Hz程序
  205. //ad9851_reset_serial();
  206. //ad9851_wr_serial(0x01,1000);
  207. //0X01为开六备频
  208. //ad9851_wr_serial(0x00,1000);
  209. //0X00为不开六备频
  210. //---------------------------------------------------//
  211. while(1)
  212. {
  213. }
  214. }


复制代码
串行测试程序
  1. //***************************************************//
  2. //函数1:           ad9851_reset()                    //
  3. //函数2:           ad9851_reset_serial()             //
  4. //函数3:           ad9851_wr_parrel(unsigned char w0,double frequence)//
  5. //函数4:           ad9851_wr_serial(unsigned char w0,double frequence)//
  6. //版本:              V1.1                            //
  7. //日期:             2008/12/19                      //
  8. //修改日期:         2008/12/19                      //
  9. //编写者:         my_dds(my_dds@163.com)            //
  10. //***************************************************//
  11. //                  子程序说明                       //
  12. //***************************************************//
  13. //函数1:  ad9851_reset()
  14. //        复位ad9851,之后为并口写入模式        
  15. //函数2:  ad9851_reset_serial()
  16. //        复位ad9851,之后为串口写入模式
  17. //函数3:  ad9851_wr_parrel(unsigned char w0,double frequence)
  18. //        并口写ad9851数据,w0为ad9851中w0的数据,frequence
  19. //        为写入的频率        
  20. //函数4:  ad9851_wr_serial(unsigned char w0,double frequence)
  21. //        串口写ad9851数据,w0为ad9851中w0的数据,frequence
  22. //        为写入的频率        
  23. //需定义的位:
  24.          //ad9851_w_clk    ;
  25.          //ad9851_fq_up    ;
  26.          //ad9851_rest     ;
  27.          //ad9851_bit_data ;
  28. //例:
  29.          //sbit ad9851_w_clk    =P2^2;
  30.          //sbit ad9851_fq_up    =P2^1;
  31.          //sbit ad9851_rest     =P2^0;
  32.          //sbit ad9851_bit_data =P1^7;
  33. //***************************************************//
  34. //                 写数据说明                        //
  35. //***************************************************//
  36. //写数据例:
  37. //       ad9851_reset()
  38. //       wr_lcd02_data(unsigned char x)
  39. //       ad9851_wr_parrel(0x01,1000)
  40. //       ad9851_wr_serial(0x01,1000)
  41. //***************************************************//
  42. //---------------------------------------------------//
  43. //                   程序                            //
  44. //---------------------------------------------------//
  45. # include <reg51.h>
  46. # include <stdio.h>
  47. # include <intrins.h>
  48. sbit ad9851_w_clk    =P2^2;  //P2.2口接AD9851的w_clk脚/PIN7
  49. sbit ad9851_fq_up    =P2^1;  //P2.1口接AD9851的fq_up脚/PIN8
  50. sbit ad9851_rest     =P2^0;  //P2.0口接AD9851的rest脚/PIN12
  51. sbit ad9851_bit_data =P1^7;  //P1.7口接AD9851的D7脚/PIN25
  52. //P1为8位数据口
  53. //***************************************************//
  54. //              ad9851复位(并口模式)                 //
  55. //---------------------------------------------------//
  56. void ad9851_reset()
  57. {
  58. ad9851_w_clk=0;
  59. ad9851_fq_up=0;
  60. //rest信号
  61. ad9851_rest=0;
  62. ad9851_rest=1;
  63. ad9851_rest=0;
  64. }
  65. //***************************************************//
  66. //              ad9851复位(并口模式)                 //
  67. //---------------------------------------------------//
  68. void ad9851_reset_serial()
  69. {
  70. ad9851_w_clk=0;
  71. ad9851_fq_up=0;
  72. //rest信号
  73. ad9851_rest=0;
  74. ad9851_rest=1;
  75. ad9851_rest=0;
  76. //w_clk信号
  77. ad9851_w_clk=0;
  78. ad9851_w_clk=1;
  79. ad9851_w_clk=0;
  80. //fq_up信号
  81. ad9851_fq_up=0;
  82. ad9851_fq_up=1;
  83. ad9851_fq_up=0;
  84. }
  85. //***************************************************//
  86. //          向ad9851中写命令与数据(并口)             //
  87. //---------------------------------------------------//
  88. void ad9851_wr_parrel(unsigned char w0,double frequence)
  89. {
  90. unsigned char w;
  91. long int y;
  92. double x;
  93. //计算频率的HEX值
  94. x=4294967295/180;//适合180M晶振/180为最终时钟频率(或30M六倍频)
  95. //如果时钟频率不为180MHZ,修改该处的频率值,单位MHz !!!
  96. frequence=frequence/1000000;
  97. frequence=frequence*x;
  98. y=frequence;
  99. //写w0数据
  100. w=w0;   
  101. P1=w;      //w0
  102. ad9851_w_clk=1;
  103. ad9851_w_clk=0;
  104. //写w1数据
  105. w=(y>>24);
  106. P1=w;      //w1
  107. ad9851_w_clk=1;
  108. ad9851_w_clk=0;
  109. //写w2数据
  110. w=(y>>16);
  111. P1=w;      //w2
  112. ad9851_w_clk=1;
  113. ad9851_w_clk=0;
  114. //写w3数据
  115. w=(y>>8);
  116. P1=w;      //w3
  117. ad9851_w_clk=1;
  118. ad9851_w_clk=0;
  119. //写w4数据
  120. w=(y>>=0);
  121. P1=w;      //w4
  122. ad9851_w_clk=1;
  123. ad9851_w_clk=0;
  124. //移入始能
  125. ad9851_fq_up=1;
  126. ad9851_fq_up=0;
  127. }
  128. //***************************************************//
  129. //          向ad9851中写命令与数据(串口)             //
  130. //---------------------------------------------------//
  131. void ad9851_wr_serial(unsigned char w0,double frequence)
  132. {
  133. unsigned char i,w;
  134. long int y;
  135. double x;
  136. //计算频率的HEX值
  137. x=4294967295/180;//适合180M晶振/180为最终时钟频率(或30M六倍频)
  138. //如果时钟频率不为180MHZ,修改该处的频率值,单位MHz  !!!
  139. frequence=frequence/1000000;
  140. frequence=frequence*x;
  141. y=frequence;
  142. //写w4数据
  143. w=(y>>=0);
  144. for(i=0;i<8;i++)
  145. {
  146. ad9851_bit_data=(w>>i)&0x01;
  147. ad9851_w_clk=1;
  148. ad9851_w_clk=0;
  149. }
  150. //写w3数据
  151. w=(y>>8);
  152. for(i=0;i<8;i++)
  153. {
  154. ad9851_bit_data=(w>>i)&0x01;
  155. ad9851_w_clk=1;
  156. ad9851_w_clk=0;
  157. }
  158. //写w2数据
  159. w=(y>>16);
  160. for(i=0;i<8;i++)
  161. {
  162. ad9851_bit_data=(w>>i)&0x01;
  163. ad9851_w_clk=1;
  164. ad9851_w_clk=0;
  165. }
  166. //写w1数据
  167. w=(y>>24);
  168. for(i=0;i<8;i++)
  169. {
  170. ad9851_bit_data=(w>>i)&0x01;
  171. ad9851_w_clk=1;
  172. ad9851_w_clk=0;
  173. }
  174. //写w0数据
  175. w=w0;   
  176. for(i=0;i<8;i++)
  177. {
  178. ad9851_bit_data=(w>>i)&0x01;
  179. ad9851_w_clk=1;
  180. ad9851_w_clk=0;
  181. }
  182. //移入始能
  183. ad9851_fq_up=1;
  184. ad9851_fq_up=0;
  185. }
  186. //***************************************************//
  187. //                   测试程序1000Hz                  //
  188. //---------------------------------------------------//
  189. main()
  190. {
  191. P0=0x00;
  192. P1=0x00;
  193. P2=0x00;
  194. P3=0x00;
  195. //---------------------------------------------------//
  196. //并行写1000Hz程序
  197. //ad9851_reset();
  198. //ad9851_wr_parrel(0x01,1000);
  199. //0X01为开六备频
  200. //ad9851_wr_parrel(0x00,1000);
  201. //0X00为不开六备频
  202. //---------------------------------------------------//
  203. //---------------------------------------------------//
  204. //串行写1000Hz程序
  205. ad9851_reset_serial();
  206. ad9851_wr_serial(0x01,1000);
  207. //0X01为开六备频
  208. //ad9851_wr_serial(0x00,1000);
  209. //0X00为不开六备频
  210. //---------------------------------------------------//
  211. while(1)
  212. {
  213. }
  214. }





复制代码




下载


回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|联系我们|闽公网安备 35012102000020号|闽ICP备11020110号-1|圣源电子

GMT+8, 2024-11-10 15:07 , Processed in 0.044452 second(s), 20 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表