正文

单片机控制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);  }

阅读(2254) | 评论(0)


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

评论

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