正文

单片机控制AD9835源程序2012-08-15 11:33:00

【评论】 【打印】 【字体: 】 本文链接:http://blog.pfan.cn/enc999/53719.html

分享到:

  /*====================================================================
        *为提高程序的可读性编写的程序模板*                            
              *文件名:mypro.c *               
  =====================================================================*/


/*======================================================================
       包含头文件
 ======================================================================*/
 #include<reg51.h>
 #include "defs_c51_heima.h"
  
/*=======================================================================
       常数定义
 =======================================================================*/
 #define TIME_1MS 49      // delay  1ms for 2051
 #define TIME_1S  49000   // delay  1s for 2051


/*=======================================================================
       端口定义
  ======================================================================*/
    sbit SCLK = P1^3;
 sbit SDATA= P1^2;
 sbit FSYNC= P1^1;

/*========================================================================
        (指令)
 ========================================================================*/
 #define Wrt_16_Pha 0x0000  //写16位相位到DATA REGISTER  C3 C2 C1 C0 =0000
 #define Wrt_8_Pha  0x1000  //写8位相位到DEFER REGISTER  C3 C3 C1 C1 =0001
 #define Wrt_16_Fre 0x2000     //写16位频率到DEFER REGISTER C3 C2 C1 C0 =0010
 #define Wrt_8_Fre 0x3000  //写8位频率到DATA REGISTER   C3 C2 C1 C0 =0011
 #define Sel_Pha_Reg 0x4000  //D10 D9用来选择相位寄存器  C3 C2 C1 C0 =0100
 #define Sel_Fre_Reg 0x5000  //D11 用来选择频率寄存器  C3 C2 C1 C0 =0101
 #define Sel_Fre_Pha 0x6000  //D10 D9选择相位、D11选择频率 C3 C2 C1 C0 =0110
 #define Reserved 0x7000  //用来测试      C3 C2 C1 C0 =0111
 #define CmdSynSel   0x8000  //同步,数据源选择方式     C3 C2 C1 C0 =1000
 #define CmdResClr   0xC000  //复位寄存器,      C3 C2 C1 C0 =1100


/*==========================================================================
           (地址)
 ==========================================================================*/
 #define Adr_Fr0_LL 0x0000  //频率寄存器0的7~0位寄存器地址
 #define Adr_Fr0_LH  0x0100  //频率寄存器0的15~8位寄存器地址
 #define Adr_Fr0_HL  0x0200  //频率寄存器0的23~16位寄存器地址
 #define Adr_Fr0_HH  0x0300  //频率寄存器0的31~24位寄存器地址
 #define Adr_Fr1_LL  0x0400 
 #define Adr_Fr1_LH  0x0500
 #define Adr_Fr1_HL  0x0600
 #define Adr_Fr1_HH  0x0700
 #define Adr_Ph0_L   0x0800  //相位寄存器0的7~0位寄存器地址
 #define Adr_Ph0_H   0x0900  //相位寄存器0的15~8位寄存器地址
 #define Adr_Ph1_L   0x0a00
 #define Adr_Ph1_H   0x0b00
 #define Adr_Ph2_L   0x0c00
 #define Adr_Ph2_H   0x0d00
 #define Adr_Ph3_L   0x0e00
 #define Adr_Ph3_H   0x0f00

/*=======================================================================
        (数据)  freg= fout/fmclk*2^32
 =======================================================================*/
 //产生1HZ频率    00000056
    #define FRE0LL  0x0056 
    #define FRE0LH  0X0000 
 #define FRE0HL  0x0000 
    #define FRE0HH  0X0000 
//产生1KHZ频率    00014f8b
 #define FRE1LL  0x008B
 #define FRE1LH  0x004f   
    #define FRE1HL  0x0001 
 #define FRE1HH  0x0000
  
//t/4    
 #define PHA0L  0x0000  //0x2000 
 #define PHA0H  0x0020
//t/2
 #define PHA1L  0x0000  //0x4000  
 #define PHA1H  0x0040
//3t/4
 #define PHA2L  0x0000  //0x6000 
 #define PHA2H  0x0060
//t
 #define PHA3L  0x0000  //0x8000
 #define PHA3H  0x0080

/*=======================================================================
         (功能)
 =======================================================================*/
//初始化时的一些功能
 #define SLEEP  0x2000     //SLEEP
 #define NOSLEEP  0x0000
 #define RESET  0x1000     //RESET
 #define NORESET  0x0000
 #define CLEAR  0x0800    //CLEAR
 #define NOCLEAR  0x0000
//  同步、数据源选择方式
 #define SYNC  ENABLE   // 使能同步
 #define SELSRC  ENABLE  // ENABLE:选择位  DISZBLE:选择引脚
#if(SYNC)
 #define SynChrTion  0x2000   //同步
#else
 #define SynChrTion 0x0000
#endif
#if(SELSRC)
 #define SelBinPin 0x1000   //选择BIN
#else
 #define SelBinPin 0x0000   //PIN
#endif
 
// 频率、相位选择  作为函数SelDataSrc()的参数
  #define SelFr0  0x0000   //选择频率寄存器0
 #define SelFr1  0x0100   //选择频率寄存器1
 #define SelPh0  0x0000   //选择相位寄存器0
 #define SelPh1  0x0200   //选择相位寄存器1
 #define SelPh2  0x0400   //选择相位寄存器2
 #define SelPh3  0x0600   //选择相位寄存器3

 

/*==========================================================================
       全局变量
  =========================================================================*/
    uint CMD;  // CMD= 指令  |    功能1  |  功能2|……
 uint DATA; // DATA=   指令  |    地址   |  数据
 
/*=========================================================================
       函数声明
 =========================================================================*/
   void Delay(uint n);
 void WriteChar(uint ch);       //向AD9835写一个字节
 void SelDataSrc(uint selfr,uint selph); //选择相位寄存器,频率寄存器
 void Init_9835(void);


/*=========================================================================
        函数定义
 =========================================================================*/
void Delay (uint n){
  uint i;
  while(n--)for(i=0;i<TIME_1S;i++);
}
 

void WriteChar(uint ch)       //向AD9835写一个字节  下降沿发一个BIT,先发MSB
{
      uchar i;
   uint t;
   t = ch;
   FSYNC = 0;
   for(i=0;i<15;i++)
   {
       SCLK = 1;
    if(t&0x8000!=0)
    {
         SDATA = 1;
    }
    else
    {
         SDATA = 0;
    }
    SCLK  = 0;
    t = t << 1;
   }
   FSYNC=1;
}

void SelDataSrc(uint selfr,uint selph)
{
  if(SELSRC){
   CMD=Sel_Fre_Pha|selfr|selph;   //选择相位寄存器,频率寄存器
   WriteChar(CMD);
  }
}

void Init_9835(void)
{
  // CMD= 指令    |功能1|功能2|功能3
  CMD=CmdResClr|SLEEP|RESET|CLEAR;   //复位、清零
  WriteChar(CMD);
 
  // CMD= 指令    |功能1     |功能2    
  CMD=CmdSynSel|SynChrTion|SelBinPin;   //同步、数据源选择
  WriteChar(CMD); 
 
 // DATA=   指令  |   地址   |  数据
  DATA=Wrt_8_Fre|Adr_Fr0_LL|FRE0LL;    //写FR0
  WriteChar(DATA);
  DATA=Wrt_16_Fre|Adr_Fr0_LH|FRE0LH;
  WriteChar(DATA);
  DATA=Wrt_8_Fre|Adr_Fr0_HL|FRE0HL;
  WriteChar(DATA);
  DATA=Wrt_16_Fre|Adr_Fr0_HH|FRE0HH;
  WriteChar(DATA);

  DATA=Wrt_8_Fre|Adr_Fr1_LL|FRE1LL;   //写FR1
  WriteChar(DATA);
  DATA=Wrt_16_Fre|Adr_Fr1_LH|FRE1LH;
  WriteChar(DATA);
  DATA=Wrt_8_Fre|Adr_Fr1_HL|FRE1HL;
  WriteChar(DATA);
  DATA=Wrt_16_Fre|Adr_Fr1_HH|FRE1HH;
  WriteChar(DATA);

  DATA=Wrt_8_Pha|Adr_Ph0_L|PHA0L;     //写PH0
  WriteChar(DATA);
  DATA=Wrt_16_Pha|Adr_Ph0_H|PHA0H;
  WriteChar(DATA);
  
     DATA=Wrt_8_Pha|Adr_Ph1_L|PHA1L;     //写PH1
  WriteChar(DATA);
  DATA=Wrt_16_Pha|Adr_Ph1_H|PHA1H;
  WriteChar(DATA);

  DATA=Wrt_8_Pha|Adr_Ph2_L|PHA2L;     //写PH2
  WriteChar(DATA);
  DATA=Wrt_16_Pha|Adr_Ph2_H|PHA2H;
  WriteChar(DATA);

  DATA=Wrt_8_Pha|Adr_Ph3_L|PHA3L;     //写PH3
  WriteChar(DATA);
  DATA=Wrt_16_Pha|Adr_Ph3_H|PHA3H;
  WriteChar(DATA);


        SelDataSrc(SelFr0,SelPh0);     //选择数据源

  CMD=CmdResClr|NOSLEEP|NORESET|NOCLEAR;  // 开始执行
  WriteChar(CMD);

}
  
/*===================================================================
        主程序
 ===================================================================*/
main(){
      Delay(1);      //开机延时
     Init_9835();     //初始化9835
     while(1);
 }

阅读(1777) | 评论(0)


版权声明:编程爱好者网站为此博客服务提供商,如本文牵涉到版权问题,编程爱好者网站不承担相关责任,如有版权问题请直接与本文作者联系解决。谢谢!

评论

暂无评论
您需要登录后才能评论,请 登录 或者 注册