歡迎您光臨本站 登入註冊首頁

概述

;==================定義單片機與DDS晶元的連接========DDS_DATABITP0.0DDS_WCLKBITP0.1DDS_FQUDBITP0.2;=============……

;==================定義單片機與DDS晶元的連接========
DDS_DATA BIT P0.0
DDS_WCLK BIT P0.1
DDS_FQUD BIT P0.2
;===================================================

;==================定義DDS控制數據的存放地址========
DDS_DATA0 DATA 40H
DDS_DATA1 DATA 41H
DDS_DATA2 DATA 42H
DDS_DATA3 DATA 43H
DDS_DATA4 DATA 44H
;===================================================

;==============送數據到DDS晶元(串列控制方式)==========
SEND_DDS_DATA: MOV R1,#DDS_DATA4 ;從W4的最低位開始送出數據
;一直到W0的最低位結束
MOV R0,#05H ;設總共要送出的位元組為5X8
CLR DDS_FQUD ;置低
LOOP_SEND_W: MOV A,@R1 ;把數據由緩衝區送給A準備輸出
CLR C ;清零
SEND_1_BIT: MOV R2,#08H ;循環8次,每次送出一個位元組
LOOP_SEND: CLR DDS_WCLK
RRC A ;左移
MOV DDS_DATA,C ;送出一位數據到DDS
NOP
SETB DDS_WCLK
NOP
DJNZ R2,LOOP_SEND ;判斷是否送完這一位的8個位元組
DEC R1
DJNZ R0,LOOP_SEND_W ;判斷是否送完5位
SETB DDS_FQUD
NOP
CLR DDS_FQUD
RET
;==================送數據到DDS晶元子程序結束=========

當然單單給9851送數很簡單,我們同樣可以由鍵盤給定十進位的頻率來控制輸出

單片機用匯流排介面方案:
MOVX @DPTR,W0
MOVX @DPTR,W1
MOVX @DPTR,W2
MOVX @DPTR,W3
MOVX @DPTR,W4
SETB FQ_UD
CLR  FQ_UD
其中W0高5bit為相位控制字,低3bit為功能控制,建議一般測試用0或1既可。
其中W1~W4為頻率控制字,不要為0,也不要太大。比如測試可以發4byte的“2”。
sbit FQ_UD = P1^0;
unsigned char xdata *pByte0;
unsigned char xdata *pByte1;
unsigned char xdata *pByte2;
unsigned char xdata *pByte3;
unsigned char xdata *pByte4;
void wr5byte(unsigned char d0,d1,d2,d3,d4)
{
  *pByte0 = d0;
  *pByte1 = d1;
  *pByte2 = d2;
  *pByte3 = d3;
  *pByte4 = d4;
  FQ_UD = 1;
  FQ_UD = 0;
}
main()
{
  pByte0 = 0xf0ff;
  pByte1 = 0xf0ff;
  pByte2 = 0xf0ff;
  pByte3 = 0xf0ff;
  pByte4 = 0xf0ff;
  RESET = 1;
  RESET = 0;
  wr5byte(1,1,1,1,1);
// wr5byte(0,1,1,1,1);
  while(1);
}


//DDS測試程序
#include //頭文件
//定義AD9851與98C51的介面
sbit W_CLK  = P3^0;
sbit FQ_UD = P3^1;
sbit RESET  = P3^2;

/***頻率演算法公式*****/
/****f是輸出的頻率****//*******32位控制字為:Fm  =(f*0xFFFFFFFF)/內部時鐘       *******/
unsigned long int Fm=0x0003a411; //實驗時候自己設了1KHz結果很精確。外時鐘用信號了生器3MHz!!
unsigned char data  tab[]={0x01,0x00,0x00,0x00,0x00};//(W0)(W4 W3 W2 W1)高——低)注意順序!
//延時程序
void delay(unsigned int i)
{
while(i--);
}
// 分32位數據分解為4個位元組存於tab[]數組的后四個單元,tab[0]為相位和頻率的設置單元
void chang(unsigned long int t)
{
unsigned char *i;
i=&t;
tab[1]=(char)*i;
tab[2]=(char)*(i+1);
tab[3]=(char)*(i+2);
tab[4]=(char)*(i+3); 
}
/***主程序*****/
void main(void)
{ unsigned char i;
FQ_UD=0;delay(1);
W_CLK=0;delay(1);
RESET=1;delay(1); //上電先複位一次
RESET=0;delay(1);
chang(Fm); //分離四位元組程序
for(i=0;i<5;i++) //****寫AD8951***5個位元組*********
{ W_CLK=0;delay(1);
  P1=tab;
  W_CLK=1;
}
  FQ_UD=1;delay(1);//輸出
  FQ_UD=0;delay(1);      
  while(1); 
}
注意:用并行介面方式!!!


[admin via 研發互助社區 ] 51單片機控制DDS晶元AD9851的源程序已經有2488次圍觀

http://cocdig.com/docs/show-post-42137.html