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

📄 main.c

📁 基于ATMEGA16和DDS的信号发生器的代码
💻 C
📖 第 1 页 / 共 2 页
字号:

#include <intrinsics.h>
#include <AD9851_CONFIG.h>
#include <ina90.h>/*包含inavr.h文件,inavr.h文件中有两个库函数可直接调用来读写EEPROM*/

void fq_display(void);               //将当前频率显示在液晶上
void factor_display(void);           //将当前的修正系数显示在液晶上
void correction_set(void);           //设置修正系数的子函数


unsigned long  fq,fq1;               //存放当前频率,在设置修正系数时将fq的值暂存到fq1中,设置完毕后写回fq
uchar frequency[6];                  //存放当前频率显示数据

uchar mode=1;                        //为1时进入频率设置状态,为零时处于等待状态
unsigned long  con_word;             //存放当前频率对应的控制字的十进制格式数据
float con_word_temp;                 //控制字的计算过程可能会出现在大于32位的中间量     
uchar con_word_array[5]={0x00,0x00,0x00,0x00,0x00};//控制字保存数组
uchar key_num=0;                     //键值

uchar corrected;                     //修正系数是否有效的标志 
unsigned long correction1=10000000;  //保留在E2PROM中的修正系数对应的正整数形式
float correction_temp;               //存放修正系数,用于计算频率控制字
uchar factor[9]={0x00,'.',0x00,0x00,0x00,0x00,0x00,0x00,0x00}; //存放修正系数的显示数据,在设置完修正系数后将该数组中除小数点外的其他八位数据存入EEPROM中


void main(void)
{    
     
     
     fq=800000;           //初始频率设为800KHZ
     con_word=4294967295;
     /*********************液晶初始化,并将DDS置成串行控制模式******************************/     
     LCD_init();
     //showstring(0,0,"                ");
     //delay_nms(100);
     //showstring(0,1,"                ");
     //delay_nms(100);
     showstring(0,0,"LCD_INI FINISH");   //提示液晶初始化完成
     set_dds_to_serial();                //将DDS设置成串行控制工作模式
     delay_nms(1000);
     showstring(0, 0,"DDS SERIAL MODE"); //提示DDS工作在串行工作模式
     delay_nms(1000);
     
     /**************判断修正系数是否已经保留在E2PROM中,是则读出,否则进行设置*****************/ 
     _EEGET(corrected,0x00);             //读出EEPROM中修正系数是否有效的标志,为1是有效
     if(corrected == 1)                  //修正系数有效时读出八位的修正系数,存放在数据factor的相应位中
       {
       _EEGET(factor[0],0x01);
       _EEGET(factor[2],0x02);
       _EEGET(factor[3],0x03);
       _EEGET(factor[4],0x04);
       _EEGET(factor[5],0x05);
       _EEGET(factor[6],0x06);
       _EEGET(factor[7],0x07);
       _EEGET(factor[8],0x08);
       correction1 = factor[0]*10000000+factor[2]*1000000+factor[3]*100000+factor[4]*10000+factor[5]*1000+factor[6]*100+factor[7]*10+factor[8];
       correction_temp =correction1/10000000.0;//计算出上一次保存的修正系数的值,精确到小数点后七位
       factor_display();                       //在液晶上显示当前系统所用的修正系数
       delay_nms(1000);
       }
     else
       {
        correction_set();
       }
     /**********以下到FOR循环前输出初始的信号***************/
     con_word_temp=fq*4294967296*correction_temp/Fosc;
     con_word=con_word_temp;
     con_word_array[0]=con_word%256;
     con_word_array[1]=con_word/256%256;
     con_word_array[2]=con_word/256/256%256;
     con_word_array[3]=con_word/256/256/256;
     write_word(con_word_array);    
     fq_display();                                       //显示出DDS产生的信号的频率
     showstring(0,1,"set frequency   ");
     /****************进入循环状态*****************/
     for(;;)   
       { 
         while(mode)                                     //mode=1时进入重置频率状态
         {
           
           key_num = get_key();
           switch(key_num)
           {
           case '*': mode = 0;                          //频率设置完毕后按下'*'键进行确定,并将新的频率字写入DDS中
                     con_word_temp=fq*4294967296*correction_temp/Fosc;
                     con_word=con_word_temp;
                     con_word_array[0]=con_word%256;
                     con_word_array[1]=con_word/256%256;
                     con_word_array[2]=con_word/256/256%256;
                     con_word_array[3]=con_word/256/256/256;
                     write_word(con_word_array);
                     showstring(0,1,"new word downed ");
                     break;
           case '1': fq += 1;                          //按1号键加1
                     fq_display();
                     break;
           case '4': fq -= 1;                          //按4号键减1
                     fq_display();
                     break;
           case '2': fq += 10;                         //按2号键加10
                     fq_display();
                     break;
           case '5': fq -= 10;                         //按5号键减10
                     fq_display();
                     break;
           case '3': fq += 100;                        //按3号键加100
                     fq_display();
                     break;
           case '6': fq -= 100;                        //按6号键减100
                     fq_display();
                     break;
           case 'A': fq += 1000;                       //按A键加1000
                     fq_display();
                     break;
           case 'B': fq -= 1000;                       //按B键减1000
                     fq_display();
                     break;
           case '#': correction_set();
                     delay_nms(1000);
                     showstring(0,1,"set frequency   ");
                     break;
           default:break;
           }
         }
         
         while(!mode)                                 //mode=0时可以对DDS进行关闭与唤醒,
         {
          
          key_num = get_key();
          switch(key_num)
          {
           case '*':mode=1;
                    showstring(0,1,"set frequency   ");
                    break;
           case '#': correction_set();
                     //delay_nms(1000);
                     showstring(0,1,"new word downed ");
                     break;
           case '0':con_word_array[4]=0x04;          //POWER_DOWN
                    write_word(con_word_array);
                    break;
           case '8':con_word_array[4]=0x00;          //POWER_UP
                    write_word(con_word_array);
                    break;
          default:break;
          }       
         }               
       }
}

void fq_display(void)                             //调用函数将当前的频率显示出来
{
     uchar i;
     showstring(0,0,"F:        Hz    ");
     frequency[5]=fq%10;                         //最低位
     frequency[4]=fq/10%10;
     frequency[3]=fq/100%10;
     frequency[2]=fq/1000%10;
     frequency[1]=fq/10000%10;
     frequency[0]=fq/100000;                    //最高位
     
     for(i=0;i<6;i++)                           //显示6位数据
     {
       switch(frequency[i])
       {
        case 0:showchar(i+3,0,'0');break;
        case 1:showchar(i+3,0,'1');break;
        case 2:showchar(i+3,0,'2');break;
        case 3:showchar(i+3,0,'3');break;
        case 4:showchar(i+3,0,'4');break;
        case 5:showchar(i+3,0,'5');break;
        case 6:showchar(i+3,0,'6');break;

⌨️ 快捷键说明

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