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

📄 signal_c.c

📁 这是AD公司的一款DDS芯片的驱动程序
💻 C
字号:
asm(".include hardware.inc");
unsigned long  int Freq_Ctrl_Word=0x14f8c;//0x051eb851;//=0x19581062;//=0x051eb851;//32位的频率控制字
unsigned long int Volt_Ctrl=0;//=0xbb00;     //内部DA输出控制 
unsigned int Phase_Ctrl_Word=0x0000;          //5位的相位控制字
float freq;//=20000;    //(=Freq_Ctrl_Word*0.0002328306436539);//初始频率
float Volt_Show=0.0; //待显示的幅度电压
int  Work_Mode=0x0000;//2位的电源工作方式 ,选择00
int  W_Clk=1;        //1位的字装入控制信号,将频率控制字,相位控制字,芯片工作方式等
                     //写入AD9851内部的40位内部寄存器 ,上升沿有效 
int  Freq_Ud=0;      //频率更新控制字 ,上升沿有效
int  w[40];           //将40位的数据分为5个字节存储在一个数组中        
int  Key_Val;         //键值
int  Am_Ctrl_Word=0x0000;//幅度控制字 ,初始化为0
int  e_pre_set=0;        //预置使能   
int  e_add=0;            //自动步进使能
int  flag=1;             //预置时的位标志  


//=============================================================================
//函数名称:void W_Load(void)
//函数功能:获取40位串行数据
//=============================================================================
void W_Load(void)
{int i;
   for(i=0;i<40;i++)
   {
     Watchdog();
    if(i>=0&&i<32)
      {
         w[i]=((Freq_Ctrl_Word>>i)<<31)>>31;
       }
     else if(i==32)
         w[i]=0;   //6倍频关闭
     else if(i==33||i==34)
         w[i]=Work_Mode;    //工作模式置为00
     else 
         w[i]=((Phase_Ctrl_Word>>(i-35))<<4)>>4;   
   }
}
//==============================================================================
//函数名称:void Write_Ad9851(int n)
//函数功能:向AD9851写数据
//参数说明:n 第n位串行数据
//==============================================================================
void Write_Ad9851(int n)
{     
     int data;  
     data=((W_Clk<<1)+(Freq_Ud<<2)+w[n])<<4;
     asm("[P_IOA_Data]=%0"::"r"(data));
}
//========================================================================
//函数名称:void  Sin_Ctrl(void) 
//函数功能:正弦信号的产生
//===============================================================================
void  Sin_Ctrl(void)       //采用IOA0输入串行数据AD9851,IOA1 W_Clk  IOA2 Fq_Uq
{  
   int j;
    W_Load();     
    Freq_Ud=0;
    asm("[P_IOA_Data]=%0"::"r"(0x0020));       
       for(j=0;j<40;j++)
       {
          Watchdog();
        
          W_Clk=0;
       Write_Ad9851(j); 
         delay(50); 
          W_Clk=1;     
       Write_Ad9851(j); 
          delay(50);          
       }
        Freq_Ud=1; 
        delay(50);
       asm("[P_IOA_Data]=%0"::"r"(0x0060));
         delay(500);
         delay(500);
         delay(500);
}        
//===========================================================================
//函数名称:void Key_Ctrl(void)
//函数功能:键盘控制
//===============================================================================
void Key_Ctrl(void)
{ 
    switch(Key_Val)
  {
     case 0xee00:{ Freq_Adjust(); break;}      //频率步进
     case 0xde00:{ e_add=1; Auto_Add(); break;}//频率自动步进
     case 0xbe00:{e_pre_set=1;break;}          //进入预置模式
     case 0x7e00:{e_pre_set=0;break;}          //退出预置模式
     case 0xb700:{ Am_Adjust(); break;}        //调幅   
     case 0x7700:{Zhan_Kong_Bi();break;}       //调占空比          
  }  
 if(e_pre_set==1)
  {
      switch(Key_Val)
      {
         case 0xed00:  {flag++;if(flag==6) {flag=1;set(5,1);}else set(flag-1,1);break;}
         case 0xdd00:  {flag++;if(flag==6) {flag=1;set(5,2);}else set(flag-1,2);break;}
         case 0xbd00:  {flag++;if(flag==6) {flag=1;set(5,3);}else set(flag-1,3);break;}
         case 0x7d00:  {flag++;if(flag==6) {flag=1;set(5,4);}else set(flag-1,4);break;}
         case 0xeb00:  {flag++;if(flag==6) {flag=1;set(5,5);}else set(flag-1,5);break;}
         case 0xdb00:  {flag++;if(flag==6) {flag=1;set(5,6);}else set(flag-1,6);break;}
         case 0xbb00:  {flag++;if(flag==6) {flag=1;set(5,7);}else set(flag-1,7);break;}
         case 0x7b00:  {flag++;if(flag==6) {flag=1;set(5,8);}else set(flag-1,8);break;}
         case 0xe700:  {flag++;if(flag==6) {flag=1;set(5,9);}else set(flag-1,9);break;}
         case 0xd700:  {flag++;if(flag==6) {flag=1;set(5,0);}else set(flag-1,0);break;}
      }    
    }                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          
}
//=================================================================================
//函数名称:void set(int m,int n)
//函数功能:位预置函数
//参数说明:m 预置的当前位  n 预置的数
//=================================================================================
void set(int m,int n)      //五位数从左到右分别位第一位到第五位
{
   if(m==1)  {freq=freq-(((int)freq)/10000%10)*10000+n*10000;}   //将第一位预置为n
   if(m==2)  {freq=freq-(int)freq/1000%10*1000+n*1000;}     //将第二位预置为n
   if(m==3)  {freq=freq-(int)freq/100%10*100+n*100;}        //将第三位预置为n
   if(m==4)  {freq=freq-(int)freq/10%10*10+n*10;}           //将第四位预置为n   
   if(m==5)  {freq=freq-(int)freq%10+n;}                    //将第五位预置为n
   Freq_Ctrl_Word=freq*4294.967296;
   Sin_Ctrl();          
   display(); 
}
//================================================================================
//函数名称: void  Auto_Add(void)
//函数功能:自动步进
//================================================================================
void  Auto_Add(void)
{
     while( e_add==1) 
      {       
        Freq_Ctrl_Word+=0x00fd6; 
        Sin_Ctrl();
        Watchdog();           
        display();  
        Key_Val=Get_Key(); 
        if(Key_Val==0xde00) e_add=0;
     }    
}
//================================================================================
//函数名称:void delay(int m)
//函数功能:延时
//参数说明:m   决定延时时间长短
//================================================================================
void delay(int m)
{
   int i;
     for(i=0;i<m;i++)
    Watchdog();
}
//================================================================================
//函数名称:void Freq_Adjust(void)
//函数功能:调频
//================================================================================
void Freq_Adjust(void)
{
 
     Freq_Ctrl_Word+=0x0000fd6;//频率步进1Hz 
     if(Freq_Ctrl_Word<0x000101d6)
        {
           Freq_Ctrl_Word=0x00000000;  
        }
     Sin_Ctrl();
     
}
//=================================================================================
//函数名称:void display(void)
//函数功能:显示
//=================================================================================
void display(void)
{  
   float temp;
   int data;
   freq=Freq_Ctrl_Word*0.0002328306436539;
   temp=freq/1000.0;
   
   data=(int)temp/10;
   Light_Led(8,data);
   data=(int)(temp)%10;
   Light_Led(7,data+128);
   data=(int)(temp*10)%10;
   Light_Led(6,data);
   data=(int)(temp*100)%10;
   Light_Led(5,data);
   data=(int)(temp*1000)%10;
   Light_Led(4,data);
   if(e_pre_set==1)
      Light_Led(3,flag);//在第3位显示当前预置的数的位置
   else
       Light_Led(3,0);
   data=(int)Volt_Show;
   Light_Led(2,data+128);
   data=(int)(Volt_Show*10)%10;
   Light_Led(1,data);
}
//===============================================================================
//函数名称:void Am_Adjust(void) 
//函数功能:调幅
//=================================================================================
void Am_Adjust(void)    //B口低8位控制外部DAC以实现调幅
{
   
     Am_Ctrl_Word+=0x0003;
     Volt_Show+=0.1;
     if(Am_Ctrl_Word>0x00ff)Am_Ctrl_Word=0x00ff;
     if(Volt_Show>=8.0)  Volt_Show=8.0;
     asm("[P_IOB_Data]=%0"::"r"(Am_Ctrl_Word));  
}
//==================================================================================
//函数名称:void Zhan_Kong_Bi(void)
//函数功能:调占空比
//==================================================================================
void Zhan_Kong_Bi(void)
{
   Volt_Ctrl+=0x00f0;
   if(Volt_Ctrl>=0xffc0)  Volt_Ctrl=0xffc0;
    DA();      
}
//==============================================================================
//函数名称:int main (void)
//函数功能:主函数
//=================================================================================
int main (void)
{
   Init_Sys();
   Sin_Ctrl();
  while(1)
   {
     Sin_Ctrl();
     Watchdog();  
     display();
     Key_Val=Get_Key();
     Key_Ctrl();      
   }
}

//====================================================================================


⌨️ 快捷键说明

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