*为提高程序的可读性编写的程序模板*
*文件名: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);
}
评论