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

📄 9850.c

📁 C8051F020单片机控制AD9850实现DDS
💻 C
字号:
//-----------
//调用头文件
//-----------
#include<c8051f020.h>
#include<intrins.h>
#include<CH452CMD.H>
#include"PIN.H"
#include"math.h"

//-------
//宏定义
//-------
#define uchar unsigned char
#define uint  unsigned int


//---------------------
//AD9850控制线连接声明
//---------------------
#define set_WCLK {P4|=0x02;}
#define reset_WCLK {P4&=0xfd;}
#define set_FQUD {P4|=0x01;}
#define reset_FQUD {P4&=0xfe;}
#define reset {P4|=0x08;}
#define set {P4&=0xf7;}
#define AUTO 0

//sbit WCLK=P4^1;//sbit WCLK_9850=P4^1;
//sbit FQUD=P4^0//sbit FQUD_9850=P4^0;

//-----------
//子函数声明
//-----------
void initial_9850(void);
void start_9850(void);
void Port_IO_Init(void);
void CH452_Write(unsigned short );
unsigned char CH452_Read( void );
void DDS_TURNINGWORD(unsigned char);
void jishuang(unsigned char *step);
void key_value(void);
//void delay1(uchar x);
unsigned char key,keyvalue,keyintFlag;
 uchar turningWord[5]={0x00,0x00,0x00,0x0d,0x6b}; //-------设置起始频率为0
unsigned char  step_10[5]={0x00,0x00,0x00,0x01,0x57};		//扫频步进设置
unsigned char  step_100[5]={0x00,0x00,0x00,0x0d,0x6b};
unsigned char  step_1k[5]={0x00,0x00,0x00,0x86,0x37};
unsigned char  step_10k[5]={0x00,0x00,0x05,0x2e,0x3d};
unsigned char  step_100k[5]={0x00,0x00,0x34,0x6d,0xc5};

//-------
//主函数
//-------
main()
{ static unsigned long i=0;
  unsigned char j;
 	WDTCN = 0xde;
	WDTCN = 0xad;           //关看门狗
  EA=0;
 Port_IO_Init();
 initial_9850();
  EA=1;
  	CH452_Write(CH452_SYSON2);//打开键盘显示
	CH452_Write(CH452_BCD);
	CH452_Write(CH452_DIG0|0);
    DELAY_1US;
	DELAY_1US;
	DELAY_1US;
	DELAY_1US;
	DELAY_1US;
	DELAY_1US;
NEXT: ENABLE_KEY_INTERRUPT;
 keyintFlag=0;
 while(keyintFlag==0){;}
 DISABLE_KEY_INTERRUPT;
 key_value();
 if(keyvalue!=AUTO)
 {
   DDS_TURNINGWORD(keyvalue);
 start_9850();
 goto NEXT;
 }
 else{ ENABLE_KEY_INTERRUPT;
 
 for(;i<=300000;i++)  //------从0到30MHZ自动扫频
 { //DISABLE_KEY_INTERRUPT;
   //if(keyintFlag==1){goto NEXT;}
    DDS_TURNINGWORD(1);
  // ENABLE_KEY_INTERRUPT;
   start_9850();
   for(j=0;j<200;j++);
   for(j=0;j<200;j++);
   for(j=0;j<200;j++);
   for(j=0;j<200;j++);
   for(j=0;j<200;j++);}
  }	
}

/*---------------9850初始化--------------------*/
void initial_9850(void)
{reset_WCLK;
 reset_FQUD;
 reset;
 _nop_();
 _nop_();
 set;
}

/*--------------向9850输入40位控制字,并刷新输出------*/
void start_9850(void)
{uchar i;

 for(i=5;i>0;i--)
 {reset_WCLK;
//  delay1(2);
  P7=turningWord[5-i];
  set_WCLK;}
//  delay1(2);}

  reset_WCLK;
 set_FQUD;
// delay1(6);
  reset_FQUD;
 }

/*----------------单片机端口初始化-----------------------*/
void Port_IO_Init()
{
    // P0.0  -  Unassigned,  Open-Drain, Digital
    // P0.1  -  Unassigned,  Open-Drain, Digital
    // P0.2  -  Unassigned,  Open-Drain, Digital
    // P0.3  -  Unassigned,  Open-Drain, Digital
    // P0.4  -  Unassigned,  Open-Drain, Digital
    // P0.5  -  Unassigned,  Open-Drain, Digital
    // P0.6  -  Unassigned,  Open-Drain, Digital
    // P0.7  -  Unassigned,  Open-Drain, Digital

    // P1.0  -  Unassigned,  Open-Drain, Digital
    // P1.1  -  Unassigned,  Open-Drain, Digital
    // P1.2  -  Unassigned,  Open-Drain, Digital
    // P1.3  -  Unassigned,  Open-Drain, Digital
    // P1.4  -  Unassigned,  Open-Drain, Digital
    // P1.5  -  Unassigned,  Open-Drain, Digital
    // P1.6  -  Unassigned,  Open-Drain, Digital
    // P1.7  -  Unassigned,  Open-Drain, Digital

    // P2.0  -  Unassigned,  Open-Drain, Digital
    // P2.1  -  Unassigned,  Open-Drain, Digital
    // P2.2  -  Unassigned,  Open-Drain, Digital
    // P2.3  -  Unassigned,  Open-Drain, Digital
    // P2.4  -  Unassigned,  Open-Drain, Digital
    // P2.5  -  Unassigned,  Open-Drain, Digital
    // P2.6  -  Unassigned,  Open-Drain, Digital
    // P2.7  -  Unassigned,  Open-Drain, Digital

    // P3.0  -  Unassigned,  Open-Drain, Digital
    // P3.1  -  Unassigned,  Open-Drain, Digital
    // P3.2  -  Unassigned,  Open-Drain, Digital
    // P3.3  -  Unassigned,  Open-Drain, Digital
    // P3.4  -  Unassigned,  Open-Drain, Digital
    // P3.5  -  Unassigned,  Open-Drain, Digital
    // P3.6  -  Unassigned,  Open-Drain, Digital
    // P3.7  -  Unassigned,  Open-Drain, Digital

    XBR2      = 0x40;
}

/*--------------------向CH452写入命令或数据------------------*/
void CH452_Write(unsigned short cmd)
{
	unsigned char i;
	DISABLE_KEY_INTERRUPT;		  //禁止键盘中断,防止传输过程中被CH452中断而进入中断服务程序中再次传输
	CH452_LOAD_CLR;                 //命令开始,LOAD=0
	CH452_LOAD_D_OUT;		// 设置LOAD为输出方向
	CH452_DOUT_D_IN;		// 设置DOUT为输入方向
	CH452_DIN_D_OUT;		// 设置DIN为输出方向
	CH452_DCLK_D_OUT;		// 设置DCLK为输出方向
	for(i=0;i!=12;i++)				//送入12位数据,低位在前
	{
	 if (cmd&1) {CH452_DIN_SET;}
	    else {CH452_DIN_CLR;}  // 输出位数据
                                   // 另外的表达CH452_DIN=cmd&1;
    	 CH452_DCLK_CLR;
    	 cmd>>=1;
	 DELAY_1US;
	 DELAY_1US;	
	    	CH452_DCLK_SET;             //上升沿有效
	}
  	CH452_LOAD=1;//CH452_LOAD_SET;         //加载数据,LOAD上升沿
	DELAY_1US;				//命令数据加载周期不小于6US,CH451不需要该周期
	DELAY_1US;
	DELAY_1US;
	DELAY_1US;
	DELAY_1US;
	DELAY_1US;
	DELAY_1US;				//命令数据加载周期不小于6US,CH451不需要该周期
	DELAY_1US;
	DELAY_1US;
	DELAY_1US;
	DELAY_1US;
	DELAY_1US;
	DELAY_1US;				//命令数据加载周期不小于6US,CH451不需要该周期
	DELAY_1US;
	DELAY_1US;
	DELAY_1US;
	DELAY_1US;
	DELAY_1US;
	
  	ENABLE_KEY_INTERRUPT;
}

//*************************************************
//输入按键代码子程序,从CH452读取
unsigned char CH452_Read( void )
{
	unsigned char i;
  	unsigned char cmd,keycode;		//定义命令字,和数据存储器
  	DISABLE_KEY_INTERRUPT;			//禁止键盘中断,防止传输过程中被CH452中断而进入中断服务程序中再次传输	
  	cmd=0x07;			        //读按键的命令字
  	CH452_LOAD_CLR;
  	for(i=0;i!=4;i++)                       // 只需要发出高4位,多发也可以,但应该确保最后留下的4位是该命令码
	{
		if (cmd&1) {CH452_DIN_SET;}
		else {CH452_DIN_CLR;}           // 输出位数据
//		CH452_DIN=cmd&1;		//送入最低位
    	CH452_DCLK_CLR;			 
    	cmd>>=1;			        //往右移一位
    	CH452_DCLK_SET;			        //产生时钟上升沿锁通知CH451输入位数据
 	}
  	CH452_LOAD_SET;				//产生加载上升沿通知CH451处理命令数据
  	keycode=0;				//清除keycode
  	for(i=0;i!=7;i++)
	{
		keycode<<=1;			//数据移入keycode,高位在前,低位在后
		if (CH452_DOUT) keycode++;      //从高到低读入451的数据
//    	keycode|=CH452_DOUT;
    	CH452_DCLK_CLR;			        //产生时钟下升沿通知CH451输出下一位
    	CH452_DCLK_SET;
 	}
  	CLEAR_KEY_INTER_FLAG;	                //清中断标志
  	ENABLE_KEY_INTERRUPT;
  	return(keycode);		        //反回键值
}

void DDS_TURNINGWORD(unsigned char a)
{ 
  switch(a)
  {case 1:{jishuang(step_10);break;}
   case 2:{jishuang(step_100);break;}
   case 3:{jishuang(step_1k);break;}
   case 4:{jishuang(step_10k);break;}
   case 5:{jishuang(step_100k);break;}
   default:break;
  }
}

void jishuang(unsigned char *step)
{ unsigned char i, temp2=0;
  unsigned int temp1=0;
 
  for(i=4;i>0;i--)
  {temp1=turningWord[i]+step[i]+temp2;
   turningWord[i]=(unsigned char)temp1;
   temp2=(unsigned char)(temp1>>8);
  }
}

/*--------------键值处理------------------*/
void key_value(void)
{
  switch(key)
  {case 0x78:{keyvalue=0;break;}
   case 0x50:{keyvalue=1;break;}
   case 0x58:{keyvalue=2;break;}
   case 0x60:{keyvalue=3;break;}
   case 0x73:{keyvalue=4;break;}
   case 0x51:{keyvalue=5;break;}
   case 0x59:{keyvalue=6;break;}
   case 0x61:{keyvalue=7;break;}
   case 0x7a:{keyvalue=8;break;}
   case 0x52:{keyvalue=9;break;}
   default:{keyvalue=10;break;}
  }
}

    
/*--------------键盘中断处理-----------------------------*/
void keyint_iso(void)interrupt 19
{ 	DISABLE_KEY_INTERRUPT;
    CLEAR_KEY_INTER_FLAG;	
    key=CH452_Read();
   DELAY_1US;
	DELAY_1US;
	DELAY_1US;
	DELAY_1US;
	DELAY_1US;
	DELAY_1US;
	keyintFlag=1;
}
 

/*void delay1(uchar x)
{uchar i;
 for(i=x;i>0;i--);
}*/

⌨️ 快捷键说明

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