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

📄 ad9850.c

📁 AD9850.rar
💻 C
字号:
#include<math.h>
#include<reg52.h>
#include"12864_serial.h"
#include"AD9850.H"
#include "intrins.h"

//unsigned char CON_word[5]; 
//Word	data[7]	data[6]	data[5]	data[4]	data[3]	data[2]	data[1]	data[0]
//W0 	Phase b 	Phase b3 	Phase b2 	Phase b1	Phase b0 	Power Down 	Control	    Control
//W1	Freq-b31    Freq-b30	Freq-b29	Freq-b28	Freq-b27	Freq-b26	Freq-b25	Freq-b24
//W2	Freq-b23	Freq-b22	Freq-b21	Freq-b20	Freq-b19	Freq-b18	Freq-b17	Freq-b16
//W3	Freq-b15	Freq-b14	Freq-b13	Freq-b12	Freq-b11	Freq-b10	Freq-b9	Freq-b8
//W4	Freq-b7	    Freq-b6	    Freq-b5	    Freq-b4	    Freq-b3	    Freq-b2	  
//--------------------------------------------------------------------------------------------------
// 函数名称: delay
// 入口参数: N
// 函数功能:延时子程序,实现(16*N+24)us的延时 
// 系统采用12MHz的时钟时,延时满足要求,其它情况需要改动
//--------------------------------------------------------------------------------------------------
  void delay(unsigned  int N)  
  {
  int i; 
  for(i=0;i<N;i++);
  }
//--------------------------------------------------------------------------------------------------
// 函数名称: WRITE_AD9850
// 函数功能: 将控制字写入AD9850
//--------------------------------------------------------------------------------------------------
void WRITE_AD9850(unsigned char CON_word[5])
{  
     unsigned char i;
     FQ_UD=0;
     W_CLK=0;
	 delay(0);
	 CON_word[0]=CON_word[0]&0xFC; //置工作方式选择位为00
     for(i=0;i<5;i++)
     {
     data_OUT=CON_word[i];      //送控制字 
     W_CLK=0;
     delay(0);
     W_CLK=1;                   //上升延
     delay(0);
     }
     FQ_UD=1;               //上升延要求AD9850改变输出
} 


/*
void AD9850_init(void)
 {	
    reset=0;
	reset=1;
	fq_ud=0;
    w_clk=0;
	reset=0;
		                   
	WriteLCD(0x80,"    (AD9850)    ");
	WriteLCD(0x90,"频率:000.000 HZ");
	WriteLCD(0x88,"相位:  0     度");
	WriteLCD(0x98,"  Just Do It... ");
  }*/
/*
void send_fivewords(unsigned char DATA[5])//顺序为F0_31,三位控制,P0_4)
 { unsigned char i;
   
   for(i=0;i<5;i++)
    { 
	  control_words=DATA[i];
	  w_clk=1; 
	  _nop_ ();
	  //for(i=0;i<100;i++);
  	  w_clk=0;
	 }
	fq_ud=1;
	fq_ud=0;
	  
 } */
void AD9850_DISPLAY(float F,float P)
 { unsigned char decimal_code[10]={'0','1','2','3','4','5','6','7','8','9'}	;
   unsigned char display_tmp[8]={'0','0','0','.','0','0','0','\0'};
   unsigned char phasic[6]={'0','0','0','.','0','0'};
   unsigned int bufh,bufl;
   unsigned char i;
    if(F>=1000000)
     { F/=1000;
	   bufh=(unsigned int)(F/1000);
	   bufl=(unsigned int)(F-bufh*1000);
               display_tmp[0]=decimal_code[bufh/100];  bufh%=100;
	           display_tmp[1]=decimal_code[bufh/10] ;  bufh%=10 ;
	           display_tmp[2]=decimal_code[bufh]    ;
	           display_tmp[4]=decimal_code[bufl/100] ;  bufl%=100 ;
	           display_tmp[5]=decimal_code[bufl/10]  ;  bufl%=10 ;
	           display_tmp[6]=decimal_code[bufl]     ;
			   for(i=0;i<2;i++)
			   if(display_tmp[i]=='0')
			       display_tmp[i]=' ';
				else  break;
			  for(i=6;i>=4;i--)
				if(display_tmp[i]=='0')
			       {
				      display_tmp[i]=' ';
				      if(i==4)display_tmp[3]=' ';
					  else;
				    }
				else  break;
	   WriteLCD(0x93,display_tmp);
	   WriteLCD(0x97,"M ");
	   }
	   else if(F>=1000)
	    {      bufh=(unsigned int) (F/1000);
		       bufl=(unsigned int)(F-bufh*1000);
		       display_tmp[0]=decimal_code[bufh/100]; bufh%=100;
	           display_tmp[1]=decimal_code[bufh/10] ; bufh%=10 ;
	           display_tmp[2]=decimal_code[bufh]    ;
	           display_tmp[4]=decimal_code[bufl/100] ; bufl%=100 ;
	           display_tmp[5]=decimal_code[bufl/10]  ;  bufl%=10 ;
	           display_tmp[6]=decimal_code[bufl]     ;
			  for(i=0;i<2;i++)
			   if(display_tmp[i]=='0')
			       display_tmp[i]=' ';
				else  break;
			  for(i=6;i>=4;i--)
				if(display_tmp[i]=='0')
			       {display_tmp[i]=' ';
				    if(i==4)display_tmp[3]=' ';
					else; }
				else  break;
	      WriteLCD(0x93,display_tmp);
	      WriteLCD(0x97,"K ");
		 }
		    else if(F>0)
			    {	bufh=(unsigned int )F;
			      bufl=(unsigned int)(F*1000-bufh*1000);
	              display_tmp[0]=decimal_code[bufh/100]; bufh%=100;
	              display_tmp[1]=decimal_code[bufh/10] ; bufh%=10 ;
	              display_tmp[2]=decimal_code[bufh]    ;
	              display_tmp[4]=decimal_code[bufl/100] ; bufl%=100 ;
	              display_tmp[5]=decimal_code[bufl/10]  ;  bufl%=10 ;
	              display_tmp[6]=decimal_code[bufl]     ;
			       for(i=0;i<2;i++)
			          if(display_tmp[i]=='0')
			           display_tmp[i]=' ';
				      else  break;
			  for(i=6;i>=4;i--)
				if(display_tmp[i]=='0')
			       {display_tmp[i]=' ';
				    if(i==4)display_tmp[3]=' ';
					else; }
				else  break;
	           WriteLCD(0x93,display_tmp);
	           WriteLCD(0x97,"HZ");
			   
			  }
			    if((unsigned int)(P*100)%100==0 )
				 phasic[3]=0;
			    bufh=(unsigned int )P;
				bufl=(unsigned int)(F*100-bufh*100);
			   phasic[0]=decimal_code[bufh/100]  ;bufh%=100 ;
	           phasic[1]=decimal_code[bufh/10]   ;bufh%=10 ;
	           phasic[2]=decimal_code[bufh]    ;   
	           phasic[4]=decimal_code[bufl/10]    ;bufl%=10 ;
	           phasic[5]=decimal_code[bufl]; 
			   for(i=0;i<2;i++)
			   if(phasic[i]=='0')
			       phasic[i]=' ';
				else  break;
			  for(i=5;i>=4;i--)
				if(phasic[i]=='0')
			       {phasic[i]=' ';
				    if(i==4)display_tmp[3]=' ';
					else; }
				else  break;    
	           WriteLCD(0x8B,phasic);      
  }

  void frequency_to_phase(unsigned long F,unsigned char DATA[5])//转换为DATA[1]-----DATA[4]
  {	  	unsigned long phase;
       phase=F/125.0/1000*1024.0/1000*1024.0*4096;
	   DATA[1]=phase/16777216; 
	   DATA[2]=phase/65536;	   
	   DATA[3]=phase/256;	   
	   DATA[4]=phase;		 
    

   }
void phasic_to_phase(float P ,unsigned char DATA[5]) //转换为DATA[0]的高5位
   { 
     DATA[0]=(unsigned char)(P/11.25+0.5)<<3;
	 
    }
/***************串行程序*********************/
/*
void DDS_set_freq (void)
  {
	unsigned char byte_temp;
	unsigned long freq_word =0x0505AAFF ;//频率控制字
	float    fTemp;
	fTemp=mulFreq;
	fTemp=fTemp*65536/DDS_CLK_IN*65536;
	freq_word =fTemp;
	//freq_word =(float)mulFreq*65536/DDS_CLK_IN*65536;

	_nop_(); _nop_(); _nop_(); _nop_();
	DDS_UPDATE = 0;
	_nop_(); _nop_(); _nop_(); _nop_();
	DDS_CLK = 0;
	_nop_(); _nop_(); _nop_(); _nop_();

	for ( byte_temp = 0; byte_temp < 32; byte_temp++ )
	{
		freq_word = freq_word >> 1;
		DDS_DATA = CY;
		DDS_CLK = 1;
		_nop_(); _nop_(); _nop_(); _nop_(); //实际应用应在延迟
		DDS_CLK = 0;
	}
	for ( byte_temp = 0; byte_temp < 8; byte_temp++ )
	{
		DDS_DATA = 0;
		DDS_CLK = 1;
		_nop_(); _nop_(); _nop_(); _nop_();
		DDS_CLK = 0;
	}

	DDS_UPDATE = 1;
	_nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_();
	DDS_UPDATE = 0;
} */

void init_dds(void)
{
	DDS_RESET=0;
	delay(2);
	DDS_RESET=1;
	delay(2);
	DDS_RESET=0;
	WriteLCD(0x80,"    (AD9850)    ");
	WriteLCD(0x90,"频率:000.000 HZ");
	WriteLCD(0x88,"相位:  0     度");
	WriteLCD(0x98,"  Just Do It... ");
/***************串行初始化程序*****************/
/*
	DDS_DATA=0;
	DDS_CLK=0;
	DDS_UPDATE=0;
	DDS_UPDATE=1;
	DDS_UPDATE=0;

	DDS_CLK=1;
	DDS_CLK=0;
	DDS_UPDATE=1;
	DDS_UPDATE=0;

	mulFreq=0;
	DDS_set_freq();	*/
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -