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

📄 dds.c

📁 51单片机控制AD9851产生20HZ-1MHZ的正弦波
💻 C
字号:
#include "reg51.h"
#include"stdio.h"

#define SELECT_LCD()	CS0=0; CS1=1; CS2=0
#define SELECT_NONE()	CS0=1; CS1=1; CS2=1
#define Set0(x) x=0
#define Set1(x) x=1 

sbit CS0 = P2^5 ;
sbit CS1 = P2^6 ;
sbit CS2 = P2^7 ;

sbit Lcd_RW = P2^4 ;
sbit Lcd_RS = P2^3 ;


sbit DDS_FQ=P1^0;
sbit DDS_CLK=P1^1;
sbit DDS_DATA=P1^2;

unsigned long ddsseg[15]={1432,2147,2863,7158,14317,21475,71583,143166,214748,715829,1431656,2147484,42949672,57266231,71582788};
/**********************   * 20 * 30 * 40 *100 * 200 * 300 * 1 K * 2 K * * 3 K * 10 K * 20 K *  30 K  * 600 K  * 800  K *  1  M  *****/
/*****************************函数声明************************************/
void LcdWrite(unsigned char value , bit RS);
unsigned char LcdRead(bit RS);
void LcdWriteCmd(unsigned char value , unsigned char attrib);
void LcdWriteData(unsigned char value);
unsigned char LcdReadData();
void LcdInit(void);
void LocateXY(char x , char y);
void PutChar(char x , char y , char value);
void PutStr(char x , char y , char* str);
/*--------------------------------------------------------------------------*/
/*------------------------------通用延时程序--------------------------------*/

void delay(unsigned int time)     // time*0.5ms延时
{
   unsigned int i,j;

   for(j=0;j<time;j++)
     {
       for(i=0;i<60;i++)
       {;}
      }
}

/*--------------------------------------------------------------------*/
/*-----------------------------液晶显示模块---------------------------*/
void LcdWrite(unsigned char value , bit RS)
{
	/* 1. 设置RS信号线 */
	Lcd_RS = RS ;
	/* 2. 设置RW信号线为读 */
	Lcd_RW = 0 ;
	/* 3. 设置LCD片选 */
	SELECT_LCD();
	/* 4. 通过P0端口写值 */
	P0 = value ;
	/* 5. 锁存 */
	SELECT_NONE();
}

/***************************************
说明: 	LCD读函数,完成LCD读操作的物理时序
RS:		0 - 写指令
		1 - 写数据
return:	读出的具体值
*****************************************/
unsigned char LcdRead(bit RS)
{
	unsigned char rt ;

	/* 1. 设置RS信号线 */
	Lcd_RS = RS ;
	/* 2. 设置RW信号线为读 */
	Lcd_RW = 1 ;
	/* 3. 释放P0口 */
	P0 = 0xff ;
	/* 4. 设置LCD片选 */
	SELECT_LCD();
	SELECT_LCD();
	SELECT_LCD();
	SELECT_LCD();
	/* 5. 通过P0端口读值 */
	rt = P0 ;
	/* 6. 锁存 */
	SELECT_NONE();

	return rt ;
}	

/***************************************
说明: 	LCD写指令
value:	写的具体值
attrib:	0 - 不检测忙信号
	   	1 - 监测忙信号
*****************************************/
void LcdWriteCmd(unsigned char value , unsigned char attrib)
{
	/* 监测忙状态 */
	if(attrib)
		while( LcdRead(0)&0x80 ) ;
	
	LcdWrite(value , 0);
 }

/***************************************
说明: 	LCD写数据
*****************************************/
void LcdWriteData(unsigned char value)
{
 	/* 监测忙状态 */
	while( LcdRead(0)&0x80 ) ;

	LcdWrite(value , 1);
}

/***************************************
说明: 	LCD读数据
*****************************************/
unsigned char LcdReadData()
{
	/* 监测忙状态 */
	while( LcdRead(0)&0x80 ) ;

	return LcdRead(1);
}


/***************************************
说明: 	LCD初始化函数,需要按照产品
        说明书完成
*****************************************/
void LcdInit(void)
{
	delay(800);

	/* 写指令0x38连续3次, 不检测忙信号*/
	LcdWriteCmd(0x38 , 0 );
	delay(10);

	LcdWriteCmd(0x38 , 0 );
	delay(10);

	LcdWriteCmd(0x38 , 0 );
	delay(10);

	/* 以后的读写操作均要判断忙信号 */
	LcdWriteCmd(0x38 , 1 );
	/* 先设置关屏 */
	LcdWriteCmd(0x08 , 1 );
	/* 清屏 */
	LcdWriteCmd(0x01 , 1 );
	/* 设置光标显示模式 */
	LcdWriteCmd(0x06 , 1 );
	/* 开屏并显示光标 */
	LcdWriteCmd(0x0c , 1 );
}

/***************************************
说明: 	设置光标定位
*****************************************/
void LocateXY(char x , char y)
{
	unsigned char temp;

	temp = x & 0xf;
	y &= 0x1;
	if ( y )temp |= 0x40;
	temp |= 0x80;
	LcdWriteCmd(temp,1);
}

/***************************************
说明: 	显示字符
x: 横坐标 y: 纵坐标
value: 显示的字符
*****************************************/
void PutChar(char x , char y , char value)
{
	LocateXY(x,y);
	LcdWriteData(value);
}

/***************************************
说明: 	显示字符串
*****************************************/
void PutStr(char x , char y , char* str)
{
	unsigned char i,len=0;
	/* 计算字符串长度 */
	while (str[len] >31)
		len++;
	
	/* 显示字符串 */
	for (i=0;i<len;i++) 
	{
		PutChar(x++,y,str[i]);
		if ( x == 16 )
		{
			x = 0; y ^= 1;
		}
	}
}




/*---------------------------------------------------------------------*/
/*--------------------------AD9851控制模块-----------------------------*/
void Send(unsigned int control,unsigned long value)
{
	unsigned char t;
	DDS_FQ=0;
	
	for(t=0;t<32;t++)//控制频率
	{
		DDS_CLK=0;
		if(value&0x01)
			Set1(DDS_DATA);
		else
			Set0(DDS_DATA);
		DDS_CLK=1;
		value=value>>1;
	}
	for(t=0;t<8;t++)//控制状态
	{
		DDS_CLK=0;
		if(control&0x01)
			Set1(DDS_DATA);
		else
			Set0(DDS_DATA);
		DDS_CLK=1;
		control=control>>1;
	}
	DDS_FQ=1;
}

void Init_DDS()
{
	Send(0x01,0x00000000);
    delay(10);
}

void main()
{   
     unsigned char i=0;
     Init_DDS();

     LcdInit(); 
     PutStr(0,0,"DDS");
     delay(2000);
	while(1)
         {		   
	       if(i==16)
		      i=0;
		   	Send(0x01,ddsseg[i]);
               switch(i)
		      {
		           case 0:
			               PutStr(0,0,"DDS    +10HZ");
				           PutStr(0,1,"    20   HZ");
				           break;
		           case 1:
					
				           PutStr(0,0,"DDS    +10HZ");
				           PutStr(0,1,"    30   HZ");
				            break;
			       case 2:
	    		           PutStr(0,0,"DDS    +10HZ");
				           PutStr(0,1,"    40   HZ");
			               break;
		           case 3:
			               PutStr(0,0,"DDS   +100HZ");
		        		   PutStr(0,1,"   100   HZ");					
				           break;
			       case 4:
			               PutStr(0,0,"DDS   +100HZ");
				           PutStr(0,1,"   200   HZ");					
			               break;
			       case 5:
			               PutStr(0,0,"DDS   +100HZ");
				           PutStr(0,1,"   300   HZ");					
			               break;
			       case 6:
			               PutStr(0,0,"DDS    +1KHZ");
			   	           PutStr(0,1,"    1   KHZ");					
			               break;
			       case 7:
	           		       PutStr(0,0,"DDS    +1KHZ");
				           PutStr(0,1,"    2   KHZ");					
				           break; 
		           case 8:
			               PutStr(0,0,"DDS    +1KHZ");
				           PutStr(0,1,"    3   KHZ");					
			               break;
			       case 9:
			               PutStr(0,0,"DDS   +10KHZ");
				           PutStr(0,1,"    10  KHZ");					
				           break;
			       case 10:
			               PutStr(0,0,"DDS   +10KHZ");
			               PutStr(0,1,"    20  KHZ");					
			               break;
	   	           case 11:
			               PutStr(0,0,"DDS   +10KHZ");
			       	       PutStr(0,1,"    30  KHZ");					
		  	               break;
			       case 12:
			               PutStr(0,0,"DDS  +200KHZ");
				           PutStr(0,1,"   600  KHZ");					
			               break;
		 	       case 13:
			               PutStr(0,0,"DDS  +200KHZ");
				           PutStr(0,1,"   800  KHZ");					
			               break;
			       case 14:
		                   PutStr(0,0,"DDS  +200KHZ");
				           PutStr(0,1,"   1    MHZ");					
			               break;
			       default: break;
 			    }		
			i++;
			delay(6000);
	   }

 }

⌨️ 快捷键说明

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