AD9850 信号发生代码

  • *                                        AD9850.c                                                                *
  • *                                        AD9850的驱动程序C文件                                        *
  • *                                        Copyright (c)2009---MJC                                 *
  • *                                        Free to Copy and Modify.                                *
  • *                                        Author:Worrior                                                        *
  • *                                        Date:2009-9-1                                                        *
  • ************************************************************/
  • #include<intrins.h>
  • #include "AD9850I.h"
  • #include "lcd12864.h"
  • //unsigned char freq[8];                                //液晶显示8种步进频率值
  • unsigned char freq[8]={0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};
  • /********************
  • **函数:AD9850Reset
  • **功能:AD9850的复位函数
  • **作者:Worrior
  • **日期:2009-9-1
  • ********************/
  • void AD9850Reset(void)
  • {
  • AD9850WCLK = 1;
  • AD9850FQUD = 1;
  • //        AD9850ReSet = 0;
  • //        AD9850ReSet = 1;//复位脚置高电平(10个AD9850的时钟周期)
  • //        _nop_();_nop_();_nop_();_nop_();_nop_();
  • //        _nop_();_nop_();_nop_();_nop_();_nop_();//延时,其实不用这么长
  • //        AD9850ReSet = 0;//复位完成,再拉低
  • }
  • /*步进按键函数*/
  • void f10Mhz(void)                                                                                                                                                //10Mhz步进
  • {
  • freq[0]=freq[0]+1;
  • if(freq[0]>=10)
  • {
  • freq[0]=0;
  • }
  • display_led();
  • }
  • void f1Mhz(void)                                                                                                                                                //1Mhz步进
  • {
  • freq[1]=freq[1]+1;
  • if(freq[1]>=10)
  • {
  • freq[1]=0;
  • }
  • display_led();
  • }
  • void f100Khz(void)                                                                                                                                                //100Khz步进
  • {
  • freq[2]=freq[2]+1;
  • if(freq[2]>=10)
  • {
  • freq[2]=0;
  • }
  • display_led();
  • }
  • void f10Khz(void)                                                                                                                                                //10Khz步进
  • {
  • freq[3]=freq[3]+1;
  • if(freq[3]>=10)
  • {
  • freq[3]=0;
  • }
  • display_led();
  • }
  • void f1Khz(void)                                                                                                                                                //1Khz步进
  • {
  • freq[4]=freq[4]+1;
  • if(freq[4]>=10)
  • {
  • freq[4]=0;
  • }
  • display_led();
  • }
  • void f100Hz(void)                                                                                                                                                //100hz步进
  • {
  • freq[5]=freq[5]+1;
  • if(freq[5]>=10)
  • {
  • freq[5]=0;
  • }
  • display_led();
  • }
  • void f10Hz(void)                                                                                                                                                //10hz步进
  • {
  • freq[6]=freq[6]+1;
  • if(freq[6]>=10)
  • {
  • freq[6]=0;
  • }
  • display_led();
  • }
  • void f1Hz(void)                                                                                                                                                        //1hz步进
  • {
  • freq[7]=freq[7]+1;
  • if(freq[7]>=10)
  • {
  • freq[7]=0;
  • }
  • display_led();
  • }
  • /***计算控制字************/
  • /***入口:频率数组指针***出口,控制字值*****/
  • unsigned long jisuan(unsigned char data *fno)//*fno-0>freq[0...7]
  • {
  • unsigned long dds_no ;
  • dds_no=
  • (*(fno+7))*FF0+
  • (*(fno+6))*FF1+
  • (*(fno+5))*FF2+
  • (*(fno+4))*FF3+
  • (*(fno+3))*FF4+
  • (*(fno+2))*FF5+
  • (*(fno+1))*FF6+
  • (*fno)*FF7 ;
  • return(dds_no);
  • }
  • /********************
  • **函数:AD9850SetFre
  • **功能:AD9850设定频率控制字函数
  • **参数:Fre,float型,要设定的频率,单位Hz
  • **作者:Worrior
  • **日期:2009-9-1
  • ********************/
  • void AD9850ISetFre()
  • {
  • unsigned long FTW = 0;//要写入的32位频率控制字(AD9850一次需要写入40位控制字)
  • unsigned char part1,part2,part3,part4;
  • FTW=jisuan(freq);
  • //        if(FTW > 30000000)
  • //                FTW = 30000000;
  • //        FTW = (unsigned long) (Fre * AD9850_125M);//计算频率控制字(公式:FTW=(2^32/fosc)*Fre)
  • /*以下将32位频率控制字分解*/
  • part1 = (unsigned char) (FTW>>24);//取32~25位
  • part2 = (unsigned char) (FTW>>16);//取24~17位
  • part3 = (unsigned char) (FTW>>8); //取16~9位
  • part4 = (unsigned char) (FTW);          //取8~1位
  • /*以上将32位频率控制字分解*/
  • AD9850FQUD = 1;
  • AD9850WCLK = 1;
  • AD9850DATAPORT = 0x00;//寄存器最高的八位只送0x00
  • AD9850WCLK = 0;//WCLK上升沿送数据
  • _nop_();
  • AD9850WCLK = 1;
  • AD9850DATAPORT = part1;
  • AD9850WCLK = 0;//WCLK上升沿送数据
  • _nop_();
  • AD9850WCLK = 1;
  • AD9850DATAPORT = part2;
  • AD9850WCLK = 0;//WCLK上升沿送数据
  • _nop_();
  • AD9850WCLK = 1;
  • AD9850DATAPORT = part3;
  • AD9850WCLK = 0;//WCLK上升沿送数据
  • _nop_();
  • AD9850WCLK = 1;
  • AD9850DATAPORT = part4;
  • AD9850WCLK = 0;//AD9850WCLK上升沿送数据
  • _nop_();
  • AD9850FQUD = 0;//AD9850FQUD上升沿将AD9850缓冲区的40位数据送入DDS Core
  • }
  • /********************
  • **函数:AD9850SetFre
  • **功能:AD9850设定频率控制字函数
  • **参数:Fre,float型,要设定的频率,单位Hz
  • **作者:Worrior
  • **日期:2009-9-1
  • ********************/
  • void AD9850IISetFre(float Fre)
  • {
  • unsigned long FTW = 0;//要写入的32位频率控制字(AD9850一次需要写入40位控制字)
  • unsigned char part1,part2,part3,part4;
  • if(Fre > 30000000)
  • Fre = 30000000;
  • FTW = (unsigned long) (Fre * 34.3597384);//计算频率控制字(公式:FTW=(2^32/fosc)*Fre)
  • /*以下将32位频率控制字分解*/
  • part1 = (unsigned char) (FTW>>24);//取32~25位
  • part2 = (unsigned char) (FTW>>16);//取24~17位
  • part3 = (unsigned char) (FTW>>8); //取16~9位
  • part4 = (unsigned char) (FTW);          //取8~1位
  • /*以上将32位频率控制字分解*/
  • AD9850FQUD = 1;
  • AD9850WCLK = 1;
  • AD9850DATAPORT = 0x00;//寄存器最高的八位只送0x00
  • AD9850WCLK = 0;//WCLK上升沿送数据
  • _nop_();
  • AD9850WCLK = 1;
  • AD9850DATAPORT = part1;
  • AD9850WCLK = 0;//WCLK上升沿送数据
  • _nop_();
  • AD9850WCLK = 1;
  • AD9850DATAPORT = part2;
  • AD9850WCLK = 0;//WCLK上升沿送数据
  • _nop_();
  • AD9850WCLK = 1;
  • AD9850DATAPORT = part3;
  • AD9850WCLK = 0;//WCLK上升沿送数据
  • _nop_();
  • AD9850WCLK = 1;
  • AD9850DATAPORT = part4;
  • AD9850WCLK = 0;//AD9850WCLK上升沿送数据
  • _nop_();
  • AD9850FQUD = 0;//AD9850FQUD上升沿将AD9850缓冲区的40位数据送入DDS Core
  • }

[color=rgb(51, 102, 153) !important]复制代码
主程序:

  • #include <reg52.h>
  • #include "AD9850I.h"
  • #include "hs0038.h"
  • #include "lcd12864.h"
  • void main()
  • {
  • hs0038_init();               //HS0038初始化,使用了外部中断0///定时器1
  • lcd12864_init();
  • AD9850Reset();
  • while(1)
  • {
  • Get_Ircode_And_Dis();
  • switch (ircode[2])
  • {        /**************模式选择****************/
  • case 0x07:xuanzekey();break;
  • case 0x15:quedingkey();break;
  • case 0x09:fanhuikey();break;
  • /*************频率调整区***************/
  • case 0x0c:if(flag1==1) {f10Mhz();}; break;
  • case 0x18:if(flag1==1) {f1Mhz(); };break;
  • case 0x5e:if(flag1==1) {f100Khz();};break;
  • case 0x08:if(flag1==1) {f10Khz(); };break;
  • case 0x1c:if(flag1==1) {f1Khz(); } ;break;
  • case 0x5a:if(flag1==1) {f100Hz();} ;break;
  • case 0x42:if(flag1==1) {f10Hz(); } ;break;
  • case 0x52:if(flag1==1) {f1Hz();  } ;break;
  • /***************频率确认***************/
  • case 0x4a:        if(flag1==1)
  • {
  • pce1=0;
  • pce2=1;
  • pce3=1;
  • AD9850ISetFre();
  • };
  • break;
  • /***************AM调制*********************/
  • case 0x16:        pce1=1;                   //片选AD9850 I          实验板U1
  • pce2=0;                   //片选AD9850 I          实验板U2
  • pce3=1;
  • AD9850IISetFre(1000.0);break;
  • case 0x44:if(flag2==1)
  • {
  • pce1=1;
  • pce2=1;
  • pce3=0;
  • pwr=0;
  • AM_mastepdown();
  • };
  • break;
  • case 0x40:  if(flag2==1)
  • {
  • pce1=1;
  • pce2=1;
  • pce3=0;
  • pwr=0;
  • AM_mastepup();
  • };
  • break;
  • /***************FM调制*********************/
  • case 0x19:AD9850IISetFre(5000.0);break;
  • default:break;
  • }
  • ircode[2]=0;                                                                            //注意一定要把ircode[2]清零。。。。。
  • //                AD9850SetFre();
  • }
  • }
(0)

相关推荐