# include <reg51.h>
# include <stdio.h>
# include <intrins.h>
/********************************************/
sbit ad9833_sdata =P1^0;
sbit ad9833_sclk =P1^1;
sbit ad9833_fsync =P1^2;
/*****************定义全局变量*********************/
/*************************************************/
//延时程序
/**************************************************/
void delay(unsigned int m)
{
unsigned int n;
for (n=0;n<=m;n++)
{
}
}
/*****************************************************/
/**向AD9833写16位数据,严格按照这个时序,不能随意修改否则必出错!**/
/*****************************************************/
void write_ad9833_d16(unsigned int x)
{
int i,w;
ad9833_sclk=1;
ad9833_fsync=1;
ad9833_fsync=0;
//写16位数据
w=x;
for(i=0;i<16;i++)
{
ad9833_sdata=w&0x8000;
ad9833_sclk=0;
ad9833_sclk=1;
w=w<<1;
}
ad9833_fsync=1;
ad9833_sclk=0;
}
/**************************************************/
/*************计算AD9833的28位数据值***************/
/*****************************************************/
/**变量frequence就是频率值,单位Hz,比如输入100Hz,则 frequence为100,需要特别注意的是不能超过12MHz;/*****变量frequence_SFR是设置频率寄存器选择0为频率寄存器0,1为频率寄存器1;*******/
/*****变量WAVE_MODE是设置输出波形选择0为三角波,1为方波,2为正弦波;*******/
/*****变量Phase是设置波形相位值*******/
void ad9833_data(double frequence,unsigned int frequence_SFR,unsigned int WAVE_MODE,unsigned int Phase ){
int frequence_LSB,frequence_MSB,Phs_data;
double frequence_mid,frequence_DATA;
long int frequence_hex;
/*********************************计算频率的16进制值***********************************/
frequence_mid=268435456/25;//适合25M晶振
//如果时钟频率不为25MHZ,修改该处的频率值,单位MHz ,AD9833最大支持25MHz
frequence_DATA=frequence;
frequence_DATA=frequence_DATA/1000000;
frequence_DATA=frequence_DATA*frequence_mid;
frequence_hex=frequence_DATA; //这个frequence_hex的值是32位的一个很大的数字,需要拆分成两个14位进行处理;
frequence_LSB=frequence_hex; //frequence_hex低16位送给frequence_LSB
frequence_LSB=frequence_LSB&0x3fff;//去除最高两位,16位数换去掉高位后变成了14位
frequence_MSB=frequence_hex>>14; //frequence_hex高16位送给frequence_HSB
frequence_MSB=frequence_MSB&0x3fff;//去除最高两位,16位数换去掉高位后变成了14位
/****************************************************************************/
/******************************相位值*************************************/
Phs_data=Phase|0xC000;