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

📄 ad9850.#2

📁 直接频率合成技术dds
💻 #2
字号:
#include <c8051f120.h>
#include <intrins.h>
#include<ABSACC.H>  
//-----------------------定义管脚--------------------------------------------------------
#define  data_OUT P0
#define  keypad   P3

sbit FQ_UD = P2^5;          //AD9850信号更新申请 
sbit W_CLK = P2^6;          //写控制字时钟
sbit SETRST= P2^7;
sbit led = P1^6;
unsigned char key;
unsigned char CON_word[5]; 
const ksp[4]={0XF7,0XFB,0XFD,0XFE};//扫描码
const keycode[]={0X7D,0XE7,0XEB,0XED,0XD7,0XDB,0XDD,0XB7,0XBB,0XBD,
                 0XEE,0XDE,0XBE,0X7E,0X77,0X7B};//参考键值
//-----------------------------------------------------------------------------
//         P3.3  P3.2   P3.1    P3.0
//          |      |      |        |
//P3.4---1---2---3---A(+)----
//          |      |      |        |
//P3.5---4---5---6---B(-)----
//          |      |      |        |
//P3.6---7---8---9---C(Enter)--
//          |      |      |        |
//P3.7---E---F---0---D(Clr)---
//---------------------------------------------------------------------------   

void Oscillator_Init()
{
    int i = 0;
    SFRPAGE   = CONFIG_PAGE;
    OSCXCN    = 0x77;
    for (i = 0; i < 3000; i++);  // Wait 1ms for initialization
    while ((OSCXCN & 0x80) == 0);
    CLKSEL    = 0x01;
}
void Port_IO_Init()
{
    SFRPAGE   = CONFIG_PAGE;
    P0MDOUT   = 0xFF;
	P1MDOUT   = 0xFF;
	P3MDOUT   = 0x0F;
	P2MDOUT   = 0xFF;
    XBR2      = 0x40;


}
void Init_Device(void)
{
    Port_IO_Init();
    Oscillator_Init();
}
//--------------------------------------------------------------------------------------------------
// 函数名称: delay
// 入口参数: N
// 函数功能:延时子程序,实现(16*N+24)us的延时 
// 系统采用11.0592MHz的时钟时,延时满足要求,其它情况需要改动
//--------------------------------------------------------------------------------------------------
  void delay(unsigned  int N)  
  {
  int i; 
  for(i=N;i>0;i--);
  }

 
void jisuan(unsigned long frequence);
void WRITE_AD9850(void);
unsigned char keypad_scan();
unsigned long keypad_data();
//--------------------------------------------------------------------------------------------------
// 函数名称:main
// 用户主函数
// 函数功能:主函数
//--------------------------------------------------------------------------------------------------
void main()
     {
	  long freq;
	     // disable watchdog timer
       WDTCN = 0xde;
       WDTCN = 0xad;
	   Init_Device();
       led=0;
	   jisuan(10000000);
       WRITE_AD9850();
       FQ_UD=0;
       delay(150);
	   while(1){
       if(keypad_scan()==0x0e)
	   { 
	     led=~led;
	     freq=keypad_data();
	     jisuan(freq);
         WRITE_AD9850();
		 FQ_UD=0;
		 delay(150);
       }

    }
	  
  }
//  -----------------计算频率------------------------//
  void jisuan(unsigned long frequence)
 {
  long freq;
  freq=85.89934592*frequence; //使用50M晶振,frequence就是所要输出的频率
  CON_word[1]=(freq&(0xff000000))>>24;    //用与控制频率的高8位
  CON_word[2]=(freq&(0x00ff0000))>>16;   //用与控制频率的中8位
  CON_word[3]=(freq&(0x0000ff00))>>8;    //用与控制频率的中8位
  CON_word[4]=freq&(0x000000ff);     //用与控制频率的低8位
  }
  //--------------------------------------------------------------------------------------------------
// 函数名称: WRITE_AD9850
// 函数功能: 将控制字写入AD9850
//--------------------------------------------------------------------------------------------------
void WRITE_AD9850(void)
{  
     unsigned char i;
     W_CLK=0; 
	 FQ_UD=0;
     delay(0);
	 SETRST=1;
	 delay(0);
	SETRST=0;
	 CON_word[0]=CON_word[0]&0xfc; //置工作方式选择位为00 
	
     for(i=0;i<5;i++)
     {
	     W_CLK=0;
		 data_OUT=CON_word[i];      //送控制字 	 	     		     	                    
	     delay(0);  
	     W_CLK=1;                   //上升延
		 delay(0);
          W_CLK=0;
	    
     }
    // delay(0);
     FQ_UD=1;               //上升延要求AD9850改变输出

} 
  
//------------------键盘扫描------------------------//
//-----------------------------------------------------------------------------
//         P3.3  P3.2   P3.1    P3.0
//          |      |      |        |
//P3.4---1---2---3---A(+)----
//          |      |      |        |
//P3.5---4---5---6---B(-)----
//          |      |      |        |
//P3.6---7---8---9---C(Enter)--
//          |      |      |        |
//P3.7---E---F---0---D(Clr)---
//---------------------------------------------------------------------------   
//---------------------------------------------------------------------------   
unsigned char keypad_scan()
{
  unsigned char i,j;
 
  P3=0Xf0;
  while(P3!=0XF0);//检查键盘是否有键按下  
   do
   { 
     for(i=0;i<=3;i++)
	{
	 P3=ksp[i];
	 if(P3!=ksp[i])//检查第i行是否有键按下
	    {
	     delay(100);
		 key=P3;    //读键值
		 if(key!=ksp[i])//确认有键按下
		   { 
			   for(j=0;j<16;j++)
			   {	  
		         if(key==keycode[j]) 
			     return (j);	  	   
			   }
               return (0x10);
		    }
        } 
    }

   }
  while(1); 
 
}


unsigned long keypad_data()
{  
   unsigned char temp1;
   unsigned long temp=0;
   
   while(keypad_scan()!=0X0C)

   {
    temp1=keypad_scan();
	if(temp1>=0&&temp1<=9)
	{
	led=~led;
	temp=temp*10+temp1;
	 }
   }
   led=~led;

   return(temp);
}

⌨️ 快捷键说明

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