51单片机控制DDS芯片AD9851的源程序
2012-06-02
标签:

        ;==================定义单片机与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
        CLRFQ_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 datatab[] = {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);
}

注意:用并行接口方式!!!

可能会用到的工具/仪表
相关文章
推荐文章
热门文章
章节目录
本站简介 | 意见建议 | 免责声明 | 版权声明 | 联系我们
CopyRight@2024-2039 嵌入式资源网
蜀ICP备2021025729号