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

📄 06_7_12_12_30_main.c

📁 用51单片机控制AD9851产生正弦信号的源程序
💻 C
字号:
/*
*Author hejun
*Date   2006_7_12 
*/
/*
*按键功能说明
P1_5   	设置步进 100Hz 1KHz 10KHz 100KHz 1MHz 10Mhz
P1_6 	步进加1
P1_7 	步进减1
*
*/
/*SystemClock=180MHz*/
//F_out=10MHz 	FrqDWord=238609294;	W1=0x0e; W2=0x38; W3=0xe3; W4=0x83;//(W1=Freq–b31__Freq–b3Freq–b24)
//F_out=1MHz 	FrqDWord=23860929;	W1=0x01; W2=0x6c; W3=0x16; W4=0xc1;//(W1=Freq–b31__Freq–b3Freq–b24)
//F_out=100kHz 	FrqDWord=2386093;	W1=0x00; W2=0x24; W3=0x68; W4=0xad;//(W1=Freq–b31__Freq–b3Freq–b24)
//F_out=10kHz 	FrqDWord=238609;	W1=0x00; W2=0x03; W3=0xa4; W4=0x11;//(W1=Freq–b31__Freq–b3Freq–b24)
//F_out=1kHz 	FrqDWord=23861; 	W1=0x00; W2=0x00; W3=0x5d; W4=0x35;//(W1=Freq–b31__Freq–b3Freq–b24)
//F_out=100Hz 	FrqDWord=2386; 		W1=0x00; W2=0x00; W3=0x09; W4=0x52;//(W1=Freq–b31__Freq–b3Freq–b24)
#include <at89X52.h>
#define uchar unsigned char
#define uint unsigned int
#define RESET  P1_0
#define W_CLK  P1_1
#define FQ_UD  P1_2
#define DDSData		P2 
#define CLR_WCLK()   W_CLK = 0
#define CLR_FQUD()   FQ_UD = 0
#define CLR_RESET()  RESET = 0
#define SET_WCLK()   W_CLK = 1
#define SET_FQUD()   FQ_UD = 1
#define SET_RESET()  RESET = 1
/*声明全局变量*/
//extern unsigned long FrqLCD;
unsigned long FrqDWord;   		//32-bit frequency tuning word
unsigned char W0,W1,W2,W3,W4;   	//
unsigned long Step;   			//步进
unsigned char KeyCode;
unsigned char key_flag=1;
/*声明子程序*/
void F_Init_ParallelMode();     //初始化DDS
void F_ParallelLoad_AD9851();   //并行置数
void F_S2P_AD9851();            //串行数据向并行数据转换
void F_StepSet_AD9851();
void F_StepUp_AD9851();
void F_StepDown_AD9851();
void KeyScan(void);
void KeyHandle(void);
void delay();
/*定义子程序*/
void F_Init_ParallelMode()
{
    /*P_IOA_Dir    |= 0xff00;
    *P_IOA_Attrib |= 0xff00;   //A口高八位同相输出
    
    *P_IOB_Dir    |= 0x00ff+W_CLK+FQ_UD+RESET;
    *P_IOB_Attrib |= 0x00ff+W_CLK+FQ_UD+RESET;   //B口低八位同相输出
    
    //*P_IOB_Dir    |= W_CLK+FQ_UD+RESET;
    //*P_IOB_Attrib |= W_CLK+FQ_UD+RESET;   //3位控制口属性设置*/
    W0 = 0x01;				//6′ REFCLK Multiplier Enable
    FrqDWord = 23860929;		//set initial F_out=10Mhz
    
    CLR_RESET();
    delay();
    SET_RESET();
    delay();
    delay();
    delay();
    delay();
    delay();
    CLR_RESET();   //AD9851复位
  
    
}

void F_S2P_AD9851()
{  
    unsigned long frqTmp;
    frqTmp = FrqDWord;
    W4 = frqTmp;
    W4 &= ~0xff00;
    frqTmp >>= 8;
    
    W3 = frqTmp;
    W3 &= ~0xff00;
    frqTmp >>= 8;
    
    W2 = frqTmp;
    W2 &= ~0xff00;
    frqTmp >>= 8;
    
    W1 = frqTmp;
}
void F_ParallelLoad_AD9851()
{
    CLR_WCLK(); 
    CLR_FQUD();
    
    CLR_WCLK();
       //Frq_Byte0,相位值输入
    DDSData= W0;
	delay();
    SET_WCLK();
    
    CLR_WCLK();       //Frq_Byte1
    DDSData= W1;	
    SET_WCLK();
    delay();
    CLR_WCLK();  	 //Frq_Byte2

    DDSData= W2;
    SET_WCLK();
    delay();
    CLR_WCLK();		//Frq_Byte3

    DDSData= W3;
    SET_WCLK();
    delay();
    CLR_WCLK();		//Frq_Byte4

    DDSData= W4;
    SET_WCLK();
    delay();
    CLR_WCLK();
    delay();
    
    SET_FQUD();
    delay();
    CLR_FQUD();   //锁存频率相位值
}

void F_StepSet_AD9851()
{
    switch(Step)
    {
    case 2386      : Step = 23861;     break;   //100Hz 	trun_to 	1kHz
    case 23861     : Step = 238609;    break;   //1kHz  	trun_to		10KHz
    case 238609    : Step = 2386093;   break;   //10KHz 	trun_to 	100KHz
    case 2386093   : Step = 23860929;  break;   //100KHz	trun_to		1MHz
    case 23860929  : Step = 238609294; break;   //1MHz		trun_to		10MHz
    case 238609294 : Step = 2386;      break;   //10MHz		trun_to		100Hz
    default        : 		       break;
    }
}

void F_StepUp_AD9851()
{
    if(FrqDWord>=238609294)   //频率达到目10M,应退出
        return;
    FrqDWord += Step;
    F_S2P_AD9851();
    F_ParallelLoad_AD9851();
    
//    FrqLCD += 0x01;   //LCD上频率更新
}

void F_StepDown_AD9851()
{
    if(FrqDWord<Step)   //频率小于步进值,应退出
        return;
    FrqDWord -= Step;
    F_S2P_AD9851();
    F_ParallelLoad_AD9851();
    
//    FrqLCD -= 0x01;   //LCD上频率更新
}

void KeyScan(void)
{
	uchar key_P1_5;
	uchar key_P1_6;
	uchar key_P1_7;
	P1_5=1;
	P1_6=1;
	P1_7=1;
	/*using the led to test if the keycode is ok*/
	key_P1_5=P1_5;
	key_P1_6=P1_6;
	key_P1_7=P1_7;
	if(!key_P1_5) {KeyCode=1;key_flag=1;P0_5= !P0_5;}
	if(!key_P1_6) {KeyCode=2;key_flag=1;P0_6= !P0_6;}
	if(!key_P1_7) {KeyCode=3;key_flag=1;P0_7= !P0_6;}

}
void KeyHandle(void)
{
	
	switch(KeyCode)
	{
	case 1: F_StepSet_AD9851();break;

	case 2: F_StepUp_AD9851();break;

	case 3: F_StepDown_AD9851();break;
	
	default : break;
	}

}

void delay()
{
	unsigned char i;
	for (i=1;i<=0xff;i++);

}

/*主函数*/
void main()
{
	F_Init_ParallelMode();
	while(1){
	KeyScan();
	if(key_flag)
		{
		KeyHandle();
		F_ParallelLoad_AD9851();
		key_flag=0;
		}
	}	
}

⌨️ 快捷键说明

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