⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 mypro.c

📁 stc12c2052ad单片机控制ad9835的源程序
💻 C
字号:
  /*====================================================================
     			*为提高程序的可读性编写的程序模板*					  	    	 											    
 	 	        		*文件名: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

/*=======================================================================
 							(数据)  freg1 = fout0/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);
 }
	


⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -