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

📄 ad9851.c

📁 本简易网络导纳分析仪以C8051F020为控制和数据处理核心
💻 C
字号:
/*===============================================================*/
/*函数名称: ad9851.c                                            */
/*函数功能: 发送1hz--100khz的正弦波                             */ 
/*参数说明: ctr_word[0]---------------------------------相位控制字
      		 ctr_word[1,2,3,4]------------------------频率控制字
			 D7------------------------------------------------P6.7
	  		 D6------------------------------------------------P6.6
			 D5------------------------------------------------P6.5
			 D4------------------------------------------------P6.4
			 D3------------------------------------------------P6.3
			 D2------------------------------------------------P6.2
			 D1------------------------------------------------P6.1
			 D0------------------------------------------------P6.0
			 W_CLK---------------------------------------------P3.5
			      ------------------------------------字装入控制信号
  			 FQ_UD---------------------------------------------P3.6
			      ----------------------------------频率更新控制信号
			 RESET---------------------------------------------P3.7
				  ------------------------------软件复位,高电平有效
	                                                             */    
/*有无返回: 有                                                  */
/*修改记录: 无修改记录                                          */
/*编写作者: t483-4-19chenY_Absong                               */
/*编写日期: 2007-4-06                                           */
/*===============================================================*/
#include  "common.h"
#include  "ad9851.h"
#include  "delay.h"
#include  "TS12864A.h"
#include  "show.h" 


extern unsigned long  FrequencyLong_HZ; 
void ad9851(void)
{	 
     unsigned char  key_code;
//   show_frequncy();
	 key_code=P7&0xff;
	 switch(key_code)
	 {
		    case 0xfe:  
                        if(FrequencyLong_HZ>=10)
			            {
				             FrequencyLong_HZ=FrequencyLong_HZ-10;
							 sin_send(FrequencyLong_HZ);
//							 Show_FloatData(FrequencyLong_HZ,5,3);    
			 	             delay_nms(10);
			            }
						break;		                   //步进为10自减
		    case 0xfd:	
                        if(FrequencyLong_HZ<=10000)
			            {
				             FrequencyLong_HZ=FrequencyLong_HZ+10;
							 sin_send(FrequencyLong_HZ);
//							 Show_FloatData(FrequencyLong_HZ,5,3);  
			 	             delay_nms(10);
			            }
						break;					       //步进为10自加
			case 0xfb:	
			         	FrequencyLong_HZ=0;		   	   //10--100000自动加扫频			            
			            while(FrequencyLong_HZ<=10000)
			            {
				             FrequencyLong_HZ=FrequencyLong_HZ+10;
							 sin_send(FrequencyLong_HZ);
//							 Show_FloatData(FrequencyLong_HZ,5,3);  
			 	             delay_nms(500);
			            }						
			            break;		
			case 0xf7:	
			        	FrequencyLong_HZ=10000;	    //10--100000自动减扫频			            
			            while(FrequencyLong_HZ>=10)
			            {
				             FrequencyLong_HZ=FrequencyLong_HZ-10;
							 sin_send(FrequencyLong_HZ);
//							 Show_FloatData(FrequencyLong_HZ,5,3);  
			 	             delay_nms(500);
			            }						
			            break;										
			default:    break;		     
	  } 
	
}

void sin_send(unsigned long freqword)
{

    unsigned int ctr_word[5];
    unsigned long  f_value;

								               	  //提取控制字
	freqword = (long)(freqword*1073.741824);	  //2^32/4000000
	f_value = (long)freqword;
	ctr_word[4] = f_value;
	ctr_word[4] &= 0x00ff;
	f_value >>= 8;
	ctr_word[3] = f_value;
	ctr_word[3] &= 0x00ff;
	f_value >>= 8;
	ctr_word[2] = f_value;
	ctr_word[2] &= 0x00ff;
	f_value >>= 8;
	ctr_word[1] = f_value;
	ctr_word[1] &= 0x00ff;
	wr_word();
}

void wr_word(void)		            //写控制字
{
	unsigned int i;
	unsigned int ctr_word[5];
    
	AD9851_W_CLK=0;				    //清控制字
	AD9851_FQ_UD=0;     
									
    AD9851_W_CLK=0;  
//  DATA_PORT=0x09;					//6倍频控制
    DATA_PORT=0x00;				    //不进行6倍频
	delay_nus(10);
    AD9851_W_CLK=1;
	delay_nus(10); 

	for (i=1;i<5;i++)		        //写频率控制字
	{
	      AD9851_W_CLK=0;  
	      DATA_PORT=ctr_word[i];
		  delay_nus(10);
          AD9851_W_CLK=1;
		  delay_nus(10);                   	
	}
	AD9851_W_CLK=0;
    AD9851_FQ_UD=1;                //根据控制字更改输出的频率和相位
	AD9851_FQ_UD=1; 
	delay_nms(10);
    AD9851_FQ_UD=0;
}

void Initial_AD9851(void)          //对 RESET端进行复位
{   							  
	AD9851_RESET=0;
    AD9851_RESET=1;	  	
    delay_nms(100);
    AD9851_RESET=0;
	AD9851_FQ_UD=0;       
    AD9851_W_CLK=0; 
}

⌨️ 快捷键说明

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