ad9850c语言编程,AD9850与单片机波形生成程序及设计
概述=================================================
AD9850/AD9851模塊是采用ADI應用最廣泛的DDS(AD9850和AD9851)制作的模塊。ADI的性能就不用多說了。模塊主要參考AD9850和AD9851的資料做的。
主要功能特點:
*??模塊能夠輸出正弦波和方波,2個正弦波和2個方波輸出。
AD9850: 0-40MHz
AD9851: 0-70MHz
頻率在20-30MHz后諧波越來越大,波形會越來越不干凈。
方波:? ???0-1MHz
*??采用70MHz的低通濾波器,使波形的SN比更好
*??比較器的基準輸入端電壓由可變電阻產生,調節該電阻可以得到不同的占空比方波
注:在輸出正弦波的情況下,接線到方波輸出的IO口,直接調節藍色的電位器可輸出方波。
* AD9850模塊采用125MHz的有源晶振,AD9851模塊采用30MHZ的有源晶振
AD9850和AD9851主要區別
*??AD9850的時鐘頻率最高125MHz,AD9851的時鐘頻率最高180MHz。輸出最高頻率AD9851要比AD9850高。
* AD9850沒有6倍頻,AD9851有
功能框圖============================================================
1:下載對應的HEX程序
見AD9850_1_V4_C程序文件夾
OUT1和OUT2端能測試到對應輸出1KHz信號。如需測試方波,調節可變電位器,可在方波1和方波2端測試到方波。
單片機源程序如下:
//***************************************************//
//函數1: ? ? ? ? ? ad9851_reset() ? ? ? ? ? ? ? ? ? ?//
//函數2: ? ? ? ? ? ad9851_reset_serial() ? ? ? ? ? ? //
//函數3: ? ? ? ? ? ad9851_wr_parrel(unsigned char w0,double frequence)//
//函數4: ? ? ? ? ? ad9851_wr_serial(unsigned char w0,double frequence)//
//版本: ? ? ? ? ? ? ?V1.1 ? ? ? ? ? ? ? ? ? ? ? ? ? ?//
//***************************************************//
// ? ? ? ? ? ? ? ? ?子程序說明 ? ? ? ? ? ? ? ? ? ? ? //
//***************************************************//
//函數1: ?ad9851_reset()
// ? ? ? ?復位ad9851,之后為并口寫入模式
//函數2: ?ad9851_reset_serial()
// ? ? ? ?復位ad9851,之后為串口寫入模式
//函數3: ?ad9851_wr_parrel(unsigned char w0,double frequence)
// ? ? ? ?并口寫ad9851數據,w0為ad9851中w0的數據,frequence
// ? ? ? ?為寫入的頻率
//函數4: ?ad9851_wr_serial(unsigned char w0,double frequence)
// ? ? ? ?串口寫ad9851數據,w0為ad9851中w0的數據,frequence
// ? ? ? ?為寫入的頻率
//需定義的位:
//ad9851_w_clk ? ?;
//ad9851_fq_up ? ?;
//ad9851_rest ? ? ;
//ad9851_bit_data ;
//例:
//sbit ad9851_w_clk ? ?=P2^2;
//sbit ad9851_fq_up ? ?=P2^1;
//sbit ad9851_rest ? ? =P2^0;
//sbit ad9851_bit_data =P1^7;
//***************************************************//
// ? ? ? ? ? ? ? ? 寫數據說明 ? ? ? ? ? ? ? ? ? ? ? ?//
//***************************************************//
//寫數據例:
// ? ? ? ad9851_reset()
// ? ? ? wr_lcd02_data(unsigned char x)
// ? ? ? ad9851_wr_parrel(0x01,1000)
// ? ? ? ad9851_wr_serial(0x01,1000)
//***************************************************//
//---------------------------------------------------//
// ? ? ? ? ? ? ? ? ? 程序 ? ? ? ? ? ? ? ? ? ? ? ? ? ?//
//---------------------------------------------------//
# include # include # include sbit ad9851_w_clk ? ?=P2^2; ?//P2.2口接AD9851的w_clk腳/PIN7
sbit ad9851_fq_up ? ?=P2^1; ?//P2.1口接AD9851的fq_up腳/PIN8
sbit ad9851_rest ? ? =P2^0; ?//P2.0口接AD9851的rest腳/PIN12
sbit ad9851_bit_data =P1^7; ?//P1.7口接AD9851的D7腳/PIN25
//P1為8位數據口
//***************************************************//
// ? ? ? ? ? ? ?ad9851復位(并口模式) ? ? ? ? ? ? ? ? //
//---------------------------------------------------//
void ad9851_reset()
{
ad9851_w_clk=0;
ad9851_fq_up=0;
//rest信號
ad9851_rest=0;
ad9851_rest=1;
ad9851_rest=0;
}
//***************************************************//
// ? ? ? ? ? ? ?ad9851復位(并口模式) ? ? ? ? ? ? ? ? //
//---------------------------------------------------//
void ad9851_reset_serial()
{
ad9851_w_clk=0;
ad9851_fq_up=0;
//rest信號
ad9851_rest=0;
ad9851_rest=1;
ad9851_rest=0;
//w_clk信號
ad9851_w_clk=0;
ad9851_w_clk=1;
ad9851_w_clk=0;
//fq_up信號
ad9851_fq_up=0;
ad9851_fq_up=1;
ad9851_fq_up=0;
}
//***************************************************//
// ? ? ? ? ?向ad9851中寫命令與數據(并口) ? ? ? ? ? ? //
//---------------------------------------------------//
void ad9851_wr_parrel(unsigned char w0,double frequence)
{
unsigned char w;
long int y;
double x;
//計算頻率的HEX值
x=4294967295/180;//適合180M晶振/180為最終時鐘頻率(或30M六倍頻)
//如果時鐘頻率不為180MHZ,修改該處的頻率值,單位MHz !!!
frequence=frequence/1000000;
frequence=frequence*x;
y=frequence;
//寫w0數據
w=w0;
P1=w; ? ? ?//w0
ad9851_w_clk=1;
ad9851_w_clk=0;
//寫w1數據
w=(y>>24);
P1=w; ? ? ?//w1
ad9851_w_clk=1;
ad9851_w_clk=0;
//寫w2數據
w=(y>>16);
P1=w; ? ? ?//w2
ad9851_w_clk=1;
ad9851_w_clk=0;
//寫w3數據
w=(y>>8);
P1=w; ? ? ?//w3
ad9851_w_clk=1;
ad9851_w_clk=0;
//寫w4數據
w=(y>>=0);
P1=w; ? ? ?//w4
ad9851_w_clk=1;
ad9851_w_clk=0;
//移入始能
ad9851_fq_up=1;
ad9851_fq_up=0;
}
//***************************************************//
// ? ? ? ? ?向ad9851中寫命令與數據(串口) ? ? ? ? ? ? //
//---------------------------------------------------//
void ad9851_wr_serial(unsigned char w0,double frequence)
{
unsigned char i,w;
long int y;
double x;
//計算頻率的HEX值
x=4294967295/180;//適合180M晶振/180為最終時鐘頻率(或30M六倍頻)
//如果時鐘頻率不為180MHZ,修改該處的頻率值,單位MHz ?!!!
frequence=frequence/1000000;
frequence=frequence*x;
y=frequence;
//寫w4數據
w=(y>>=0);
for(i=0;i<8;i++)
{
ad9851_bit_data=(w>>i)&0x01;
ad9851_w_clk=1;
ad9851_w_clk=0;
}
//寫w3數據
w=(y>>8);
for(i=0;i<8;i++)
{
ad9851_bit_data=(w>>i)&0x01;
ad9851_w_clk=1;
ad9851_w_clk=0;
}
//寫w2數據
w=(y>>16);
for(i=0;i<8;i++)
{
ad9851_bit_data=(w>>i)&0x01;
ad9851_w_clk=1;
ad9851_w_clk=0;
}
//寫w1數據
w=(y>>24);
for(i=0;i<8;i++)
{
ad9851_bit_data=(w>>i)&0x01;
ad9851_w_clk=1;
ad9851_w_clk=0;
}
//寫w0數據
w=w0;
for(i=0;i<8;i++)
{
ad9851_bit_data=(w>>i)&0x01;
ad9851_w_clk=1;
ad9851_w_clk=0;
}
//移入始能
ad9851_fq_up=1;
ad9851_fq_up=0;
}
//***************************************************//
// ? ? ? ? ? ? ? ? ? 測試程序1000Hz ? ? ? ? ? ? ? ? ?//
//---------------------------------------------------//
main()
{
P0=0x00;
P1=0x00;
P2=0x00;
P3=0x00;
//---------------------------------------------------//
……………………
總結
以上是生活随笔為你收集整理的ad9850c语言编程,AD9850与单片机波形生成程序及设计的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: MySql最全的计算时间差
- 下一篇: 给app加一个启动图