logo资料库

51单片机控制DDS芯片AD9854的源程序.doc

第1页 / 共5页
第2页 / 共5页
第3页 / 共5页
第4页 / 共5页
第5页 / 共5页
资料共5页,全文预览结束
51 单片机控制 DDS 芯片 AD9851 的源程序 注意:用并行接口方式!!! ;==================定义单片机与 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); }
分享到:
收藏