📄 ad9852chirp.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 + -