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

📄 dds.txt

📁 基于DDS与单片机的接口的C语言编程,及对DDS的控制字的写入
💻 TXT
字号:
#include <reg52.h>
#include <math.h>
#include <intrins.h>

unsigned char code seg[10]={0x03,0x9f,0x25,0x0d,0x99,0x49,0x41,0x1f,0x01,0x19};
unsigned char code seg_zero[10]={0x02,0x9e,0x24,0x0c,0x98,0x48,0x40,0x1e,0x00,0x18};
unsigned long idata kongzhizit ;
unsigned long idata f_kongzhizi ;
unsigned char fre0,fre1,fre2,fre3,fre4,fre5;   //定义频率字
unsigned char fudu0,fudu1,fudu2,fudu3;
unsigned long freqw;

sbit P3_2=P3^2;
sbit CLK=P3^4;
sbit DAT=P3^3;
sbit w_clk =P2^7;
sbit fq_ud =P2^6;
sbit cs= P3^6;
sbit sck = P2^5;
sbit si = P2^4;
unsigned char  w[5];
unsigned char dispbuff[8];//显示缓冲区
void delay(unsigned int temp1)
{
    while(temp1--);
}

void Moni_Send(unsigned char dsdata)
 {
 unsigned char i,temp=0;

	CLK=0;
		for(i=0;i<=7;i++)
		{
			temp=dsdata&0x01;
			dsdata=dsdata>>1;
			if(temp==0)
				DAT=0;
			else
				DAT=1;   //置数据在端口上

			CLK=1;  //发出移位脉冲
			CLK=0;
		}

 }

 //清空显示---------------------------------------------------------------
void disp_cls(void)
{ char i;
  for(i=0;i<8;i++)
   {
    Moni_Send(0xff);
    }


 }

void disp_int()
{ char i,j;
  for(i=0;i<10;i++)
  {
    dispbuff[0]=seg[i];
    dispbuff[1]=seg[i];
    dispbuff[2]=seg[i];
    dispbuff[3]=seg[i];
    dispbuff[4]=seg[i];
    dispbuff[5]=seg[i];
    dispbuff[6]=seg[i];
    dispbuff[7]=seg[i];

    for(j=0;j<8;j++)
    {Moni_Send(dispbuff[j]);
     }

	delay(60000);

    disp_cls();
  }
}
//*显示频率数值程序--------------------------------------------
void disp_freqnum(fre5,fre4,fre3,fre2,fre1,fre0)
{dispbuff[7]=0xff;
 dispbuff[6]=0xff;
 dispbuff[5]=seg[fre5];  //ge wei
 dispbuff[4]=seg[fre4];  //shi wei
 dispbuff[3]=seg[fre3];  //bai wei
 dispbuff[2]=seg[fre2];  //qian wei
 dispbuff[1]=seg[fre1];  //wang wei
 dispbuff[0]=seg[fre0];  //shiwang wei
 Moni_Send(dispbuff[7]);
 Moni_Send(dispbuff[6]);
 Moni_Send(dispbuff[5]);
 Moni_Send(dispbuff[4]);
 Moni_Send(dispbuff[3]);
 Moni_Send(dispbuff[2]);
 Moni_Send(dispbuff[1]);
 Moni_Send(dispbuff[0]);
 }
//*显示幅度数值程序--------------------------------------------
void disp_fudunum(fudu3,fudu2,fudu1,fudu0)
{dispbuff[7]=0xff;
 dispbuff[6]=0xff;
 dispbuff[5]=0xff;
 dispbuff[4]=0xff;
 dispbuff[3]=seg[fudu3];
 dispbuff[2]=seg[fudu2];
 dispbuff[1]=seg[fudu1];
 dispbuff[0]=seg[fudu0];
 Moni_Send(dispbuff[7]);
 Moni_Send(dispbuff[6]);
 Moni_Send(dispbuff[5]);
 Moni_Send(dispbuff[4]);
 Moni_Send(dispbuff[3]);
 Moni_Send(dispbuff[2]);
 Moni_Send(dispbuff[1]);
 Moni_Send(dispbuff[0]);
 }

 //*键盘处理程序--------------------------------------------
unsigned char key_chk()
{
	unsigned char temp,key_c;
						// 11xx xxxx
    P1 =0xF0;			// 1111 0000
	ACC =P1 & 0xF0;		// 1111 0000
	B =ACC;
	P1 =0x0F;			// 0000 1111
	ACC =P1 & 0x0F;		// 0000 1111
	temp=ACC | B;
	if( temp !=0xff ) 	// 1111 1111
	{
		switch( temp)
		{

			case 0x77: key_c= 0; break;//0
			case 0xbd: key_c= 1; break;//1
			case 0xbb: key_c= 2; break;//2
			case 0xb7: key_c= 3; break;//3
			case 0xed: key_c= 4; break;//4
			case 0xeb: key_c= 5; break;//5
			case 0xe7: key_c= 6; break;//6
			case 0xdd: key_c= 7; break;//7
			case 0xdb: key_c= 8; break;//8
	        case 0xd7: key_c= 9; break;//9
            case 0x7b: key_c= 10; break;//chuanhuan
            case 0xee: key_c= 11; break;   	//+
            case 0xbe: key_c= 12 ; break;	//*
			case 0x7d: key_c= 13; break;	//<-
			case 0xde: key_c= 14; break;	//clear
			case 0x7e: key_c= 15; break;//enter
			default: key_c=0xff;
		}

		return(key_c);
	}
	else return(0xff);
}

unsigned char get_key()
{
	unsigned char temp,temp1;
   // temp=key_chk();
   // delay(15320);
   // temp1=key_chk();
//	if(temp==temp1)
//	return temp;
//	else
//	return 0xff;
	do
	{
	temp=key_chk();
	delay(12000);
	temp1=key_chk();
	}
	while(temp==0xff||temp!=temp1);

	return(temp);
}

//*频率数值调整程序--------------------------------------------

void pinlvtiaozheng(unsigned char key)
 {    unsigned char dat;
      dat=key;
      fre5=fre4;
      fre4=fre3;
      fre3=fre2;
      fre2=fre1;
      fre1=fre0;
      fre0=dat;
 }

//*频率数值减1处理程序---------------------------------------------
void pinlvjian1()
  { if (fre0!=0)
   	{fre0--;
	 }
     else
	{fre0=9;
         if (fre1!=0)
	    {fre1--;
 	    }
	 else
	    {fre1=9;
	     if(fre2!=0)
	       {fre2--;
 	       }
         else
	       {fre2=9;
		if(fre3!=0)
		  {fre3--;
 	          }
		else
		  {fre3=9;
		   if(fre4!=0)
		     {fre4--;
 		     }
		   else
		     {fre4=9;
		      if(fre5!=0)
		        {fre5--;
 		         }
		      else
			 {fre5=5;
			 }
		     }
	          }
               }
           }
       }
    }

//*频率数值加1处理程序---------------------------------------------
void pinlvjia1()
 { if (fre0!=9)
      {fre0++;
      }
   else
      {fre0=0;
      if (fre1!=9)
	    {fre1++;
 	    }
      else
	    {fre1=0;
	     if(fre2!=9)
	        {fre2++;
 	         }
         else
	    {fre2=0;
	    if(fre3!=9)
	      {fre3++;
 	      }
	    else
	      {fre3=0;
	       if(fre4!=9)
	         {fre4++;
 		     }
           else
		     {fre4=0;
	          if(fre5!=5)
	            {fre5++;
 		        }
		      else
		        {fre5=0;  //注意可能会在这里出错
		        }
		     }
	      }
        }
     }
  }
 }

//*幅度数值调整程序--------------------------------------------
void fudutiaozheng(unsigned char key)
 {    unsigned char f_dat;
      f_dat=key;
      if ((fudu2==1)&&(fudu1==0)&&(fudu0==0)&&(f_dat==0))    //保证不超过100mA
         fudu3=1;
      else
         fudu3=0;
      fudu2=fudu1;
      fudu1=fudu0;
      fudu0=f_dat;
  }


 //*幅度控制字输送程序--------------------------------------------
void fudu_shusong(f_kongzhizi)
 { unsigned char i,j;
   j=f_kongzhizi%256;
   cs=0;
   _nop_();
   for(i=0;i<8;i++)
     {si=j&0x80;
      _nop_();
      sck=1;
      _nop_();
      sck=0;
      j<<=1;
      }
   cs=1;
 }


//*幅度数值减0.5处理程序---------------------------------------------
void fudujian1()
 {if (fudu0!=0)
      {fudu0=fudu0-5;
       }
   else
      {fudu0=5;
       if(fudu1!=0)
         {fudu1--;
         }
        else
         {fudu1=9;
          if(fudu2!=0)
            {fudu2--;
            }
           else
            {if (fudu3==1)
                {fudu3=0;
                 fudu2=9;
                }
             }
          }
       }
  }

//*幅度数值加0.5处理程序---------------------------------------------
void fudujia1()
 {if (fudu0!=5)
      {fudu0=fudu0+5;
       }
   else
      {fudu0=0;
       if(fudu1!=9)
         {fudu1++;
         }
        else
         {fudu1=0;
          if(fudu2!=9)
            {fudu2++;
            }
           else
            {if (fudu3==0)
                {fudu3=1;
                 fudu2=0;
                }
             }
          }
       }
  }



void onsetflame()
{  w[0]=0x00; 
 
   w[1]=0x01;                      //100                0x53e3
   w[2]=0x47;                      //0x147ae14   100k       0x20c49b   10k
   w[3]=0xae;                      //50                   0x29f1
   w[4]=0x14;
  
   fq_ud=0;

   w_clk=0;
   P0=w[0];
   w_clk=1;

   w_clk=0;
   P0=w[1];
   w_clk=1;
  
   w_clk=0;
   P0=w[2];
   w_clk=1;
  
   w_clk=0;  
   P0=w[3];
   w_clk=1;
  
   w_clk=0;
   P0=w[4];
   w_clk=1;
 
   w_clk=0;
 
   fq_ud=1;
   
   fq_ud=0;
 
}
void loadword()
{
   fq_ud=0;

   w_clk=0;
   P0=w[0];
   w_clk=1;

   w_clk=0;
   P0=w[1];
   w_clk=1;
  
   w_clk=0;
   P0=w[2];
   w_clk=1;
  
   w_clk=0;  
   P0=w[3];
   w_clk=1;
  
   w_clk=0;
   P0=w[4];
   w_clk=1;
 
   w_clk=0;
 
   fq_ud=1;
   
   fq_ud=0;
 

}

void  loadgengxin(unsigned long frew_song)
{ delay(30000);  
  w[4]=frew_song;
  frew_song=frew_song>>8;
  w[3]=frew_song;
  frew_song=frew_song>>8;
  w[2]=frew_song;
  frew_song=frew_song>>8;
  w[1]=frew_song;
  frew_song=frew_song>>8;
  w[0]=0x00;
 loadword();
}
main()
  {unsigned char key;
   unsigned long freq_song;
   disp_int();       //调用晶体管初始化程序
   disp_cls();      //晶体管清零程序
   onsetflame();
   P3_2=0;          //设置指示灯为亮,开始为设置频率态
  
     while(1)
     { key=get_key();  // 从键盘程序返回键盘值
	   if (key!=0xff)  //若无输入,则重新开始循环体
	      { //if(P3_2==0)   //在P3_2为零时,不考虑key=13和16时的动作
		    //{ 
			    if(0<=key&&key<=9)
 			      {freqw=freqw*10+key; 
				   pinlvtiaozheng(key);  //调用频率数值左移程序
				   disp_freqnum(fre5,fre4,fre3,fre2,fre1,fre0);//调用频率显示程序
				  }
                 else if(key==10)   //.
				   { 
				    
				   }
				 else if(key==11)
				  { freqw=freqw+1;
				    freq_song=freqw*215;
				    loadgengxin(freq_song);
				    pinlvjia1(); //频率加1,频率幅度调整程序
                    disp_freqnum(fre5,fre4,fre3,fre2,fre1,fre0); //频率显示程序
				  }
				 else if(key==12)
				  { freqw=freqw-1;
				    freq_song=freqw*215;
				    loadgengxin(freq_song);
				     pinlvjian1(); //频率减一,频率数值调整程序
                    disp_freqnum(fre5,fre4,fre3,fre2,fre1,fre0);//频率显示程序
                  }
				  else if(key==14)   //清零键
				   { fre5=0;fre4=0;fre3=0;fre2=0;fre1=0;fre0=0;
				     freqw=0;
                     disp_cls(); //晶体管清零程序
				   }
			     else if(key==15)  //确定键
				   {					
					 freq_song=freqw*215;
					 loadgengxin(freq_song);
					
                     }
				}
          /*
              else
                { if(0<=key&&key<=9)
 			      { fudutiaozheng(key); //调用频率数值左移程序
                    disp_fudunum(fudu3,fudu2,fudu1,fudu0);  //调用幅度显示程序
				  }
                  else if(key==10)   //确定键
				   { //P3_2=0;
				     f_kongzhizi=(fudu0+fudu1*10+fudu2*100+fudu3*1000)/5;//求幅度控制字模块
					fudu_shusong(f_kongzhizi); //幅度控制字传输程序   还没编!
				     //是否能在这里添加显示以前的频率的程序呢?
				   }
				else if(key==11)
				  {  fudujia1();//幅度加1,幅度调整程序
                     disp_fudunum(fudu3,fudu2,fudu1,fudu0); //幅度显示程序
				      f_kongzhizi=(fudu0+fudu1*10+fudu2*100+fudu3*1000)/5;//求幅度控制字模块
					//幅度控制字传输程序   还没编!
				   }
				   else if(key==12)
				  {  fudujian1();//幅度减一,幅度数值调整程序
                     disp_fudunum(fudu3,fudu2,fudu1,fudu0); //幅度显示程序
					 f_kongzhizi=(fudu0+fudu1*10+fudu2*100+fudu3*1000)/5;//求幅度控制字模块
					fudu_shusong(f_kongzhizi);//幅度控制字传输程序   还没编!
				   }
				  else if(key==14)   //清零键
				   { fudu0=0;fudu1=0;fudu2=0;fudu3=0;//清除幅度数值
                     disp_cls(); //晶体管清零程序
				   }
			    else if(key==15)
				   { f_kongzhizi=(fudu0+fudu1*10+fudu2*100+fudu3*1000)/5; // 求幅度控制字模块
				     fudu_shusong(f_kongzhizi);  //幅度控制字传输程序   还没编!?
				    }
               // }
              }
*/
          }
  }

⌨️ 快捷键说明

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