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

📄 dds1.c

📁 程序资料共享 希望大家共同进步 共同努力 加油 !
💻 C
字号:
#include<reg52.h>
#include<INTRINS.H>
#include<ABSACC.h>
//------宏定义-------------
#define Uchar unsigned char
#define Uint  unsigned int
#define Lcd1602WdataPort 0x8101
#define Lcd1602CmdPort  0x8100
#define Lcd1602StatusPort 0x8102
#define Busy 0x80 
//-----位定义------
sbit R = P3^7;
sbit W = P3^6;
sbit MReset = P1^0;//DDS控制
sbit IO_Reset = P1^1;
sbit SDIO = P1^2;
sbit Updata_Clock = P1^3;
sbit SCLK = P3^0;
sbit CS = P3^1;
sbit DataDA = P1^4;//D/A控制
sbit ClkDA = P1^5;
sbit LOAD = P1^6;
sbit LDAC = P1^7;
sbit P3_5=P3^5;
//---------变量定义---------------------------------
Uint code key[5]={0xf8f0,0xf8e8,0xf8d8,0xf8b8,0xf878};
Uchar m=0,k1=1,k=0,keyvalue=0;
Uchar f,reset=1;
int count=0;
float f1=1;
Uchar code a1[]={0x6e,0x47,0x3d,0x33,0x14,0x10,0x0d,0x0f,0x0a,0x00};//调制度程控电压
Uchar freqstr[]={0,0,0,0};
float freq=0;
//Uchar count1=0;
Uchar code str[]="   .    MHz         ";
Uchar code str1[]="   . KHz           ";
Uchar code str8[]="   . Hz            ";
Uchar code c[]={'0','1','2','3','4','5','6','7','8','9'};
//-----------------函数声明----------------
void keyscan(void);
void LcdReset( void );
void LcdWriteCommand( Uchar CMD,Uchar AttribC );
void LcdWriteData( Uchar dataW );
void ShowChar(Uchar pos,Uchar c);
void ShowString(Uchar line,char *pr);
void Writecommand(Uchar a);
void Writedata(Uchar code *p,Uchar m);
void DDSINITIAL(void);
void shuru(void);
void inc(void);//频率增
void dec(void);//频率减
void inc1(void);//频率增
void dec1(void);//频率减
void WriteDa(Uchar Dat,Uchar CH);
void writedataFTW(long int data1);
void Display(Uchar s);
void nop(void);
void Delay400Ms(void);
void Delay5Ms(void);


main()
{ 
  Uchar i=0,n=0x00;
  Uchar n1=0x10,count1=0;
  Uchar code str11[]="  Change  Ma     ";
  Uchar code str12[]="                 ";
  Uchar code str2[]="Please input num  ";
  Uchar code str3[]="   freq    inc    ";
  Uchar code str4[]="   freq    dec    ";
  Uchar code str5[]="        AM        ";
  Uchar code str6[]="       PSK        ";
  Uchar code str7[]="        ASK         ";
  IE=0x84;
  Delay400Ms();
  LcdReset();
  ShowString(0,str2);
  for( ; ; )
   { reset=1;
     while(1)               //设定频率
       { keyscan();
       	 freqstr[count1++]=k;
       	 if(k=='R'){k=0;break;}
         if(k=='M'||k=='K'||k=='H'){ShowChar(n1++,k);break;}
       	 ShowChar(n1++,c[k]);
       	 Delay400Ms();
       	 EA=1;
   	   }
   	 shuru();
     while(reset)
       { EA=1; 
       	 keyscan();
         switch(k)
          { case 1:{ShowString(1,str3);inc();}break;//频率增
      	    case 2:{ShowString(1,str4);dec();}break;//频率减
            case 3:{ShowString(1,str5);}break;//AM
            case 4:{ShowString(1,str6);
            	    P3_5=0;
            	    }
            	   break;//PSK;
            case 5:{WriteDa(a1[m++],0);if(m==1)ShowString(1,str12);ShowChar(0x10,c[i++]);if(m>10){m=0;i=0;}
                   ShowString(0,str11);}break;//程控调节调制度
            case 6:{ShowString(1,str7);P3_5=1;}break;//ASK
            case 'L':{ShowString(1,str3);inc1();}break;
            case 'T':{ShowString(1,str4);dec1();}break;
            case 'R':{LcdReset();ShowString(0,str2);
            	      freq=0;freqstr[0]=0;freqstr[1]=0;freqstr[2]=0;freqstr[3]=0;
            	      count1=0;reset=0;n1=0x10;m=0;i=0;}break;//复位
          }
         EA=1;
       }
   }
}

//-------键盘扫描----------
void keyscan(void)
{ f=1;
  XBYTE[0xf800]=0;
  while(f);
  switch(keyvalue)
    { case 0x70:k=1;break;
      case 0xb0:k=2;break;
      case 0xd0:k=3;break;
      case 0xe0:k=4;break;
      case 0x71:k=5;break;
      case 0xb1:k=6;break;
      case 0xd1:k=7;break;
      case 0xe1:k=8;break;
      case 0x72:k=9;break;
      case 0xb2:k=0;break;
      case 0xd2:k='M';break;
      case 0xe2:k='K';break;
      case 0x73:k='R';break;
      case 0xb3:k='H';break;
      case 0xe3:k='L';break;//右移
      case 0xd3:k='T';break;//左移
     }   
}
//---------外部中断1用于读键值------
Int1_process()  interrupt 2 using 0
{   Uchar i;
    Uchar w=0;
    keyvalue=0;
    Delay400Ms();
    for(i=0;i<5;i++)
	{  
	  w=XBYTE[key[i]]&0x0f;
		if(w!=0x0f)
		{
			keyvalue=(w<<4)|i;		
			f=0;
			EA=0;
			break;
		}
		else f=0;		
	}
    XBYTE[0xf800]=0; 
} 
//--------DDS初始化-----------
void DDSINITIAL(void)
{ 
  Uchar code data1[]={0x10,0x4f,0x00,0x20};
  Uchar code data3[]={0xf5,0x00};//1.5V
  Uchar code data4[]={0xff};
  CS=0;
  MReset=0;
  nop();
  MReset=1;
  nop();
  MReset=0;
  IO_Reset=0;
  nop();
  IO_Reset=1;
  nop();
  IO_Reset=0;
  nop();
  Updata_Clock=0;
  IO_Reset=0;
  nop();
  IO_Reset=1;
  nop();
  IO_Reset=0;
  nop();
  Writecommand(0x07);//向控制寄存器写数据
  Writedata(data1,4);
  IO_Reset=0;
  nop();
  IO_Reset=1;
  nop();
  IO_Reset=0;
  Writecommand(0x0a);
  Writedata(data4,1);
  IO_Reset=0;
  nop();
  IO_Reset=1;
  nop();
  IO_Reset=0;
  Writecommand(0x08);
  Writedata(data3,2);
  IO_Reset=0;
  nop();
  IO_Reset=1;
  nop();
  IO_Reset=0;
  Writecommand(0x09);
  Writedata(data3,2);
  IO_Reset=0;
  nop();
  IO_Reset=1;
  nop();
  IO_Reset=0;
  _nop_();
}
//-------DDS写命令--------
void Writecommand(Uchar a)
{ Uchar i;
  SCLK=0;
  for(i=0;i<8;i++)
    { a<<=1;
      SDIO=CY;
      nop();
      SCLK=1;
      nop();
      SCLK=0;
    }
}
//--------DDS写数据------------------
void Writedata(Uchar code *p,Uchar m)
{ Uchar i,j,b;
  SCLK=0;
  for(i=0;i<m;i++)
    { b=*(p+i);
      for(j=0;j<8;j++)
        {b<<=1; 
         SDIO=CY;
         nop();
         SCLK=1;
         nop();
         SCLK=0;
        }
    }
}
//-----------DDS频率-------------
void writedataFTW(long int data1)
{ Uchar j;
  //data1=~data1;
  SCLK=0;
  for(j=0;j<32;j++)
     {data1<<=1; 
      SDIO=CY;
      nop();
      SCLK=1;
      nop();
      SCLK=0;
     }
  for(j=0;j<16;j++)
    { SDIO=0;
      nop();
      SCLK=1;
      nop();
      SCLK=0;
    }
}
//------延时10us----------
void nop(void)
{ _nop_(); _nop_(); _nop_(); _nop_(); _nop_();
   _nop_(); _nop_(); _nop_(); _nop_(); _nop_();
}
//------显示设定频率---------
void shuru(void)
{ Uchar i,j,i1;
  long int freq1;
  for(i=0;i<4;i++)
     { if(freqstr[i]=='K'){j=0;i1=i;break;}
       else if(freqstr[i]=='M'){j=1;i1=i;break;}
            else if(freqstr[i]=='H'){j=2;i1=i;break;}
     }
  switch(i1)
    { case 3:freq=freqstr[0]*100+freqstr[1]*10+freqstr[2];break;
      case 2:freq=freqstr[0]*10+freqstr[1];break;
      case 1:freq=freqstr[0];break;
    }
  switch(j)
    { case 0:freq1=(long int)(freq*14316.558);break;
      case 1:freq1=(long int)(freq*14316557.653);break;
      case 2:freq1=(long int)(freq*14.317);break;
    }
  DDSINITIAL();
  Writecommand(0x02);
  writedataFTW(freq1);
  Updata_Clock=1;
  nop();
  Updata_Clock=0;//DDS更新时钟刷新;
  Display(j);     
}
//-------频率增-------------
void inc(void)
{ Uchar i,j,i1;
  long int freq1; 
  for(i=0;i<4;i++)
     { if(freqstr[i]=='K'){j=0;i1=i;break;}
       else if(freqstr[i]=='M'){j=1;i1=i;break;}
            else if(freqstr[i]=='H'){j=2;i1=i;break;}
     }
  switch(j)
    { case 0:{ freq=freq+0.1;
    	       if(freq>=1000){freqstr[i1]='M';j=1;freq=1;}
             }break;
      case 1:freq=freq+0.0001;break;
      case 2:{ freq=freq+100;if(freq>=1000){freq=1;freqstr[i1]='K';j=0;}
             }break;
    }
  switch(j)
    { case 0:freq1=(long int)(freq*14316.6);break;
      case 1:freq1=(long int)(freq*14316557.6);break;
      case 2:freq1=(long int)(freq*14.317);break;
    }
  DDSINITIAL();
  Writecommand(0x02);
  writedataFTW(freq1);
  Updata_Clock=1;
  nop();
  Updata_Clock=0;//DDS更新时钟刷新;
  Display(j);
}

void inc1(void)
{ Uchar i,j,i1;
  long int freq1; 
  for(i=0;i<4;i++)
     { if(freqstr[i]=='K'){j=0;i1=i;break;}
       else if(freqstr[i]=='M'){j=1;i1=i;break;}
            else if(freqstr[i]=='H'){j=2;i1=i;break;}
     }
  switch(j)
    { case 0:{ freq=freq+0.1;
    	       if(freq>=1000){freqstr[i1]='M';j=1;freq=1;}
             }break;
      case 1:freq=freq+1.0;break;
      case 2:{ freq=freq+100;if(freq>=1000){freq=1;freqstr[i1]='K';j=0;}
             }break;
    }
  switch(j)
    { case 0:freq1=(long int)(freq*14316.6);break;
      case 1:freq1=(long int)(freq*14316557.6);break;
      case 2:freq1=(long int)(freq*14.317);break;
    }
  DDSINITIAL();
  Writecommand(0x02);
  writedataFTW(freq1);
  Updata_Clock=1;
  nop();
  Updata_Clock=0;//DDS更新时钟刷新;
  Display(j);
}

//---------频率减---------
void dec(void)
{ Uchar i,j,i1;
  Uchar code str9[]="      error       ";
  Uchar code str10[]="                  ";
  long int freq1; 
  for(i=0;i<4;i++)
     { if(freqstr[i]=='K'){j=0;i1=i;break;}
       else if(freqstr[i]=='M'){j=1;i1=i;break;}
             else if(freqstr[i]=='H'){j=2;i1=i;break;}
     }
  switch(j)
    { case 0:freq=freq-0.1;break;
      case 1:{ freq=freq-0.0001;}break;
      case 2:{ freq=freq-100;
      	       if(freq<0){ShowString(0,str9);ShowString(1,str10);j=3;}
             }break;
    }
  switch(j)
    { case 0:freq1=(long int)(freq*14316.6);break;
      case 1:freq1=(long int)(freq*14316557.6);break;
      case 2:freq1=(long int)(freq*14.317);break;
      case 3:freq1=0;break;
    }
  DDSINITIAL();
  Writecommand(0x02);
  writedataFTW(freq1);
  Updata_Clock=1;
  nop();
  Updata_Clock=0;//DDS更新时钟刷新;
  Display(j);
}

void dec1(void)
{ Uchar i,j,i1;
  Uchar code str9[]="      error       ";
  Uchar code str10[]="                  ";
  long int freq1; 
  for(i=0;i<4;i++)
     { if(freqstr[i]=='K'){j=0;i1=i;break;}
       else if(freqstr[i]=='M'){j=1;i1=i;break;}
             else if(freqstr[i]=='H'){j=2;i1=i;break;}
     }
  switch(j)
    { case 0:freq=freq-1;break;
      case 1:{ freq=freq-0.1;}break;
      case 2:{ freq=freq-100;
      	       if(freq<0){ShowString(0,str9);ShowString(1,str10);j=3;}
             }break;
    }
  switch(j)
    { case 0:freq1=(long int)(freq*14316.6);break;
      case 1:freq1=(long int)(freq*14316557.6);break;
      case 2:freq1=(long int)(freq*14.317);break;
      case 3:freq1=0;break;
    }
  DDSINITIAL();
  Writecommand(0x02);
  writedataFTW(freq1);
  Updata_Clock=1;
  nop();
  Updata_Clock=0;//DDS更新时钟刷新;
  Display(j);
}

//--------LCD显示---------
void Display(Uchar s)
{ 
  long int  i;
  Uchar j,n;
  if(s==0){ShowString(0,str1);n=0x04;i=(long int)(freq*10+0.5);if(i<10)ShowChar(0x02,'0');}
  else if(s==1){ShowString(0,str);n=0x07;i=(long int)(freq*10000+0.5);
  	            if(i<10000)ShowChar(0x02,'0');}
  	    else if(s==2){ShowString(0,str8);n=0x04;i=(long int)(freq*10+0.5);}
  while(i)
    { if(s==3){s=0;break;}
      j=i%10;
      i=i/10;
      ShowChar(n--,c[j]);
      if(n==0x03)n=0x02;
      Delay400Ms();
    }
}
//-------------写D/A--------------
void WriteDa(Uchar Dat,Uchar CH)
{
	Uchar i;
	LDAC = 0;
	ClkDA = 0;
	i=Dat;
	for(i=0;i<11;i++)
	{
		ClkDA = 1;
		if(i<3)
		{
			CH<<=1;
			DataDA = CY;
		}
		
		else
		{   Dat <<=1;
			DataDA = CY;
		}
	    _nop_();
	    ClkDA = 0;
    }
	_nop_();
	LOAD = 0;
	_nop_();
	LOAD = 1;
	_nop_();
	ClkDA = 1;
	_nop_();
	ClkDA = 0;
}
//-------100Ms延时-----
void Delay400Ms(void)
{   Uchar i=5;
	Uint j;
	while(i--)
	{
		//j=7269; //400Ms
        j=1817;   //100Ms
		while(j--);
	}
}
//------5Ms延时---------
void Delay5Ms(void)
{
	Uint i = 5552;
	while(i--);
}
//-------LCD初始化------
void LcdReset( void ) {
        LcdWriteCommand( 0x38, 0);			// 显示模式设置(不检测忙信号)
		Delay5Ms();
	LcdWriteCommand( 0x38, 0);			// 共三次
		Delay5Ms();
	LcdWriteCommand( 0x38, 0);
		Delay5Ms();

	LcdWriteCommand( 0x38, 1);			// 显示模式设置(以后均检测忙信号 参数--"1")
    LcdWriteCommand( 0x08, 1);			// 显示关闭
   	LcdWriteCommand( 0x01, 1);			// 显示清屏
	LcdWriteCommand( 0x06, 1);			// 显示光标移动设置
	LcdWriteCommand( 0x0c, 1);			// 显示开及光标设置
}
//----------LCD写命令----------------------------
void LcdWriteCommand( Uchar CMD,Uchar AttribC ) {
       
    W = 1;R = 1;
	if (AttribC) 
	{
		P0=0xff;
		while( XBYTE[Lcd1602StatusPort] & Busy );		// 检测忙信号?
	}
	XBYTE[Lcd1602CmdPort] = CMD;
}
//---------LCD写数据---------------
void LcdWriteData( Uchar dataW ) {
        
        W = 1;R = 1;
	while( XBYTE[Lcd1602StatusPort] & Busy );					// 检测忙信号

       	XBYTE[Lcd1602WdataPort] = dataW;
}
//---------显示字符串----------------
void ShowString(Uchar line,char *ptr)
{ Uchar l,i;
  l=line<<4;
  for(i=0;i<16;i++)
    ShowChar(l++,*(ptr+i));
} 
//---------显示字符-----------------
void ShowChar(Uchar pos,Uchar c)
{ Uchar p;
  if(pos>=0x10)
    p=pos+0xb0;
  else 
    p=pos+0x80;
  LcdWriteCommand(p,1);
  LcdWriteData(c);
}

⌨️ 快捷键说明

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