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

评论