文号
t52274
阅读
7668
回复
13
收藏
3
求单片机达人看下AD9850驱动程序
2012/11/16
IP:黑龙江
本人打算做一个单片机AT89S52驱动AD9850的DDS信号发生器。
程序写好了,也用面包板搭了相应的电路,无奈信号就是出不来。
在网上查了很多资料,发现科创这里的高人很多,
于是通过了网站那折磨人的注册流程来到这里,请各位达人不吝赐教。

attachment icon AD9850手册.pdf 318.05KB PDF 171次下载 预览


attachment icon datasheet_AT89S52.pdf 231.04KB PDF 147次下载 预览
请先看程序,我去画原理图,随后放上来。
//header files
#include "reg52.h"            //header file of SCM
#include "stdio.h"            //standard buffered input&output
#include "intrins.h"


#define uint unsigned int
#define uchar unsigned char
//program
sbit w_clk    =P2^2;  //P2.2口接ad9850的w_clk脚/PIN7    AD9850与51单片机接口定义
sbit fq_up    =P2^1;  //P2.1口接ad9850的fq_up脚/PIN8
sbit rset     =P2^0;  //P2.0口接ad9850的rset脚/PIN12
sbit bit_data =P1^7;  //P1.7口接ad9850的D7脚/PIN25   P1为8位数据口
//subfunctions
//serial
void resets()
{
w_clk=0;
fq_up=0;
rset=0;      
rset=1;
rset=0;
w_clk=0;      
w_clk=1;
w_clk=0;
fq_up=0;    
fq_up=1;
fq_up=0;
}
void wrs(unsigned char w0,double freq)
{
unsigned char i,w;
long int y;
double x;
x=4294967295/100;
freq=freq/1000000;
freq=freq*x;
y=freq;
w=(y>>=0);
for(i=0;i<8;i++)
{
bit_data=(w>>i)&0x01;
w_clk=1;
w_clk=0;
}
w=(y>>8);
for(i=0;i<8;i++)
{
bit_data=(w>>i)&0x01;
w_clk=1;
w_clk=0;
}
w=(y>>16);
for(i=0;i<8;i++)
{
bit_data=(w>>i)&0x01;
w_clk=1;
w_clk=0;
}
w=(y>>24);
for(i=0;i<8;i++)
{
bit_data=(w>>i)&0x01;
w_clk=1;
w_clk=0;
}
w=w0;  
for(i=0;i<8;i++)
{
bit_data=(w>>i)&0x01;
w_clk=1;
w_clk=0;
}
fq_up=1;
fq_up=0;
}


main()
{
    P0=0x00;
    DL(20);
    P1=0x00;
    DL(20);
    P2=0x00;
    DL(20);
    P3=0x00;
    DL(20);


    resets();
    DL(20);


    wrs(0x00,100000);
    
    while(1)
{    
    
//    DL(10000);
}
}
ivansdk作者
14年1个月前IP:未同步
470855
2楼
回 1楼(ehco) 的帖子
十分感谢您的回复,我这就去试一下。
另外接成固定的电平就是接到VCC和GND么?还是要用单片机控制?还是要加排阻?
引用
评论
ivansdk作者
14年1个月前IP:未同步
470857
3楼
回 1楼(ehco) 的帖子
用5个for是因为w为unsigned char 如果循环到32位就要用long int了,比较长。
引用
评论
ivansdk作者
14年1个月前IP:未同步
470871
7楼
回 6楼(ehco) 的帖子
哥,你真是我亲哥,太感谢了。
引用
评论
ivansdk作者
14年1个月前IP:未同步
470903
10楼
回 8楼(justinpiggy) 的帖子
这东西下了,不过里面的我差不多全都有的。
我现在怀疑是我的电路没搭好。
愁nee。。
引用
评论
ivansdk作者
14年1个月前IP:未同步
470980
11楼
回 6楼(ehco) 的帖子
查了一下9850和9851的datasheet 发现 9851确实需要设置串口,但是9850没有这个的啊。。
引用
评论
ivansdk作者
14年1个月前IP:未同步
471032
12楼
原来是程序出的错误。
w=(y>>=0);
改为
w=(y>>0);
就可以了。
引用
评论
笔记
{{note.content}}
{{n.user.username}}
{{fromNow(n.toc)}} {{n.status === noteStatus.disabled ? "已屏蔽" : ""}} {{n.status === noteStatus.unknown ? "正在审核" : ""}} {{n.status === noteStatus.deleted ? '已删除' : ''}}
  • 编辑
  • 删除
  • {{n.status === 'disabled' ? "解除屏蔽" : "屏蔽" }}
我也是有底线的