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

📄 ad9852chirp.c

📁 AD9852程序:可单频输出也可扫频输出
💻 C
字号:
//AD9852测试程序,
//功能描述:AD9852  Work at chirp MODE (011) FM

//**********************************************
#include<reg52.h>
#include<intrins.h>  //包含右移
#include<math.h>

sbit UPDCLK = P2^0;  //20 更新时钟,上升沿锁存数据到编程寄存器
sbit MRESET = P2^1;  //71 主复位端,高电平有效复位
sbit PMODE  = P2^2;  //70 串并编程模式选择 0:串行 1:并行
sbit WRCLK  = P2^3;  //21 写端口数据 上升沿锁存数据
sbit RDCLK  = P2^4;  //22 读端口数据 高电平读
sbit F_B_H  = P2^5;  //29 低电平
sbit OSK    = P2^6;  //30

sbit DATACLK= P1^0;  //高电平有效,选中数据锁存器,低电平锁存
sbit ADDRCLK= P1^1;  //高电平有效,选中地址锁存器,低电平锁存
sbit CONCLK = P1^2;  //高电平有效,选中外部控制端驱运器,低电平锁存
sbit testF  = P3^7;
sbit testFD = P3^6;
//--------------------------------------------------------------------
unsigned char  FWord0[6]={0x00,0x00,0x00,0x00,0x00,0x00}; // 0hz  
//unsigned char  FWord1[6]={0x00,0x02,0x2F,0x3D,0x93,0x97}; // 10khz  	   
//unsigned char  FWord1[6]={0x00,0x15,0xD8,0x67,0xC3,0xEC}; //100khz
unsigned char  FWord1[6]={0x00,0x00,0x37,0xEC,0x8E,0xC2};//1khz
//unsigned char  FWord1[6]={0x11,0x11,0x11,0x11,0x11,0x11};//20mhz
//unsigned char  FWord1[6]={0x08,0x88,0x88,0x88,0x88,0x88};  //10mhz
//unsigned char  FWord1[6]={0x00,0x01,0xff,0xff,0xff,0xff};//32bit 4.15k

//-------------------------------------------------------------------- 
//unsigned char  ramprateword[3]={0x00,0x01,0x2c};    // 时间步进 现取1us 最大6990.506us
//unsigned char  ramprateword[3]={0x00,0x0b,0xb8};    // 时间步进 现取10us 最大6990.506us
unsigned char  ramprateword[3]={0x00,0x75,0x30};     // 时间步进 现取100us 最大6990.506us
//unsigned char  ramprateword[3]={0x02,0x94,0xf0};     // 时间步进 现取500us 最大6990.506us
//unsigned char  ramprateword[3]={0x04,0x93,0xe0};  // 时间步进 现取1000us 
//--------------------------------------------------------------------   
//unsigned char  deltaword[6]={0x00,0x00,0x00,0x0E,0x51,0x09};  //1hz
//unsigned char  deltaword[6]={0x00,0x00,0x37,0xEC,0x8E,0xC2}; //4.7k 
//unsigned char  deltaword[6]={0x00,0x02,0x2F,0x3D,0x93,0x97}; // 10k  
//unsigned char  deltaword[6]={0x00,0x00,0x37,0xEC,0x8E,0xC2};  //1khz 
//unsigned char  deltaword[6]={0x00,0x00,0xff,0xff,0xff,0xff}; //32bit
unsigned char  deltaword[6]={0x00,0x80,0x00,0x00,0x00,0x00}; //40bit = 585.9khz
//--------------------------------------------------------------------	
void WriteData(unsigned char DataByte);    //写字节数据   
void WriteADDR(unsigned char DATAAddress); //写寄存器地址
void UpdataFWord(unsigned char *p);       //*** 频率字更新
void Updata_Deltaword(void);   //***deltaword 频率字更新
void Updata_Ramprateword(void); //***ramprateword 频率字更新
void Updata_Updataword(void);  //***updataword 频率字更新  PIN29
void D1MS(unsigned char n);void D10uS(unsigned char n);
//*********************************
void main()
{
   unsigned char n;
   P3 = 0XFF;
   P2=0;
   DATACLK=0;
   ADDRCLK=0;
   CONCLK =1;

   P2 =0x06;            //设置成并行模式,并复位
   for(n=0;n<10;)
       n++;
   P2 =0x04;
   CONCLK =0;          //锁存控制端口状态
//*************************
   WriteADDR(0x1E);    //写乘法器地址
   WriteData(0x46);    //初始化乘法器,打开倍速频器,倍频6x50=300Mhz	   
   
   WriteADDR(0x20);    //反辛格函数滤波器地址
   WriteData(0x40);    //关闭反辛格函数滤波
   WriteADDR(0x21);    //幅度字高字节地址
   WriteData(0x00);    //幅度字高字节
   WriteADDR(0x22);    //幅度字低字节地址
   WriteData(0x00);
   /*
	UpdataFWord(FWord1);	 //更新频率字
    Updata_Deltaword();		 //频率步进字
    Updata_Ramprateword();	 //时间步进字
   */
  // WriteADDR(0x1f);    //工作模式选择 控制寄存器  .7 = ACC1; .6 = ACC2  .0 = 选择内外更新频率
  // WriteData(0x00);    // 工作在 000   模式下
   WriteADDR(0x1f);    //工作模式选择 控制寄存器  .7 = ACC1; .6 = ACC2  .0 = 选择内外更新频率
   WriteData(0x86);    // 工作在 011 chirp 模式下
   //Updata_Updataword();		 //pin29 频率跟新字	  内部产生跟新脉冲

   while(1)
  {
      	UpdataFWord(FWord1);			  //更新频率字
    Updata_Deltaword();		 //频率步进字
    Updata_Ramprateword();	 //时间步进字
    CONCLK = 1;
    P2 |=0x01;       //外部时钟更新脉冲
//	_nop_();
//	_nop_();
	    D1MS(1);
   P2 &=0xfe;
    CONCLK = 0;
/* 		
	   D1MS(16);
	CONCLK = 1;				// 停止扫频
    P2 |=0x20;			    // hold = 1;
    CONCLK = 0;
	while(1); 
	*/
	for(n=0;n<4;n++)	   // 扫描周期控制,由于是用c语言写的,扫描周期控制得并不是很严格
	{					   // 采用汇编编写会比较好
    D1MS(21);
//	 D1MS(254);
    testFD = !testFD;	   // 测试延时用
	//D1MS(200);
	}  
	testF = !testF;	 	   // 测试延时用
    //D10uS(10);   
    //	_nop_();
	
	CONCLK = 1;				// 停止扫频
    P2 |=0x20;			    // hold = 1;
    CONCLK = 0;
//	while(1);				// 观看终止频率
//   for(n=0;n<1;n++)
//   D1MS(200);
	P2 &=0xdf;
    CONCLK = 0;

			  
   }

}
//*********************************
//*** 频率字更新
void UpdataFWord(unsigned char *p)
{
   WriteADDR(0x04);
   WriteData(p[0]);    // 频率字最高字节  
   WriteADDR(0x05);
   WriteData(p[1]);
   WriteADDR(0x06);
   WriteData(p[2]);
   WriteADDR(0x07);
   WriteData(p[3]);
   WriteADDR(0x08);
   WriteData(p[4]);
   WriteADDR(0x09);
   WriteData(p[5]);   // 频率字最低字节
}

//*********************************
//***deltaword 频率字更新
void Updata_Deltaword(void)
{
   WriteADDR(0x10);
   WriteData(deltaword[0]);    //deltaword 频率字最高字节
   WriteADDR(0x11);
   WriteData(deltaword[1]);
   WriteADDR(0x12);
   WriteData(deltaword[2]);
   WriteADDR(0x13);
   WriteData(deltaword[3]);
   WriteADDR(0x14);
   WriteData(deltaword[4]);
   WriteADDR(0x15);
   WriteData(deltaword[5]);   // deltaword 频率字最低字节
}

//*********************************
//***ramprateword 频率字更新
void Updata_Ramprateword(void)
{
   WriteADDR(0x1A);
   WriteData(ramprateword[0]);    //ramprateword 频率字最高字节
   WriteADDR(0x1B);
   WriteData(ramprateword[1]);
   WriteADDR(0x1C);
   WriteData(ramprateword[2]);    // ramprateword 频率字最低字节  
}

//*********************************
//***updataword 频率字更新  PIN29
/*void Updata_Updataword(void)
{
   WriteADDR(0x16);
   WriteData(updataword[0]);    //updataword 频率字最高字节
   WriteADDR(0x17);
   WriteData(updataword[1]);
   WriteADDR(0x18);
   WriteData(updataword[2]);
   WriteADDR(0x19);
   WriteData(updataword[3]);   // updataword 频率字最低字节
}
*/
//*********************************
//***写入数据
void WriteData(unsigned char DataByte)
{
   unsigned char bdata x,y;
   x =DataByte;
   y =0;
   if(x&0x01)        //数据格式旋转180
      y=y|0x80;      //由D7 D6 D5 D4 D3 D2 D1 D0
   if(x&0x02)        //  D0 D1 D2 D3 D4 D5 D6 D7
      y=y|0x40;
   if(x&0x04)
      y=y|0x20;
   if(x&0x08)
      y=y|0x10;
   if(x&0x10)
      y=y|0x08;
   if(x&0x20)
      y=y|0x04;
   if(x&0x40)
      y=y|0x02;
   if(x&0x80)
      y=y|0x01;
   P2=y;
   DATACLK=1;       //锁存数据
   DATACLK=0;

}
//*********************************
//***完整地址
void WriteADDR(unsigned char DATAAddress)
{
   P2=DATAAddress;
   ADDRCLK=1;
   ADDRCLK=0;

   P2=0x04;
   CONCLK = 1;
     WRCLK=1;
     WRCLK=0;
   CONCLK = 0;

}

⌨️ 快捷键说明

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