加入收藏 | 设为首页 | 会员中心 | 我要投稿 | RSSRSS-巴斯仪表网
您当前的位置:首页 > 电子发烧 > 单片机学习

51单片机控制DDS芯片AD9851的源程序

时间:2013-09-02  来源:123485.com  作者:9stone

;=====定义单片机与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芯片子程序结束====

当然单单给9851送数很简单,我们同样可以由键盘给定十进制的频率来控制输出

单片机用总线接口方案:
MOVX @DPTR,W0
MOVX @DPTR,W1
MOVX @DPTR,W2
MOVX @DPTR,W3
MOVX @DPTR,W4
SETB FQ_UD
CLR  FQ_UD
其中W0高5bit为相位控制字,低3bit为功能控制,建议一般测试用0或1既可。
其中W1~W4为频率控制字,不要为0,也不要太大。比如测试可以发4byte的“2”。
sbit FQ_UD = P1^0;
unsigned char xdata *pByte0;
unsigned char xdata *pByte1;
unsigned char xdata *pByte2;
unsigned char xdata *pByte3;
unsigned char xdata *pByte4;
void wr5byte(unsigned char d0,d1,d2,d3,d4)
{
  *pByte0 = d0;
  *pByte1 = d1;
  *pByte2 = d2;
  *pByte3 = d3;
  *pByte4 = d4;
  FQ_UD = 1;
  FQ_UD = 0;
}
main()
{
  pByte0 = 0xf0ff;
  pByte1 = 0xf0ff;
  pByte2 = 0xf0ff;
  pByte3 = 0xf0ff;
  pByte4 = 0xf0ff;
  RESET = 1;
  RESET = 0;
  wr5byte(1,1,1,1,1);
// wr5byte(0,1,1,1,1);
  while(1);
}


//DDS测试程序
#include <reg51.h>//头文件
//定义AD9851与98C51的接口
sbit W_CLK  = P3^0;
sbit FQ_UD = P3^1;
sbit RESET  = P3^2;

/***频率算法公式*****/
/****f是输出的频率****//*******32位控制字为:Fm  =(f*0xFFFFFFFF)/内部时钟       *******/
unsigned long int Fm=0x0003a411; //实验时候自己设了1KHz结果很精确。外时钟用信号了生器3MHz!!
unsigned char data  tab[]={0x01,0x00,0x00,0x00,0x00};//(W0)(W4 W3 W2 W1)高——低)注意顺序!
//延时程序
void delay(unsigned int i)
{
while(i--);
}
// 分32位数据分解为4个字节存于tab[]数组的后四个单元,tab[0]为相位和频率的设置单元
void chang(unsigned long int t)
{
unsigned char *i;
i=&t;
tab[1]=(char)*i;
tab[2]=(char)*(i+1);
tab[3]=(char)*(i+2);
tab[4]=(char)*(i+3); 
}
/***主程序*****/
void main(void)
{ unsigned char i;
FQ_UD=0;delay(1);
W_CLK=0;delay(1);
RESET=1;delay(1); //上电先复位一次
RESET=0;delay(1);
chang(Fm); //分离四字节程序
for(i=0;i<5;i++) //****写AD8951***5个字节*********
{ W_CLK=0;delay(1);
  P1=tab;
  W_CLK=1;
}
  FQ_UD=1;delay(1);//输出
  FQ_UD=0;delay(1);      
  while(1); 
}
注意:用并行接口方式!!!


 

分享到:
来顶一下
返回首页
返回首页
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表
栏目导航->单片机学习
  • 电子应用基础
  • 电源技术
  • 无线传输技术
  • 信号处理
  • PCB设计
  • EDA技术
  • 单片机学习
  • 电子工具设备
  • 技术文章
  • 精彩拆解欣赏
  • 推荐资讯
    使用普通运放的仪表放大器
    使用普通运放的仪表放
    3V与5V混合系统中逻辑器接口问题
    3V与5V混合系统中逻辑
    数字PID控制及其改进算法的应用
    数字PID控制及其改进
    恶劣环境下的高性价比AD信号处理数据采集系统
    恶劣环境下的高性价比
    栏目更新
    栏目热门