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

📄 ad9851.c.c

📁 一个很完整的正玄信号发生器.采用AD9851制作.
💻 C
字号:
//#include <reg51.h>
#include <at89X52.H>
#define uchar unsigned char
/*#define  set_fq_ud    fq_ud=1;
#define  clr_fq_ud    fq_ud=0;    
#define  set_clk      clk=1;     
#define  clr_clk      clk=0; 
#define  set_din      din=1;  
#define  clr_din      din=0;
*/
sbit P34=P3^3;
sbit fud=P2^7;
sbit sdio=P2^6;
sbit sclk=P2^5;
sbit reset=P2^4;
sbit LCM_RS=P2^0; //定义引脚
sbit LCM_RW=P2^1;
sbit LCM_E=P2^2;
#define LCM_Data  P0
#define Busy    0x80 //用于检测LCM状态字中的Busy标识
uchar i, j, k, second, tcount, minute, hour;
void WriteDataLCM(unsigned char WDLCM);
void WriteCommandLCM(unsigned char WCLCM,BuysC);
unsigned char ReadDataLCM(void);
unsigned char ReadStatusLCM(void);
void LCMInit(void);
void DisplayOneChar(unsigned char X, unsigned char Y, unsigned char DData);
void DisplayListChar(unsigned char X, unsigned char Y, unsigned char code *DData);
void DisplayqListChar(unsigned char X, unsigned char Y, unsigned char code *DData);
void Delay5Ms(void);
void Delay400Ms(void);
void delay();
uchar disp[10]="    1000 ";
uchar flag=0;
//void send(uchar x);
//unsigned char code table[]={'0','1','2','3','4','5','6','7','8','9'};//数码管数字编码
//unsigned char code MyNo[] = {"OK"};
uchar temp=5;
/******************************************************************************************
**  函数名称:delay()
**  功能描述:延时子程序,大约延时 n MS
**  输  入:
**  输  出:
**  全局变量:
**  调用模块:
********************************************************************************************/
/*void delaynms(uchar n)
{uchar i,j,k;
 for(i=2;i>0;i--)
 for(j=n;j>0;j--)
  for(k=125;k>0;k--);
}*/
/******************************************************************************************
 函数名称:delay10ms()
  功能:延时10MS
*******************************************************************************************/
void delay10ms()
{
 uchar i,j;
  for(i=0;i<100;i++)
   for(j=0;j<50;j++);

}
/******************************************************************************************
**  函数名称:lcd()
**  功能描述:液晶初始化,然后在液晶屏第二行显示提示信息
**  输  入:
**  输  出:
**  全局变量:
**  调用模块:Delay400Ms(),LCMInit(),DisplayListChar()
********************************************************************************************/
void lcd(void)
{
 Delay400Ms(); //启动等待,等LCM讲入工作状态
 LCMInit(); //LCM初始化 
}
/******************************************************************************************
**  函数名称:WriteDataLCM()
**  功能描述:写数据
**  输  入:  WDLCM
**  输  出:
**  全局变量:
**  调用模块:
********************************************************************************************/
void WriteDataLCM(unsigned char WDLCM)
{
 ReadStatusLCM(); //检测忙
 LCM_Data = WDLCM;
 LCM_RS = 1;
 LCM_RW = 0;
 LCM_E = 0; //若晶振速度太高可以在这后加小的延时
 LCM_E = 0; //延时
 LCM_E = 1;
}
/******************************************************************************************
**  函数名称:WriteCommandLCM()
**  功能描述:写指令
**  输  入:
**  输  出:
**  全局变量:
**  调用模块:
********************************************************************************************/
void WriteCommandLCM(unsigned char WCLCM,BuysC) //BuysC为0时忽略忙检测
{
 if (BuysC) ReadStatusLCM(); //根据需要检测忙
 LCM_Data = WCLCM;
 LCM_RS = 0;
 LCM_RW = 0;
 LCM_E = 0;
 LCM_E = 0;
 LCM_E = 1;
}
/******************************************************************************************
**  函数名称:ReadDataLCM()
**  功能描述:读数据
**  输  入:
**  输  出:
**  全局变量:
**  调用模块:
********************************************************************************************/
/*unsigned char ReadDataLCM(void)
{
 LCM_RS = 1;
 LCM_RW = 1;
 LCM_E = 0;
 LCM_E = 0;
 LCM_E = 1;
 return(LCM_Data);
}*/
/******************************************************************************************
**  函数名称:ReadStatusLCM()
**  功能描述:读状态
**  输  入:
**  输  出:
**  全局变量:
**  调用模块:

********************************************************************************************/
unsigned char ReadStatusLCM(void)
{
 LCM_Data = 0xFF;
 LCM_RS = 0;
 LCM_RW = 1;
 LCM_E = 0;
 LCM_E = 0;
 LCM_E = 1;
 while (LCM_Data & Busy); //检测忙信号
 return(LCM_Data);
}
/******************************************************************************************
**  函数名称:LCMInit()
**  功能描述:LCM初始化
**  输  入:
**  输  出:
**  全局变量:
**  调用模块:

********************************************************************************************/
void LCMInit(void)
{
 LCM_Data = 0;
 WriteCommandLCM(0x38,0); //三次显示模式设置,不检测忙信号
 Delay5Ms();
 WriteCommandLCM(0x38,0);
 Delay5Ms();
 WriteCommandLCM(0x38,0);
 Delay5Ms();
 WriteCommandLCM(0x38,1); //显示模式设置,开始要求每次检测忙信号
 WriteCommandLCM(0x08,1); //关闭显示
 WriteCommandLCM(0x01,1); //显示清屏
 WriteCommandLCM(0x06,1); // 显示光标移动设置
 WriteCommandLCM(0x0C,1); // 显示开及光标设置
}
/******************************************************************************************
**  函数名称:DisplayOneChar()
**  功能描述:按指定位置显示一个字符
**  输  入:
**  输  出:
**  全局变量:
**  调用模块:

********************************************************************************************/
void DisplayOneChar(unsigned char X, unsigned char Y, unsigned char DData)
{
 Y &= 0x1;
 X &= 0xF; //限制X不能大于15,Y不能大于1
 if (Y) X |= 0x40; //当要显示第二行时地址码+0x40;
 X |= 0x80; // 算出指令码
 WriteCommandLCM(X, 0); //这里不检测忙信号,发送地址码
 WriteDataLCM(DData);
 delay();
}
/******************************************************************************************
**  函数名称:DisplayListChar()
**  功能描述:按指定位置显示一串字符
**  输  入:
**  输  出:
**  全局变量:
**  调用模块:

********************************************************************************************/
/*void DisplayListChar(unsigned char X, unsigned char Y, unsigned char code *DData)
{
 unsigned char ListLength;
  ListLength = 0;
 Y &= 0x1;
 X &= 0xF; //限制X不能大于15,Y不能大于1
 while (DData[ListLength]>0x20) //若到达字串尾则退出
  {
   if (X <= 0xF) //X坐标应小于0xF
    {
     DisplayOneChar(X, Y, DData[ListLength]); //显示单个字符
     ListLength++;
     X++;
    }
  }
}*/
/******************************************************************************************
**  函数名称:Delay5Ms()
**  功能描述:5ms延时
**  输  入:
**  输  出:
**  全局变量:
**  调用模块:

********************************************************************************************/
void Delay5Ms(void)
{
 unsigned int TempCyc = 5552;
 while(TempCyc--);
}
/******************************************************************************************
**  函数名称:Delay400Ms()
**  功能描述:400ms延时
**  输  入:
**  输  出:
**  全局变量:
**  调用模块:

********************************************************************************************/
void Delay400Ms(void)
{
 unsigned char TempCycA = 5;
 unsigned int TempCycB;
 while(TempCycA--)
 {
  TempCycB=7269;
  while(TempCycB--);
 }
}
void delay()
{
 uchar i;
 for(i=0;i<10;i++);

}
/******************************************************************************************
 函数名称:Key1()
  功能: 键的判别
******************************************************************************************/

void display(uchar x)
{
  uchar code str1[]="Set frency:       ";
  uchar code str2[]="Out frency:       ";
  uchar code str4[]="Set Voltage:      ";
  uchar code str5[]="Out Voltage:      ";

uchar i;

 
 switch(x)
 {
   case 1: 
//    DisplayOneChar(14, 1, 'H');DisplayOneChar(15, 1, 'z'); 
	for(i=0;i<9;i++)
	    {
	      DisplayOneChar(i+5, 1, disp[i]);
    	}
	 ;
	 break;
  case 2: 
    DisplayOneChar(14, 1, 'H');DisplayOneChar(15, 1, 'z');
	 for(i=0;i<16;i++)
	    {
	      DisplayOneChar(i, 0, str1[i]);
    	}
     ;

	 break;
 case 3: 
     DisplayOneChar(14, 1, 'H');DisplayOneChar(15, 1, 'z');;
     for(i=0;i<16;i++)
	    {
	      DisplayOneChar(i, 0, str2[i]);
    	}
;
	 break;
 case 4: 
     DisplayOneChar(14, 1, 'm');
	 DisplayOneChar(15, 1, 'V');;
;
     for(i=0;i<16;i++)
	    {
	      DisplayOneChar(i, 0, str4[i]);
    	}
	 break;
 case 5: 
     DisplayOneChar(14, 1, 'm');
		 DisplayOneChar(15, 1, 'V');
	  for(i=0;i<16;i++)
	    {
	      DisplayOneChar(i, 0, str5[i]);
    	}
        
;
	 break;

 }
 
}

/*void  transad9851(unsigned long f,unsigned char p)
 {      
       long temp;
		 uchar i,temp2;
        clk();//关掉全局中断
        temp=f*;//计算32位频率控制字
        temp2=p;
        clr_fq_ud;     
       clr_clk;
       delay_1us();
       for(i=0;i<32;i++)//将32位频率控制字移入dds芯片寄存器
       {
       if(temp&0x000000200)
        set_din;
       else
        clr_din;
       delay_1us();
       set_clk;
       delay_1us();
       temp=temp>>1;
       clr_clk;
       clr_din;
       delay_1us();
       }
       for(i=0;i<8;i++) //将5位相位控制字及两个(power\reset)控制位移入dds芯片寄存器
       {
       if(temp2&0x014A)
        set_din;
       else
        clr_din;
       delay_1us();
       set_clk;
       delay_1us();
       temp2=temp2>>1;
       clr_clk;
       clr_din;
       delay_1us();
       }
       
       set_fq_ud;
        delay_nus(3);
        clr_fq_ud; 
       delay_nus(3);
       sei();
 }    */

 void writebyte(uchar ch)
 {
   uchar i;
   for(i=0;i<8;i++)
   {
    if(ch&0x80) sdio=1;else sdio=0;
	sclk=0;sclk=0;sclk=1; 
	ch=ch<<1; 
   }
}
void init()
{

//int i;
//int j;
reset=0;
delay();
reset=1;
delay();
/*writebyte(0x00);writebyte(0x84);;writebyte(0x00);writebyte(0x00);writebyte(0x00);
  //fud=0;delay();fud=1;delay();fud=0; 
  delay();delay();delay();delay();delay();delay();
//0x00 00 00 20
// 
writebyte(0x07);writebyte(0x01);;writebyte(0x00);writebyte(0x63);writebyte(0x00);;writebyte(0x20);

// 0x0100630020;
writebyte(0x08);writebyte(0x01);;writebyte(0x00);writebyte(0xc7);writebyte(0x90);;writebyte(0x21);

//0x0100C79021
 writebyte(0x0B);
 for(j=0;j<511;j++){writebyte(j/256); writebyte(j%256);writebyte(0x00);writebyte(00);  }
 for(j=511;j>0;j--){writebyte(j/256); writebyte(j%256);writebyte(0x00);writebyte(00);  }

  fud=0;delay();fud=1;delay();fud=0;
  delay();delay();delay();delay();delay();delay();  
  
*/  
  writebyte(0x01);writebyte(0x00);writebyte(00);writebyte(0x50);
  delay();delay();delay();delay();delay();delay();  

 writebyte(0x02);writebyte(0x88);writebyte(10);
  fud=0;delay();fud=1;delay();fud=0;
  delay();delay();delay();delay();delay();delay();
/**/
}
void setfrency(unsigned long f)
{
  uchar fo[4],i;
 // int f;
 
  unsigned long fw;
//  f=12346;
double fww;
  fww=f*17.179869184;
  fw=fww;
  for(i=0;i<4;i++)
  {
   fo[i]=fw%256;
   fw=fw/256;
  }
  writebyte(0x04);writebyte(fo[3]);writebyte(fo[2]);writebyte(fo[1]);writebyte(fo[0]);
  fud=0;delay();fud=1;delay();fud=0;

}
uchar inkey()
{
  uchar i,k,j=1;
  uchar key_table[16]={0x18,0x11,0x21,0x41,0x12,0x22,0x42,0x14,0x24,0x44,0x81,0x82,0x84,0x28,0x48,0x88};
  for (i=0;i<4;i++)
    {
	  P1=~j;
	  k=~P1;
	  k=k&0xf0;
	  if (k!=0) break;
	  j=j<<1;
	 }
   k=k+j;
   
   for (i=0;i<16;i++)
   {
     if (key_table[i]==k) break;
   }	
  return i;
}
void key(uchar x)
{
   uchar i,k;
  unsigned long y;
   switch (x)
    {
	  case 15: 
	  	 if(flag==1)
		 {
		 flag=0;
		 y=0;
         for(i=1;i<8;i++)
		   {
		     if(disp[i]!=' ')
			 {
			 k=disp[i]&0x0f;
		     y=y*10+k;
			 }
		   }
		  init(); 
		 setfrency(y);
		 display(3);
         
		 }
	  	 break;
	  case 14:
		 display(2);for(i=0;i<8;i++)disp[i]=' ';
		 flag=2;
	    break;
	  case 13:
	     break;
  	  case 12:
        break;
	  case 10:
	    display(4);
         for(i=0;i<8;i++)disp[i]=' ';
		 flag=5;
        break;
	  case 11:
	    display(5);
		if(flag==5)
		 {
		   k=disp[4]&0x0f;
           i=disp[5]&0x0f;
		   y=k*10+i;
		   i=disp[6]&0x0f;
		   //yk=k*5;
		   //i=i>>1;
		   //k=k+i;
		   y=y*10+i;
		   i=disp[7]&0x0f;
		   y=y*10+i;

		   y=y*568/12800;
		   P3=y;
		   P34=0;
		   P34=1;
		
		 }
		 flag=4;
	  	break;
	   default:
         if(flag==2)
  	       {
		     flag=1;
		   }
		 if(flag==1)
		   {
		     for(i=1;i<7;i++) disp[i]=disp[i+1];
			 disp[7]=x+'0';
			 
		   }
		   if(flag==5)
		   {
		     for(i=4;i<7;i++) disp[i]=disp[i+1];
			 disp[7]=x+'0';
		   
		   }
         display(1);
	}
}
void main()
{
  uchar k;
lcd();

/*
sclk=0; 
 fud=0;
 sclk=1;sclk=0;
 fud=1;fud=0;
*/
//sclk=0;
// ps1=0;ps0=0;
//fud=0;
//cs=1;
//
init();
//printf(2222);
setfrency(1000);
display(3);
display(1);
P3=255;
P34=0;
P34=1;


 while(1)
 {
  k=inkey();
  if(k!=16)
   {
     delay10ms();
	 if(k==inkey())
	  {
	    key(k);
		while(k==inkey());
	  }
    }
 
 }
}

⌨️ 快捷键说明

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