#include<reg51.h> //头文件
#define uchar unsigned char
#define uint unsigned int
#define ulong unsigned long int
#define AD9851_DATA P1
//定义AD9851和51的接口 8
sbit W_CLK=P2^4;
sbit FQ_UD=P2^3;
sbit RESET=P2^2;
double Fm=0;
uchar tab[]={0x01,0x00,0x0,0x00,0x00};
//tab[0]为相位和频率设置单元,此处初始相位设置为零,开倍频30M*6=180M系
void delay(uint i)
{
while(i--);
}
void delay_long(uint x)
{
uint y,z;
for(y=0;y<1000;y++)
{
for(z=0;z<x;z++) ;
}
}
//分32位数据分解为4个字节存于tab[]数组的后四个单元,tab[0]为相位和频率的
void change(double f)
{
ulong num;
Fm=1073741824/45.0f*f; //误差40000000H,整
num=(ulong)Fm;
tab[1]=(char)(num>>24);
tab[2]=(char)(num>>16)&0xff;
tab[3]=(char)(num>>8)&0xff;
tab[4]=(char)num&0xff;
}
void init()
{
FQ_UD=0;
delay(1);
W_CLK=0;
delay(1);
RESET=1;
delay(10);
RESET=0;
delay(1);
}
void write_data(double frq)
{
uchar i;
change(frq);
for(i=0;i<5;i++)
{
W_CLK=0;
delay(1);
P1=tab[i];
W_CLK=1;
}
FQ_UD=1;
delay(1);
FQ_UD=0;
delay(1);
}
void main()
{
init(); //ad9851初始化
write_data(0.001);
//此处为频率设置,当前频率为(double类型)10MHz。如有误差,自己加补偿。
while(1);
}
正弦波小于1MHZ以下时(实则5Mhz就开始有失真现象),输出波形就失真,上半周期还行,下半周期很尖(越小越是尖)。波形是直接从AD9851,21脚测得。不知道什么原因,请高人指教,不甚感激!!!
} |