基于STC89C52RC芯片 高频DDS信号发生器AD9851信号源方波正弦波系统设计

【01】设计大致思路

一开始是使用按键进行频率输出数值的增加或者减少,后改进成使用EC11调节输出数值,使数值的输出更加顺滑流畅。

【02】参考资料

链接:https://pan.baidu.com/s/1gz9DuRynFkpIcYw1fGyf6A?pwd=1111 
提取码:1111

【03】部分代码

AD9851.c

#include <AD9851.h>

//*******************************************************************/
//功能:AD9851复位
//形参:无
//返回:无
//详解:AD9851复位(并口模式)
//*******************************************************************/
void ad9851_reset()
{
	ad9851_w_clk=0;
	ad9851_fq_up=0;
	//rest信号
	ad9851_rest=0;
	ad9851_rest=1;
	ad9851_rest=0;
}

//*******************************************************************/
//功能:AD9851复位
//形参:无
//返回:无
//详解: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中写命令与数据
//形参:转移数据变量-->>	w0;频率变量-->>	frequence
//返回:无
//详解:向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中写命令与数据
//形参:转移数据变量-->>	w0;频率变量-->>	frequence
//返回:无
//详解:向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;
}

AD9851.h

#ifndef __AD9851_H_
#define __AD9851_H_
//----------------AD9851 头文件----------------//
#include <stc8.h>
# include <intrins.h>

//----------------AD9851 IO口定义----------------//
sbit ad9851_w_clk    =P2^2;  																		//P2.2口接AD9851的w_clk脚/PIN7
sbit ad9851_fq_up    =P2^4;																			//P2.1口接AD9851的fq_up脚/PIN8
sbit ad9851_rest     =P2^3;  																		//P2.0口接AD9851的rest脚/PIN12
sbit ad9851_bit_data =P2^2;  																		//P1.7口接AD9851的D7脚/PIN25
//P1为8位数据口

//----------------函数快速调用(复制粘贴)列表----------------//
/*******************************************************************
void ad9851_reset(void);																				//ad9851复位(并口模式)
void ad9851_reset_serial(void);																	//ad9851复位(串口模式)
void ad9851_wr_parrel(unsigned char w0,double frequence);				//向AD9851中写命令与数据(并口)
void ad9851_wr_serial(unsigned char w0,double frequence);				//向AD9851中写命令与数据(串口)
******************************************************************/

//----------------函数声明列表----------------//
//
//*******************************************************************/
//功能:AD9851复位
//形参:无
//返回:无
//详解:AD9851复位(并口模式)
//*******************************************************************/
void ad9851_reset();

//*******************************************************************/
//功能:AD9851复位
//形参:无
//返回:无
//详解:AD9851复位(串口模式)
//*******************************************************************/
void ad9851_reset_serial();

//*******************************************************************/
//功能:向AD9851中写命令与数据
//形参:转移数据变量-->>	w0;频率变量-->>	frequence
//返回:无
//详解:向AD9851中写命令与数据(并口)
//*******************************************************************/
void ad9851_wr_parrel(unsigned char w0,double frequence);

//*******************************************************************/
//功能:向AD9851中写命令与数据
//形参:转移数据变量-->>	w0;频率变量-->>	frequence
//返回:无
//详解:向AD9851中写命令与数据(串口)
//*******************************************************************/
void ad9851_wr_serial(unsigned char w0,double frequence);

#endif

LCD12864.c

#include <LCD12864.h>

//*******************************************************************/
//功能:延时函数
//形参:无
//返回:无
//详解:LCD12864写数据、写命令与检测忙状态时提供延时
//*******************************************************************/
void delayNOP()
{
  _nop_();
  _nop_();
  _nop_();
  _nop_();
}

//*******************************************************************/
//功能:延时函数
//形参:毫秒级延时-->>	ms
//返回:无
//详解&#x
  • 1
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值