📄 wo.txt
字号:
1.2AD9850的引脚功能
AD9850是28脚SOP表面封装,体积小,易用于便携仪器。其引脚排列如图1所示,功能如下:
(1)D0-D7,控制字并行输入端,其中D7可作为串行输入;
(2)DGND,数字地;
(3)DVDD,为内部数字电路提供电源;
(4)WCLK,控制字装入时钟;
(5)FQUD,频率更新控制;
(6)CLK,输入时钟;
(7)AGND,模拟地;
(8)AVDD,为内部模拟电路提供电源,可与数字电源共用;
(9)RSET,DAC外接电阻;
(10)QOUT,QB,内部比较器输出端;
(11)VINN,VINP,内部比较器输入端;
(12)DACBL,内部DAC外接参考电压端,可空;
(13)IB,IOUT,DAC输出端;
(14)RES,复位端。
2.1控制字格式及写入时序
AD9850包含一个40位输入寄存器,其中低32位为频率控制字,高5位为相位控制字,还有一位电源使能位和两位测试位,具体格式见表1。AD9850的控制字有并行和串行两种写入方式,时序如图2所示。并行装入模式下,WCLK第一个时钟上升沿到来时,装入高8位控制字,依次下去,当第5个WCLK时钟到来时装入低8位控制字,这样,连续5个WCLK时钟即可将40位控制字装入输入寄存器。第5个WCLK时钟后,WCLK时钟将不再起作用,直到FQUD时钟上升沿以来或重新复位。FQUD时钟上升沿将40位控制字写入数据寄存器,AD9850输出新的频率波。对于串行模式,每一个WCLK时钟上升沿,由控制字输入口的第8位(管脚25)移入1位控制位(低位先移入),40个WCLK时钟后,FQUD脉冲的上升沿更新输出频率。值得注意的是两位测试位仅是为了生产测试用,必须是00。
//-----------------------函数声明,变量定义--------------------------------------------------------
#include <reg51.h>
#include <intrins.h>
#include<ABSACC.H>
//-----------------------定义管脚--------------------------------------------------------
#define data_OUT P1
sbit FQ_UD=P3^0; //AD9850信号更新申请
sbit W_CLK=P3^1; //写控制字时钟
unsigned char CON_word[5];
//Word data[7] data[6] data[5] data[4] data[3] data[2] data[1] data[0]
//W0 Phase b Phase b3 Phase b2 Phase b1 Phase b0 Power Down Control Control
//W1 Freq-b31 Freq-b30 Freq-b29 Freq-b28 Freq-b27 Freq-b26 Freq-b25 Freq-b24
//W2 Freq-b23 Freq-b22 Freq-b21 Freq-b20 Freq-b19 Freq-b18 Freq-b17 Freq-b16
//W3 Freq-b15 Freq-b14 Freq-b13 Freq-b12 Freq-b11 Freq-b10 Freq-b9 Freq-b8
//W4 Freq-b7 Freq-b6 Freq-b5 Freq-b4 Freq-b3 Freq-b2
//--------------------------------------------------------------------------------------------------
// 函数名称: delay
// 入口参数: N
// 函数功能:延时子程序,实现(16*N+24)us的延时
// 系统采用11.0592MHz的时钟时,延时满足要求,其它情况需要改动
//--------------------------------------------------------------------------------------------------
void delay(unsigned int N)
{
int i;
for(i=0;i<N;i++);
}
//--------------------------------------------------------------------------------------------------
// 函数名称: WRITE_AD9850
// 函数功能: 将控制字写入AD9850
//--------------------------------------------------------------------------------------------------
void WRITE_AD9850(void)
{
unsigned char i;
FQ_UD=0;
W_CLK=0;
delay(0);
CON_word[0]=CON_word[0]&0xFC; //置工作方式选择位为00
for(i=0;i<5;i++)
{
data_OUT=CON_word[i]; //送控制字
W_CLK=0;
delay(0);
W_CLK=1; //上升延
delay(0);
}
FQ_UD=1; //上升延要求AD9850改变输出
}
//--------------------------------------------------------------------------------------------------
// 函数名称:main
// 用户主函数
// 函数功能:主函数
//--------------------------------------------------------------------------------------------------
void main()
{
FQ_UD=0;
WRITE_AD9850();
}
//-----------------函数声明、通用变量定义--------------------------------------------------------
#include <reg51.h>
#include <intrins.h>
sbit FQ_UD=P1^0; //AD9850信号更新申请
unsigned char CON_word[5];
//Word data[7] data[6] data[5] data[4] data[3] data[2] data[1] data[0]
//W0 Phase b Phase b3 Phase b2 Phase b1 Phase b0 Power Down Control Control
//W1 Freq-b31 Freq-b30 Freq-b29 Freq-b28 Freq-b27 Freq-b26 Freq-b25 Freq-b24
//W2 Freq-b23 Freq-b22 Freq-b21 Freq-b20 Freq-b19 Freq-b18 Freq-b17 Freq-b16
//W3 Freq-b15 Freq-b14 Freq-b13 Freq-b12 Freq-b11 Freq-b10 Freq-b9 Freq-b8
//W4 Freq-b7 Freq-b6 Freq-b5 Freq-b4 Freq-b3 Freq-b2 Freq-b1 Freq-b0
//--------------------------------------------------------------------------------------------------
// 函数名称: delay
// 入口参数: N
// 函数功能:延时子程序,实现(16*N+24)us的延时
// 系统采用11.0592MHz的时钟时,延时满足要求,其它情况需要改动
//--------------------------------------------------------------------------------------------------
void delay(unsigned int N)
{
int i;
for(i=0;i<N;i++);
}
//--------------------------------------------------------------------------------------------------
// 函数名称: AD9850_init
// 入口参数: 无
// 函数功能: 初始化设置 设置串口工作方式
//--------------------------------------------------------------------------------------------------
void AD9850_init(void) //初始化
{
FQ_UD=0;
SCON=0; //串口工作在方式0;不允许串行口接收数据,先写通讯寄存器
}
//--------------------------------------------------------------------------------------------------
// 函数名称: WRITE_AD9850
// 函数功能: 将控制字写入AD9850
//--------------------------------------------------------------------------------------------------
void WRITE_AD9850(void)
{
int i;
FQ_UD=0;
delay(0);
CON_word[0]=CON_word[0]&0xFC; //置工作方式选择位为00
for(i=4;i>=0;i--)
{
SCON=0;
SBUF=CON_word[i]; //送通讯寄存器命令
while(TI==0); //等待发送完成
TI=0; //TI清"0"
}
FQ_UD=1; //上升延要求AD9850改变输出
}
//--------------------------------------------------------------------------------------------------
// 函数名称:main
// 用户主函数
// 函数功能:主函数
//--------------------------------------------------------------------------------------------------
void main()
{
AD9850_init();
WRITE_AD9850();
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -