圣源电子制作
标题: AD9851 应用 DDS信号发生器-制作-C51程序-制作文档 [打印本页]
作者: sydz 时间: 2011-10-25 13:49
标题: AD9851 应用 DDS信号发生器-制作-C51程序-制作文档
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: ad9851_reset() //
- //函数2: ad9851_reset_serial() //
- //函数3: ad9851_wr_parrel(unsigned char w0,double frequence)//
- //函数4: ad9851_wr_serial(unsigned char w0,double frequence)//
- //版本: V1.1 //
- //日期: 2008/12/19 //
- //修改日期: 2008/12/19 //
- //编写者: my_dds(my_dds@163.com) //
- //***************************************************//
- // 子程序说明 //
- //***************************************************//
- //函数1: ad9851_reset()
- // 复位ad9851,之后为并口写入模式
- //函数2: ad9851_reset_serial()
- // 复位ad9851,之后为串口写入模式
- //函数3: ad9851_wr_parrel(unsigned char w0,double frequence)
- // 并口写ad9851数据,w0为ad9851中w0的数据,frequence
- // 为写入的频率
- //函数4: ad9851_wr_serial(unsigned char w0,double frequence)
- // 串口写ad9851数据,w0为ad9851中w0的数据,frequence
- // 为写入的频率
- //需定义的位:
- //ad9851_w_clk ;
- //ad9851_fq_up ;
- //ad9851_rest ;
- //ad9851_bit_data ;
- //例:
- //sbit ad9851_w_clk =P2^2;
- //sbit ad9851_fq_up =P2^1;
- //sbit ad9851_rest =P2^0;
- //sbit ad9851_bit_data =P1^7;
- //***************************************************//
- // 写数据说明 //
- //***************************************************//
- //写数据例:
- // ad9851_reset()
- // wr_lcd02_data(unsigned char x)
- // ad9851_wr_parrel(0x01,1000)
- // ad9851_wr_serial(0x01,1000)
- //***************************************************//
- //---------------------------------------------------//
- // 程序 //
- //---------------------------------------------------//
- # include <reg51.h>
- # include <stdio.h>
- # include <intrins.h>
- sbit ad9851_w_clk =P2^2; //P2.2口接AD9851的w_clk脚/PIN7
- sbit ad9851_fq_up =P2^1; //P2.1口接AD9851的fq_up脚/PIN8
- sbit ad9851_rest =P2^0; //P2.0口接AD9851的rest脚/PIN12
- sbit ad9851_bit_data =P1^7; //P1.7口接AD9851的D7脚/PIN25
- //P1为8位数据口
- //***************************************************//
- // ad9851复位(并口模式) //
- //---------------------------------------------------//
- void ad9851_reset()
- {
- ad9851_w_clk=0;
- ad9851_fq_up=0;
- //rest信号
- ad9851_rest=0;
- ad9851_rest=1;
- ad9851_rest=0;
- }
- //***************************************************//
- // ad9851复位(并口模式) //
- //---------------------------------------------------//
- void ad9851_reset_serial()
- {
- ad9851_w_clk=0;
- ad9851_fq_up=0;
- //rest信号
- ad9851_rest=0;
- ad9851_rest=1;
- ad9851_rest=0;
- //w_clk信号
- ad9851_w_clk=0;
- ad9851_w_clk=1;
- ad9851_w_clk=0;
- //fq_up信号
- ad9851_fq_up=0;
- ad9851_fq_up=1;
- ad9851_fq_up=0;
- }
- //***************************************************//
- // 向ad9851中写命令与数据(并口) //
- //---------------------------------------------------//
- void ad9851_wr_parrel(unsigned char w0,double frequence)
- {
- unsigned char w;
- long int y;
- double x;
- //计算频率的HEX值
- x=4294967295/180;//适合180M晶振/180为最终时钟频率(或30M六倍频)
- //如果时钟频率不为180MHZ,修改该处的频率值,单位MHz !!!
- frequence=frequence/1000000;
- frequence=frequence*x;
- y=frequence;
- //写w0数据
- w=w0;
- P1=w; //w0
- ad9851_w_clk=1;
- ad9851_w_clk=0;
- //写w1数据
- w=(y>>24);
- P1=w; //w1
- ad9851_w_clk=1;
- ad9851_w_clk=0;
- //写w2数据
- w=(y>>16);
- P1=w; //w2
- ad9851_w_clk=1;
- ad9851_w_clk=0;
- //写w3数据
- w=(y>>8);
- P1=w; //w3
- ad9851_w_clk=1;
- ad9851_w_clk=0;
- //写w4数据
- w=(y>>=0);
- P1=w; //w4
- ad9851_w_clk=1;
- ad9851_w_clk=0;
- //移入始能
- ad9851_fq_up=1;
- ad9851_fq_up=0;
- }
- //***************************************************//
- // 向ad9851中写命令与数据(串口) //
- //---------------------------------------------------//
- void ad9851_wr_serial(unsigned char w0,double frequence)
- {
- unsigned char i,w;
- long int y;
- double x;
- //计算频率的HEX值
- x=4294967295/180;//适合180M晶振/180为最终时钟频率(或30M六倍频)
- //如果时钟频率不为180MHZ,修改该处的频率值,单位MHz !!!
- frequence=frequence/1000000;
- frequence=frequence*x;
- y=frequence;
- //写w4数据
- w=(y>>=0);
- for(i=0;i<8;i++)
- {
- ad9851_bit_data=(w>>i)&0x01;
- ad9851_w_clk=1;
- ad9851_w_clk=0;
- }
- //写w3数据
- w=(y>>8);
- for(i=0;i<8;i++)
- {
- ad9851_bit_data=(w>>i)&0x01;
- ad9851_w_clk=1;
- ad9851_w_clk=0;
- }
- //写w2数据
- w=(y>>16);
- for(i=0;i<8;i++)
- {
- ad9851_bit_data=(w>>i)&0x01;
- ad9851_w_clk=1;a
- ad9851_w_clk=0;
- }
- //写w1数据
- w=(y>>24);
- for(i=0;i<8;i++)
- {
- ad9851_bit_data=(w>>i)&0x01;
- ad9851_w_clk=1;
- ad9851_w_clk=0;
- }
- //写w0数据
- w=w0;
- for(i=0;i<8;i++)
- {
- ad9851_bit_data=(w>>i)&0x01;
- ad9851_w_clk=1;
- ad9851_w_clk=0;
- }
- //移入始能
- ad9851_fq_up=1;
- ad9851_fq_up=0;
- }
- //***************************************************//
- // 测试程序1000Hz //
- //---------------------------------------------------//
- main()
- {
- P0=0x00;
- P1=0x00;
- P2=0x00;
- P3=0x00;
- //---------------------------------------------------//
- //并行写1000Hz程序
- ad9851_reset();
- ad9851_wr_parrel(0x01,1000);
- //0X01为开六备频
- //ad9851_wr_parrel(0x00,1000);
- //0X00为不开六备频
- //---------------------------------------------------//
- //---------------------------------------------------//
- //串行写1000Hz程序
- //ad9851_reset_serial();
- //ad9851_wr_serial(0x01,1000);
- //0X01为开六备频
- //ad9851_wr_serial(0x00,1000);
- //0X00为不开六备频
- //---------------------------------------------------//
- while(1)
- {
- }
- }
复制代码 串行测试程序
- //***************************************************//
- //函数1: ad9851_reset() //
- //函数2: ad9851_reset_serial() //
- //函数3: ad9851_wr_parrel(unsigned char w0,double frequence)//
- //函数4: ad9851_wr_serial(unsigned char w0,double frequence)//
- //版本: V1.1 //
- //日期: 2008/12/19 //
- //修改日期: 2008/12/19 //
- //编写者: my_dds(my_dds@163.com) //
- //***************************************************//
- // 子程序说明 //
- //***************************************************//
- //函数1: ad9851_reset()
- // 复位ad9851,之后为并口写入模式
- //函数2: ad9851_reset_serial()
- // 复位ad9851,之后为串口写入模式
- //函数3: ad9851_wr_parrel(unsigned char w0,double frequence)
- // 并口写ad9851数据,w0为ad9851中w0的数据,frequence
- // 为写入的频率
- //函数4: ad9851_wr_serial(unsigned char w0,double frequence)
- // 串口写ad9851数据,w0为ad9851中w0的数据,frequence
- // 为写入的频率
- //需定义的位:
- //ad9851_w_clk ;
- //ad9851_fq_up ;
- //ad9851_rest ;
- //ad9851_bit_data ;
- //例:
- //sbit ad9851_w_clk =P2^2;
- //sbit ad9851_fq_up =P2^1;
- //sbit ad9851_rest =P2^0;
- //sbit ad9851_bit_data =P1^7;
- //***************************************************//
- // 写数据说明 //
- //***************************************************//
- //写数据例:
- // ad9851_reset()
- // wr_lcd02_data(unsigned char x)
- // ad9851_wr_parrel(0x01,1000)
- // ad9851_wr_serial(0x01,1000)
- //***************************************************//
- //---------------------------------------------------//
- // 程序 //
- //---------------------------------------------------//
- # include <reg51.h>
- # include <stdio.h>
- # include <intrins.h>
- sbit ad9851_w_clk =P2^2; //P2.2口接AD9851的w_clk脚/PIN7
- sbit ad9851_fq_up =P2^1; //P2.1口接AD9851的fq_up脚/PIN8
- sbit ad9851_rest =P2^0; //P2.0口接AD9851的rest脚/PIN12
- sbit ad9851_bit_data =P1^7; //P1.7口接AD9851的D7脚/PIN25
- //P1为8位数据口
- //***************************************************//
- // ad9851复位(并口模式) //
- //---------------------------------------------------//
- void ad9851_reset()
- {
- ad9851_w_clk=0;
- ad9851_fq_up=0;
- //rest信号
- ad9851_rest=0;
- ad9851_rest=1;
- ad9851_rest=0;
- }
- //***************************************************//
- // ad9851复位(并口模式) //
- //---------------------------------------------------//
- void ad9851_reset_serial()
- {
- ad9851_w_clk=0;
- ad9851_fq_up=0;
- //rest信号
- ad9851_rest=0;
- ad9851_rest=1;
- ad9851_rest=0;
- //w_clk信号
- ad9851_w_clk=0;
- ad9851_w_clk=1;
- ad9851_w_clk=0;
- //fq_up信号
- ad9851_fq_up=0;
- ad9851_fq_up=1;
- ad9851_fq_up=0;
- }
- //***************************************************//
- // 向ad9851中写命令与数据(并口) //
- //---------------------------------------------------//
- void ad9851_wr_parrel(unsigned char w0,double frequence)
- {
- unsigned char w;
- long int y;
- double x;
- //计算频率的HEX值
- x=4294967295/180;//适合180M晶振/180为最终时钟频率(或30M六倍频)
- //如果时钟频率不为180MHZ,修改该处的频率值,单位MHz !!!
- frequence=frequence/1000000;
- frequence=frequence*x;
- y=frequence;
- //写w0数据
- w=w0;
- P1=w; //w0
- ad9851_w_clk=1;
- ad9851_w_clk=0;
- //写w1数据
- w=(y>>24);
- P1=w; //w1
- ad9851_w_clk=1;
- ad9851_w_clk=0;
- //写w2数据
- w=(y>>16);
- P1=w; //w2
- ad9851_w_clk=1;
- ad9851_w_clk=0;
- //写w3数据
- w=(y>>8);
- P1=w; //w3
- ad9851_w_clk=1;
- ad9851_w_clk=0;
- //写w4数据
- w=(y>>=0);
- P1=w; //w4
- ad9851_w_clk=1;
- ad9851_w_clk=0;
- //移入始能
- ad9851_fq_up=1;
- ad9851_fq_up=0;
- }
- //***************************************************//
- // 向ad9851中写命令与数据(串口) //
- //---------------------------------------------------//
- void ad9851_wr_serial(unsigned char w0,double frequence)
- {
- unsigned char i,w;
- long int y;
- double x;
- //计算频率的HEX值
- x=4294967295/180;//适合180M晶振/180为最终时钟频率(或30M六倍频)
- //如果时钟频率不为180MHZ,修改该处的频率值,单位MHz !!!
- frequence=frequence/1000000;
- frequence=frequence*x;
- y=frequence;
- //写w4数据
- w=(y>>=0);
- for(i=0;i<8;i++)
- {
- ad9851_bit_data=(w>>i)&0x01;
- ad9851_w_clk=1;
- ad9851_w_clk=0;
- }
- //写w3数据
- w=(y>>8);
- for(i=0;i<8;i++)
- {
- ad9851_bit_data=(w>>i)&0x01;
- ad9851_w_clk=1;
- ad9851_w_clk=0;
- }
- //写w2数据
- w=(y>>16);
- for(i=0;i<8;i++)
- {
- ad9851_bit_data=(w>>i)&0x01;
- ad9851_w_clk=1;
- ad9851_w_clk=0;
- }
- //写w1数据
- w=(y>>24);
- for(i=0;i<8;i++)
- {
- ad9851_bit_data=(w>>i)&0x01;
- ad9851_w_clk=1;
- ad9851_w_clk=0;
- }
- //写w0数据
- w=w0;
- for(i=0;i<8;i++)
- {
- ad9851_bit_data=(w>>i)&0x01;
- ad9851_w_clk=1;
- ad9851_w_clk=0;
- }
- //移入始能
- ad9851_fq_up=1;
- ad9851_fq_up=0;
- }
- //***************************************************//
- // 测试程序1000Hz //
- //---------------------------------------------------//
- main()
- {
- P0=0x00;
- P1=0x00;
- P2=0x00;
- P3=0x00;
- //---------------------------------------------------//
- //并行写1000Hz程序
- //ad9851_reset();
- //ad9851_wr_parrel(0x01,1000);
- //0X01为开六备频
- //ad9851_wr_parrel(0x00,1000);
- //0X00为不开六备频
- //---------------------------------------------------//
- //---------------------------------------------------//
- //串行写1000Hz程序
- ad9851_reset_serial();
- ad9851_wr_serial(0x01,1000);
- //0X01为开六备频
- //ad9851_wr_serial(0x00,1000);
- //0X00为不开六备频
- //---------------------------------------------------//
- while(1)
- {
- }
- }
复制代码
(, 下载次数: 35)
(, 下载次数: 30)
(, 下载次数: 33)
下载
欢迎光临 圣源电子制作 (http://bbs.syyyd.com/) |
Powered by Discuz! X3.4 |