?? wo.txt
字號:
1.2AD9850的引腳功能
AD9850是28腳SOP表面封裝,體積小,易用于便攜儀器。其引腳排列如圖1所示,功能如下:
?。?)D0-D7,控制字并行輸入端,其中D7可作為串行輸入;
?。?)DGND,數字地;
?。?)DVDD,為內部數字電路提供電源;
?。?)WCLK,控制字裝入時鐘;
?。?)FQUD,頻率更新控制;
?。?)CLK,輸入時鐘;
?。?)AGND,模擬地;
?。?)AVDD,為內部模擬電路提供電源,可與數字電源共用;
?。?)RSET,DAC外接電阻;
(10)QOUT,QB,內部比較器輸出端;
(11)VINN,VINP,內部比較器輸入端;
?。?2)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 + -