|
親測ok,也歡迎大家指正,謝謝!
應網友要求,補上電路圖

串行模式測試的時候可以照圖上接,如果想穩定,還是不要這樣整,D0、D1加10K上拉,D2接470下拉,其他一腳一律懸空,Good luck!
淘寶上搞了個AD9851的DDS模塊,回來測試了一下,把程序發上來,給大家參考,也給自己留個備份。說不準過幾天還真的要用呢。AD9851并行的驅動程序請參考:http://www.zg4o1577.cn/bbs/dpj-31114-1.html
- #include "reg52.h"
- /****************51串行驅動****************/
- sbit clk =P3^1;
- sbit fq_ud =P3^2;
- sbit rst =P3^3;
- sbit dat =P3^0;
- sbit key1 =P1^4;
- sbit key2 =P1^5;
- sbit key3 =P1^6;
- sbit key4 =P1^7;
- unsigned char phase_word=0x00; //相位控制字,使用低5位
- unsigned char power_down=0x00; //低功耗模式
- unsigned char mult=0x01; //6倍頻是否打開
- unsigned char ww[5]={0x09,0x0E,0x38,0xE3,0x8E};
- unsigned long freq,set_value;
- void delay_us(unsigned int i) //delay
- {
- while(i--);
- }
- //AD9851初始化,在此之前請確認D0,D1和D2的電平狀態
- void init_dds(void)
- {
- rst=1; //高電平復位
- delay_us(10000); //延時10mS
- rst=0;
- delay_us(10000); //延時10mS
- clk=0;
- fq_ud=0;
- delay_us(2);
- clk=1; //送入W0
- delay_us(2);
- clk=0;
- delay_us(2);
- fq_ud=1; //使能
- delay_us(2);
- fq_ud=0;
- delay_us(2);
- delay_us(10000);
- }
- //往AD9851寫數據
- void write_dds(unsigned long dds)
- {
- unsigned char i,j,temp;
-
- ww[0]=dds&0xFF; //頻率字最低字節
- ww[1]=(dds>>8)&0xFF;
- ww[2]=(dds>>16)&0xFF;
- ww[3]=dds>>24; //頻率字最高字節
- ww[4]= (phase_word<<3)|| power_down<<2 || mult; //控制字
- fq_ud=0; //FQ_UD置低
- clk=0; //CLK置低
- for(i=0;i<5;i++) //送入5個字節的控制字
- {
- temp=ww[i];
- for(j=0;j<8;j++)
- {
- clk=0;
- if(temp&0x01)dat=1;
- else dat=0;
- delay_us(2);
- clk=1;
- delay_us(2);
- temp>>=1;
- }
- }
- clk=0;
- fq_ud=1; //使能信號
- delay_us(3);
- fq_ud=0;
- }
- //寫入頻率
- void write_freq(unsigned long freq)
- {
- unsigned long dds;
- dds=24.250929422*freq; //頻率字計算,可進行微調
- write_dds(dds);
- }
- main()
- {
- P0=0xff; P1=0xff;
- delay_us(10000);
- init_dds();
- while(1)
- {
- if(key1==0) {delay_us(10000);while(!key1);write_freq(1000);}
- if(key2==0) {delay_us(10000);while(!key2);write_freq(5000);}
- if(key3==0) {delay_us(10000);while(!key3);write_freq(12000);}
- if(key4==0) {delay_us(10000);while(!key4);write_freq(19000);}
- };
- }
復制代碼
|
|