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

📄 signal.c

📁 用单片机控制DDS芯片的函数发生器
💻 C
字号:
/**************************************************************************
  
   File Name:       signal.c
   Author:          liuxinfa
   Created:         2008/15/1
   Modified:		NO
   Revision: 		1.0
   Email:           mc22@163.com
  
***************************************************************************/

#include<reg52.h>
#include<LCD12864.h>
#include<AD9850.h>

#define uchar  unsigned char
#define uint   unsigned int
#define ulong  unsigned  long 
  
ulong F_data=1000,S_data=10;
uchar P_data=0;                     //频率,步进,相位

uchar code buf1[14] ={0xd5,0xfd,0xcf,0xd2,0xd0,0xc5,0xba,0xc5,0xb7,0xa2,0xc9,0xfa,0xc6,0xf7};//正弦信号发生器

//Port Definitions*********************************************************
sbit LCDLED=P2^7;                 //LCD背光

//Delay*******************************************************************
void  Delay(uint ms)
{
    uchar  i;
	while(ms--)
	{
	    for(i=126;i>1;i--);
	}

}



//LCD显示***************************************************************
//开机画面
void LCD_Begin()
{
    print(0,0,"毕业设计");
	printstr(0,1,buf1,14);			//显示正弦信号发生器
	print(5,2,"刘新发");
	print(3,3,"2008/01/12");
	Delay(6000);
}
//文字说明
void LCD_Display()
{
    ClearLCD();
	print(0,0," DDS信号源");
	print(0,1,"当前频率:");
	print(0,3,"调谐步进"); 

}
//数字显示程序(ASCII转换)
 void xianshu(ulong a)
{          
    ulong c,p=0;
    c=a/1000000000;
    if(c!=0)
    {
	     LCD_Write(LCD_DATA,c+0x30);
         p=1;
    }
     c=(a%1000000000)/100000000;
     if(c!=0 || p==1)
     {
	     LCD_Write(LCD_DATA,c+0x30);
         p=1;
     }
     c=(a%100000000)/10000000;
     if(c!=0 || p==1)
     {
	     LCD_Write(LCD_DATA,c+0x30);
         p=1;
     }
     c=(a%10000000)/1000000;
     if(c!=0 || p==1)
     {
	     LCD_Write(LCD_DATA,c+0x30);
         p=1;
      }
      c=(a%1000000)/100000;
      if(c!=0 || p==1)
      {
	     LCD_Write(LCD_DATA,c+0x30);
         p=1;
      }
      c=(a%100000)/10000;
      if(c!=0 || p==1)
      {
	     LCD_Write(LCD_DATA,c+0x30);
         p=1;
      }               
      c=(a%10000)/1000;
      if(c!=0 || p==1)
      {
	     LCD_Write(LCD_DATA,c+0x30);
         p=1;
      }
      c=(a%1000)/100;
      if(c!=0 || p==1)
      {
	     LCD_Write(LCD_DATA,c+0x30);
         p=1;
      }
      c=(a%100)/10;
      if(c!=0 || p==1)
      {
	     LCD_Write(LCD_DATA,c+0x30);
      }
                
      c=a%10+0x30;
	  LCD_Write(LCD_DATA,c);
    
}


//当前参数显示
void Data_Display(ulong a,ulong b)
{
    uchar fs,ps;
	ulong A=a;
	ulong B=b;
	if(a%1000==0)
	{
	    fs='K';
		a/=1000;
		if(a%1000==0)
		{
		    fs='M';
			a/=1000;
		}
	}
    else  {fs=' ';}

	if(b%1000==0)
	{
	    ps='K';
		b/=1000;
		if(b%1000==0)
		{
		    ps='M';
			b/=1000;
		}
	}
    else  {ps=' ';}

	switch(fs)
	{
	    case  'M':A/=1000000;break;
		case  'K':A/=1000;break;
	    default:    break;
	}
	Set_xy(0,2);
    xianshu(A);		    //显示当前频率

    switch(ps)
	{
	    case  'M':B/=1000000;break;
		case  'K':B/=1000;break;
	    default:    break;
	}
	Set_xy(4,3);
    xianshu(B);		    //显示当前步进值
    Set_xy(6,2);
	LCD_Write(LCD_DATA,0x20);  //写个空格
	LCD_Write(LCD_DATA,fs);
	Set_xy(6,3);
	LCD_Write(LCD_DATA,0x20);  //写个空格
	LCD_Write(LCD_DATA,ps);
	print(7,2,"Hz");
    print(7,3,"Hz");



} 

//按键程序****************************************************************
void Get_key(void)
{
    uchar temp;
	Delay(10);                        //延时消抖
	if(P1==0xff)return;
	temp=P1;
	switch(temp)
	{
	    case  0xfe:	 break;
		case  0xfd:	 {S_data*=10;if(S_data>10000000)S_data=1; break;}    //步进调整
		case  0xfb:	 {F_data+=S_data;if(F_data>40000000)F_data=1; break;} //频率加调整
		case  0xf7:  {F_data-=S_data;if(F_data<1)F_data=40000000;break;}  //频率减
		default:    break;
	
	}
	//while(!(P1==0xff));                      //等待按键释放
	Delay(200);
}
//主程序******************************************************************
main()
{
	LCD_Initial();
	AD9850_Initial();
	LCD_Begin();
	LCD_Display();
	while(1)
	{
	      LCD_Display();
		  Data_Display(F_data,S_data);              //当前值显示
		  AD9850_Write(F_data,P_data); //输出频率相位控制字
	      while(P1==0xff);            //等待按键按下
		  Get_key();                   //读键并处理
          ClearLCD();
	}
}

⌨️ 快捷键说明

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