⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ad9851.c

📁 ad9851串行编程代码,AD9851是ADI公司开发的单片信号发生芯片
💻 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 + -