邀朋友种豆,一起分享吧
喜欢购买正品行货?那就去品牌街

单片机控制AD9835源程序

来自:种豆 时间:2017-12-29 阅读:442次 原文链接

/*=============

        *为提高程序的可读性编写的程序模板*                             

              *文件名: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);

 }

 
关于种豆 ┊ 联系我们 ┊ 免责声明 ┊ 发帖须知 ┊ 请提意见 ┊ 站点地图
本站为个人爱好兴趣分享网站,不代表本人观点,如有侵权请联系QQ3371650278进行处理
sowsoy.com 版权所有 Copyright©2010-2020 浙ICP备10212932号
Email:sowsoy#hotmail.com