⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 text1.c

📁 51单片机控制AD9851产生正弦波的程序
💻 C
字号:
//www.pudn.com > AD9850_DDS_89C51.rar > DDS_MAIN.C
#define  uchar unsigned char 
#define  uint  unsigned int 
#define  ulong unsigned long 
 
#define  FALSE	0 
#define  TRUE	1 
 


   
#include <ABSACC.H>    
#include <AT89X051.H>    
#include <INTRINS.H>    
   
   
//晶体为12MHZ    
uchar    mucTime5ms;   
uchar    mucTime100ms;   
uchar    mucTime1s;   
//uchar    mucTime60s;    
   
uchar    muc1msDelay;   
uchar    muc100msDelay;   
uchar    muc1sDelay;   
uchar    muc60sDelay;   
   
uchar   mucFlashBit;   
ulong   mulFreq;   
uchar     mucInputNumber[MAX_INPUT_NUMBERS];   
bit     mbDispUpdateFlag;   
bit     mbFreqUpdateFlag;   
   
//12MHz晶振    
//i  delay time/us    
//1  5    
//2  7    
//3  9    
void delay_3add_2i_us(unsigned char i)   
{   
    while(--i);   
}   
//i  delay time/us    
//0  6+4    
//1  12    
//2  18    
/*  
void delay_6us(unsigned char i)  
{  
for(; i != 0; i--);  
}  
*/   
   
//定时器0中断延时n*1ms,最大值为256ms    
void delay_ms(uchar n)   
{   
    for(muc1msDelay=0;muc1msDelay<N;); if(mucTime5ms muc1msDelay+="5;" mucTime5ms++; TH0="-(5000/256);" TL0="-(5000%256);//5ms中断一次" 定时器0时常数为50mS { 1 using interrupt time0(void) void 晶体为11.0592MHZ } 秒计数器 mucTime1s="0;" 100毫秒计数器 mucTime100ms="0;" 5毫秒计数器 mucTime5ms="0;" EA="1;" 允许定时器0中断 ET0="1;" 启动定时器0 TR0="1;" TMOD="0x01;" 定时器0工作在方式1,作为16位定时器 晶体为12MHZ init_device(void) * for(muc1sDelay="0;muc1sDelay<n;);" n) delay_1s(uchar 定时器0延时n*1s,最大值为256s="约4.27分钟" for(muc100msDelay="0;muc100msDelay<n;);" delay_100ms(uchar 定时器0延时n*100ms,最大值为25600ms="25.6s">=20)   
    {   
        mucTime5ms=0;   
        mucTime100ms++;   
        muc100msDelay++;   
        if(mucTime100ms>=10)   
        {   
            mucTime100ms=0;   
            //mucTime1s++;    
            muc1sDelay++;   
            /*if(mucTime1s>=60)  
            {  
                mucTime1s=0;  
                mucTime60s++;  
            }*/   
        }   
    }   
}   
/*  
void write_freq(void)  
{  
    uchar i;  
    ulong ulDDSWord;  
    ulong ulTemp;  
    uchar ucTemp;  
    ulDDSWord=(float)mulFreq*65536/DDS_CLK_IN*65536;  
    DDS_UPDATE=0;  
    for(i=0;i<32;i++)  
    {  
        DDS_CLK=0;  
        ulTemp=ulDDSWord>>i;  
        ucTemp=(uchar)(ulTemp&0x1);  
        if(ulTemp)  DDS_DATA=1;  
        else        DDS_DATA=0;  
        DDS_CLK=1;  
    }  
    for(i=0;i<8;i++)  
    {  
        DDS_CLK=0;  
        DDS_DATA=0;  
        DDS_CLK=1;  
    }  
    DDS_UPDATE=1;  
    DDS_CLK=0;  
    DDS_UPDATE=0;  
}  
*/   
   
void DDS_set_freq (void)   
{   
    unsigned char byte_temp;   
    unsigned long freq_word =0x0505AAFF ;//频率控制字    
    float    fTemp;   
    fTemp=mulFreq;   
    fTemp=fTemp*65536/DDS_CLK_IN*65536;   
    freq_word =fTemp;   
    //freq_word =(float)mulFreq*65536/DDS_CLK_IN*65536;    
   
    _nop_(); _nop_(); _nop_(); _nop_();   
    DDS_UPDATE = 0;   
    _nop_(); _nop_(); _nop_(); _nop_();   
    DDS_CLK = 0;   
    _nop_(); _nop_(); _nop_(); _nop_();   
   
    for ( byte_temp = 0; byte_temp < 32; byte_temp++ )   
    {   
        freq_word = freq_word >> 1;   
        DDS_DATA = CY;   
        DDS_CLK = 1;   
        _nop_(); _nop_(); _nop_(); _nop_(); //实际应用应在延迟    
        DDS_CLK = 0;   
    }   
    for ( byte_temp = 0; byte_temp < 8; byte_temp++ )   
    {   
        DDS_DATA = 0;   
        DDS_CLK = 1;   
        _nop_(); _nop_(); _nop_(); _nop_();   
        DDS_CLK = 0;   
    }   
   
    DDS_UPDATE = 1;   
    _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_();   
    DDS_UPDATE = 0;   
}   
   
void init_dds(void)   
{   
    DDS_RESET=0;   
    delay_3add_2i_us(2);   
    DDS_RESET=1;   
    delay_3add_2i_us(2);   
    DDS_RESET=0;   
   
    DDS_DATA=0;   
    DDS_CLK=0;   
    DDS_UPDATE=0;   
    DDS_UPDATE=1;   
    DDS_UPDATE=0;   
   
    DDS_CLK=1;   
    DDS_CLK=0;   
    DDS_UPDATE=1;   
    DDS_UPDATE=0;   
   
    mulFreq=0;   
    DDS_set_freq();   
}   
   
   
void write_disp_command(uint uiWord)   
{   
    uchar i;   
    //uchar ucTemp;    
    DISP_LOAD=0;   
    _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_();   
    for(i=0;i<12;i++)   
    {   
        DISP_CLK=0;   
        uiWord=uiWord>>1;   
        _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_();   
        DISP_DATA=CY;   
        _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_();   
        DISP_CLK=1;//上升沿写入数据    
        _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_();          
    }   
    _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_();   
    DISP_LOAD=1;   
    _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_();   
    DISP_CLK=0;   
    _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_();   
    DISP_DATA=0;   
}   
   
void disp_Led(uchar ucLedNo,uchar ucDispNumberBCD)   
{   
    uint uiDispCode;   
    uiDispCode=ucLedNo+8;   
    uiDispCode<<=8;   
    uiDispCode+=ucDispNumberBCD;   
    write_disp_command(uiDispCode);   
}   
void init_disp(void)   
{   
    //使能串行接口    
    DISP_DATA=1;   
    _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_();   
    DISP_DATA=0;   
    _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_();      
    DISP_DATA=1;   
    //芯片内部复位    
    write_disp_command(0x201);   
    //只启用显示驱动    
    write_disp_command(0x401);   
    //设定显示参数:BCD    
    write_disp_command(0x58A);   
    //下面写数码管对应数据    
    disp_Led(7,8);   
    disp_Led(6,8);   
    disp_Led(5,8);   
    disp_Led(4,8);   
    disp_Led(3,8);   
    disp_Led(2,8);   
    disp_Led(1,8);   
    disp_Led(0,8);   
}   
void flash_led(uchar ucLedNo)   
{   
    uint uiDispCode;   
    uiDispCode=6;   
    uiDispCode<<=8;   
    if(ucLedNo<8)    uiDispCode+=(1<<UCLEDNO); { void } ucTemp="mucInputNumber[mucFlashBit];" && if(mucFlashBit="=0" ucTemp++; else if(ucTemp="=9)" mbDispUpdateFlag="TRUE;" mbFreqUpdateFlag="TRUE;" ucTemp; uchar number_add(void) mulFreq="ulFreq;" ulFreq+="mucInputNumber[i];" ulFreq*="10;" for(i="0;i<MAX_INPUT_NUMBERS;i++)" ulFreq="mulFreq;" ulFreq; ulong i; get_freq(void) disp_Led(0,mucInputNumber[0]); disp_Led(1,mucInputNumber[1]); disp_Led(2,mucInputNumber[2]); disp_Led(3,mucInputNumber[3]); disp_Led(4,mucInputNumber[4]); disp_Led(5,mucInputNumber[5]); disp_Led(6,mucInputNumber[6]); disp_Led(7,mucInputNumber[7]); value_to_bcd(); disp_freq(void) ="10;" mucInputNumber[MAX_INPUT_NUMBERS-1-i]="ulFreq%10;" value_to_bcd(void) write_disp_command(uiDispCode);>2)  ucTemp=0;   
    mucInputNumber[mucFlashBit]=ucTemp;   
    get_freq();   
}   
void number_dec(void)   
{   
    uchar ucTemp;   
    mbFreqUpdateFlag=TRUE;   
    mbDispUpdateFlag=TRUE;   
    ucTemp=mucInputNumber[mucFlashBit];   
    if(ucTemp==0)   
     {   
        if(mucFlashBit==0)  ucTemp=2;   
          else                ucTemp=9;   
     }   
    else            ucTemp--;   
    mucInputNumber[mucFlashBit]=ucTemp;   
    get_freq();   
}   
   
uchar key_scan(void)   
{   
    uchar ucKey;   
    //按键接在P3.2,P3.3,P3.4,P3.5    
    P3=0x3c;   
    ucKey=P3&0x3c;   
    if(ucKey!=0x3c)   
    {   
        delay_ms(20);   
        ucKey=P3&0x3c;   
    }   
    if(ucKey==0x3c) ucKey=KEY_NULL;   
    return ucKey;   
}   
void key_process(uchar ucKey)   
{   
    mbDispUpdateFlag=FALSE;   
    mbFreqUpdateFlag=FALSE;   
    switch(ucKey)   
    {   
        case KEY_LEFT:   
            if(mucFlashBit==MAX_INPUT_NUMBERS)  mucFlashBit=0;   
            else                        mucFlashBit++;   
            flash_led(mucFlashBit);   
            //mbDispUpdateFlag=TRUE;    
            break;   
        case KEY_RIGHT:   
            if(mucFlashBit==0)  mucFlashBit=MAX_INPUT_NUMBERS;   
            else            mucFlashBit--;   
            flash_led(mucFlashBit);   
            //mbDispUpdateFlag=TRUE;    
            break;   
        case KEY_UP:   
            if(mucFlashBit!=MAX_INPUT_NUMBERS)      number_add();   
            break;   
        case KEY_DOWN:   
            if(mucFlashBit!=MAX_INPUT_NUMBERS)      number_dec();   
            break;   
    }   
    if(mbDispUpdateFlag==TRUE)  disp_freq();   
    if(mbFreqUpdateFlag==TRUE)   
    {   
        //write_freq();    
        DDS_set_freq();   
    }   
    delay_100ms(3);   
}   
   
void main(void)   
{   
    uchar  ucKey;   
    //SP=0x60;    
    init_device();   
    delay_100ms(20);   
    init_dds();   
    init_disp();   
    mulFreq=5000000;//20KHz    
    value_to_bcd();   
    mucFlashBit=3;   
    //flash_led(mucFlashBit);    
    disp_freq();   
    //write_freq();    
    DDS_set_freq();   
    while(1)   
    {   
        ucKey=key_scan();   
        if(ucKey!=KEY_NULL) key_process(ucKey);   
    }   
}   
   
   
/*1  
void main(void)  
{  
    init_device();  
    delay_100ms(20);  
    while(1)  
    {  
        //P3_0=1;P3_1=1;P3_2=1;P3_3=1;P3_4=1;P3_5=1;P3_7=1;  
        //P3_0=0;P3_1=0;P3_2=0;P3_3=0;P3_4=0;P3_5=0;P3_7=0;  
        P1_0=1;P1_1=1;P1_2=1;P1_3=1;P1_4=1;P1_5=1;P1_6=1;P1_7=1;  
        P1_0=0;P1_1=0;P1_2=0;P1_3=0;P1_4=0;P1_5=0;P1_6=0;P1_7=0;  
        //P1=1;  
        _nop_(); _nop_(); _nop_(); _nop_(); _nop_();   
        //P3=0;  
        //P1=0;  
        _nop_(); _nop_(); _nop_(); _nop_(); _nop_();   
        //delay_ms(2);  
    }  
}  
*/

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -