📄 ad9851.c
字号:
//27M晶振,6倍频,系统时钟27*6=162MHz
#include <at89x52.h>
#include <intrins.h>
#include <absacc.h>
#include <math.h>
#include <FLOAT.H>
#include <STDIO.H>
#define defautfrequency 10000000 // 10MHz 正弦波输出
sbit DDS_DATA = P1^0;
sbit DDS_RESET = P1^1;
sbit DDS_FQUD = P1^2;
sbit DDS_WCLK = P1^3;
bdata unsigned char bitable,temp;
sbit High = bitable^7;
sbit Low = bitable^0;
sbit bitable_7 = bitable^7;
sbit bitable_6 = bitable^6;
sbit bitable_5 = bitable^5;
sbit bitable_4 = bitable^4;
sbit bitable_3 = bitable^3;
sbit bitable_2 = bitable^2;
sbit bitable_1 = bitable^1;
sbit bitable_0 = bitable^0;
sbit temp_7 = temp^7;
sbit temp_6 = temp^6;
sbit temp_5 = temp^5;
sbit temp_4 = temp^4;
sbit temp_3 = temp^3;
sbit temp_2 = temp^2;
sbit temp_1 = temp^1;
sbit temp_0 = temp^0;
unsigned char DDS_Parallel_RAM[5]={0x09,0,0,0,0};
unsigned char DDS_Serial_RAM[5] = {0,0,0,0,0x90};
unsigned char delay_time,t1,t2,t3;
//---------------------------------------------
//将并行RAM中数据转换成串行通信之用的RAM
void Chang_Data_From_Parallel_To_Serial()
{
unsigned char a;
for(a=0;a<5;a++)
{
bitable=DDS_Parallel_RAM[a];
temp_0 = bitable_7;
temp_1 = bitable_6;
temp_2 = bitable_5;
temp_3 = bitable_4;
temp_4 = bitable_3;
temp_5 = bitable_2;
temp_6 = bitable_1;
temp_7 = bitable_0;
DDS_Serial_RAM[4-a]=temp;
}
}
//---------------------------------------------
//将输入频率freq转换成并行RAM中的数据
void FREQUENCY_EXCHANG(unsigned long freq)
{
unsigned long fword;
unsigned char *fbyte;
unsigned char a;
double f=freq;
//f=(1/144000000.0)*1024*1024*1024*4;
//f=f*26.51214380247; //27M
f=f*29.82616178;
fword=(unsigned long)f;
if((f-fword)>0.5) fword+=1;
fbyte=&fword;
for(a=1;a<5;a++)
{
DDS_Parallel_RAM[a]=*fbyte;
fbyte++;
}
}
//---------------------------------------------
//初始化DDS芯片,将其切换到串行输入模式
void DDS_INITIAL()
{
DDS_FQUD=0;
DDS_RESET=0;
DDS_RESET=1;
DDS_RESET=0;
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
DDS_WCLK=1;
_nop_();
DDS_WCLK=0;
DDS_FQUD=1;
_nop_();
DDS_FQUD=0;
}
//---------------------------------------------
//子函数:发送一个字节到DDS芯片,
//被SEND_DDS_SERIAL_CONTROL()调用
void SEND_1_BYTE(unsigned char p)
{
unsigned char m;
bitable = p;
for(m=0;m<8;m++)
{
DDS_DATA=High;
DDS_WCLK=1;
DDS_WCLK=0;
bitable<<=1;
}
}
//----------------------------------------------
//发送4字节(40位)控制字
//最后一个字节为相位,倍频控制字
void SEND_DDS_SERIAL_CONTROL()
{
unsigned char a;
for(a=0;a<5;a++)
{
SEND_1_BYTE(DDS_Serial_RAM[a]);
}
}
//----------------------------------------------
void DDS_UPDATE()
{
DDS_FQUD=1;
DDS_FQUD=0;
// DDS_FQUD=1;
// DDS_WCLK=1;
}
//----------------------------------------------
void Delay_X20MS(unsigned char k)
{
for (delay_time=k;delay_time>0;delay_time--)
{
for(t1=1;t1<=98;t1++) _nop_();
for(t2=1;t2<=100;t2++);
}
}
//----------------------------------------------
//高层函数,直接送出频率为f的正弦波,单位Hz
void SEND_DDS_FREQUENCY(unsigned long f)
{
FREQUENCY_EXCHANG(f);
Chang_Data_From_Parallel_To_Serial();
SEND_DDS_SERIAL_CONTROL();
DDS_UPDATE();
}
//----------------------------------------------
main()
{
//unsigned char a;
unsigned long e=2000000;
Delay_X20MS(5);
DDS_INITIAL(); //初始化DDS芯片
SEND_DDS_FREQUENCY(0);
while(1)
{
_nop_();
SEND_DDS_FREQUENCY(e);
e+=2000000;
if(e>20000000)e=2000000;
/*
SEND_DDS_FREQUENCY(100000+5000);
SEND_DDS_FREQUENCY(100000+4000);
SEND_DDS_FREQUENCY(100000+3000);
SEND_DDS_FREQUENCY(100000+2000);
SEND_DDS_FREQUENCY(100000+1000);
SEND_DDS_FREQUENCY(100000-0000);
SEND_DDS_FREQUENCY(100000-1000);
SEND_DDS_FREQUENCY(100000-2000);
SEND_DDS_FREQUENCY(100000-2000);
SEND_DDS_FREQUENCY(100000-3000);
SEND_DDS_FREQUENCY(100000-4000);
SEND_DDS_FREQUENCY(100000-5000);
*/
}
}
//----------------------------------------------*/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -