您的当前位置:首页正文

AD9833模块的dds信号源程序

2024-10-18 来源:威能网


//---------------------------------------------------//

//AD9833模块测试程序

//功能:循环输出1KHz方波,正弦波。三角波

//接口:

//

//---------------------------------------------------//

//sum为按键输入临时变量

// K3为外部中断口 控制通道开关

// R=33为选择通道A标志 R34为选择通道B标志

// y1 A通道的开关标志 1:关闭 ;0:打开 y2也一样

// temp1 A通道的频率控制字变量 temp3 A通道的相位控制字变量

// temp2 B通道的频率控制字变量 temp4 B通道的相位控制字变量

// c1 c2为频率比变量 b1为选择比例标志位变量

//定义头文件

#include

#include

#include

#include

#include

//---------------------------------------------------//

sbit ad9833_sdata =P2^2; //ad9833数据线

sbit ad9833_sclk =P2^3; //ad9833时钟线

sbit ad9833_fsync1 =P2^4; //通道A使能

sbit ad9833_fsync2 =P2^1; //通道2使能

//外部中断的IO

sbit K3=P3^2; //外部中断0

sbit K4=P3^3; //外部中断1

#define uchar unsigned char

#define uint unsigned int

long int m;

uint w1=38,w2=38,w3=38,w4=38,floag1=0;

uchar z,y=1,y1=1,y2=1;

extern unsigned long int sum,temp1,temp2,temp3,temp4,temp5=0,temp6=0;

extern uchar s,di,R,b1,q;

void output_f1(unsigned long freq_value);//输出子函数

void output_f2(unsigned long phase_value); //相位输出函数

void output_p1(unsigned long freq_value);//输出子函数

void output_p2(unsigned long phase_value); //相位输出函数

void display(long int p,uchar s,uchar b1,uchar floag1);//显示处理函数

void IntConfiguration();//外部中断函数

//---------------------------------------------------//

//延时程序

//---------------------------------------------------//

void delay(unsigned int m)

{

unsigned int n;

for (n=0;n<=m;n++)

{

}

}

void delayms(unsigned int ii)//1ms延时函数

{

unsigned int i,x;

for(x=0;x{

for (i=0;i<100;i++);

}

}

//---------------------------------------------------//

// write_ad9833: 向AD9833_ic1写16位数据 软件SPI方式

//

//---------------------------------------------------//

void write_ad9833ic1_d16(unsigned int x)

{

int i,w;

ad9833_sclk=1; //scl置为高电平

ad9833_fsync2=1; //关闭ic2

ad9833_fsync1=1; //fsync置为高电平,关闭使能ic1

ad9833_fsync1=0; //fsync置为低电平,使能ic1

//写16位数据

w=x;

for(i=0;i<16;i++)

{

ad9833_sdata=w&0x8000;

ad9833_sclk=0;

ad9833_sclk=1;

w=w<<1;

}

ad9833_fsync1=1;

ad9833_sclk=0;

}

//---------------------------------------------------//

// 向16位 AD9833_ic2写数据 //---------------------------------------------------//

void write_ad9833ic2_d16(unsigned int x)

{

int i,w;

ad9833_sclk=1; //scl置为高电平

ad9833_fsync1=1; //关闭ic1

ad9833_fsync2=1; //fsync置为高电平,关闭使能ic2 ad9833_fsync2=0; //fsync置为低电平,使能ic2

//

w=x;

for(i=0;i<16;i++)

{

ad9833_sdata=w&0x8000;

ad9833_sclk=0;

ad9833_sclk=1;

w=w<<1;

}

ad9833_fsync2=1;

ad9833_sclk=0;

}

//---------------------------------------------------//

// 向16位 AD9833_ic2和//

同时写数据写数据ic2

//---------------------------------------------------//

void write_ad9833_d16(unsigned int x)

{

int i,w;

ad9833_sclk=1;

ad9833_fsync1=1;

ad9833_fsync2=1;

ad9833_fsync1=0;

ad9833_fsync2=0;

//写16位数据

w=x;

for(i=0;i<16;i++)

{

ad9833_sdata=w&0x8000;

ad9833_sclk=0;

ad9833_sclk=1;

w=w<<1;

}

ad9833_fsync1=1;

ad9833_fsync2=1;

ad9833_sclk=0;

}

//---------------------------------------------------//

// 主程序 //---------------------------------------------------//

main()

//

{

P0=0XFF;

P1=0Xff;

P2=0XFF;

P3=0Xff;

chushi();

IntConfiguration();

//寄存器频率0输出1KHz波形

write_ad9833_d16(0x0100); //复位AD9833

write_ad9833_d16(0x2100); //选择数据一次写入

write_ad9833_d16(0x6000); //L14

write_ad9833_d16(0x4000); //H14 频率寄存器0为1KHz

write_ad9833_d16(0x9001); //L14

write_ad9833_d16(0x8000); //H14 频率寄存器1为2KHz

write_ad9833_d16(0x2100); //芯片进入关闭工作状态,寄存器频率0输出1KHz波形

//

// write_ad9833_d16(0xc000); //L14相位寄存器0

// write_ad9833_d16(0xe000); //H14 相位寄存器1

// write_ad9833_d16(0x93E3); //L14

// write_ad9833_d16(0x8001); //H14 频率寄存器1为2KHz

//寄存器频率0输出1KHz波形

write_ad9833_d16(0x0100); //复位AD9833

write_ad9833_d16(0x2100); //选择数据一次写入

// output1(80000);

write_ad9833_d16(0x2000); //芯片进入工作状态,寄存器频率0输出1KHz波形

delay(60);

write_ad9833_d16(0x0100); //复位AD9833

write_ad9833_d16(0x2100); //选择数据一次写入

write_ad9833ic1_d16(0x0c000); //L14相位寄存器0

delay(100);

write_ad9833ic2_d16(0x0c000); //L14相位寄存器0

while(1)

{

q=floag1;

display(sum,s,b1,floag1);

KeyDown();

if(K4==0) z++;

delayms(100);

}

}

void output_f1(unsigned long freq_value) //A频率输出函数

{

unsigned long dds; //频率变量

unsigned int dds_l,dds_h; //h为高14位,l为低14位

if(freq_value>=100) //高于100hz的情况

{

dds=(freq_value/100*1074)+freq_value%100*10.74; //268435456/ FMCLK

}

else //低于100hz的情况

dds=freq_value*10.74; //输出频率=频率控制字=按键输入值*(MCLK/2^28)系数10.7根据实际情况修改

dds_l=dds; //低字节

dds_h=dds>>14; //高字节

dds_l=dds_l & 0x3FFF;

dds_l=dds_l | 0x4000;

dds_h=dds_h & 0x3FFF;

dds_h=dds_h | 0x4000;

write_ad9833ic1_d16(0x0100); //28位连续,选择频率0,相位0,RESET=0

write_ad9833ic1_d16(0x2100); //28位连续,选择频率0,相位0,RESET=0

write_ad9833ic1_d16(dds_l);

write_ad9833ic1_d16(dds_h);

}

void output_f2(unsigned long freq_value) //B频率输出函数

{

unsigned long dds;

unsigned int dds_l,dds_h;

if(freq_value>=100)

{

dds=(freq_value/100*1074)+freq_value%100*10.74; //268435456/ FMCLK

}

else

dds=freq_value*10.74;

dds_l=dds; //低字节

dds_h=dds>>14; //高字节

dds_l=dds_l & 0x3FFF;

dds_l=dds_l | 0x4000;

dds_h=dds_h & 0x3FFF;

dds_h=dds_h | 0x4000;

write_ad9833ic2_d16(0x0100); //28位连续,选择频率0,相位0,RESET=0

write_ad9833ic2_d16(0x2100); //28位连续,选择频率0,相位0,RESET=0

write_ad9833ic2_d16(dds_l);

write_ad9833ic2_d16(dds_h);

}

void display(long int p,uchar s,uchar b1,uchar floag2) //显示 处理 函数

{

uchar i=0,j=0;

float c1=0,c2=0;

if(y1==0) {w1=46;w2=0;} //y1=0显示on(打开通道)

if(y1==1) w1=w2=38; //y1=1显示off(关闭通道)

if(y2==0) {w3=46;w4=0;} //同上

if(y2==1) w3=w4=38; //

if(R==33&di==1) temp1=p; //r=33,di=1则写a通道的频率控制字

if(R==34&di==1) temp2=p; //r=34,di=1则写b通道的频率控制字

if(s==5)

{

if(b1==1){c1=c2=1;}

if(b1==2) {c1=1;c2=2;}

if(b1==3) {c1=1;c2=3;}

if(b1==4) {c1=2;c2=3;}

temp2=temp1*(c2/c1);

}

/*****************************************************************

******************频率显示 函 数*****************

*****************************************************************/

//-------CHA-------//

if(R==33&di==1) {displayc(0,2);displayd(0,2);displaye(0,2);displayb(30,2);}//光标 R=33,di=1,光标在a通道频率处,并清除其余处的光标显示

if(R==33&di==2) {displayb(0,2);displayc(30,2);}//s//光标、类似上面

if(R==34&di==1) displayd(30,2);}//s//光标

{ displayb(0,2);displayc(0,2);displaye(0,2);

if(R==34&di==2) { displayd(0,2); displaye(30,2);}//s//光标

if(s==5)

{

if(q==1)

{

displaya(0,0);//s

displaya(0,1);//i

displaya(38,2);//n

displaya(0,3);//n

displaya(0,4);//c

}

else

{

displaya(70,0);//f

displaya(17,1);//1

displaya(26,2);//:

displaya(70,3);//f

displaya(2+16,4);//2

}

}

else

{

displaya(0,0);//s

displaya(0,1);//i

displaya(0,2);//n

displaya(0,3);//n

displaya(0,4);//c

}

displaya(51,6);//e

displaya(73,7);//e

displaya(78,8);//e

displaya(67,9);//e

displaya(69,10);//e

// displaya(51,4);//s

// displaya(73,5);//i

// displaya(78,6);//n

// displaya(67,7);//c

// displaya(69,8);//e

// displaye(30,0);

displayb(33,0);//CHA

displayb(26,1);

displayb(temp1/1000000+16,3);

displayb(temp1%1000000/100000+16,4);

displayb(temp1%100000/10000+16,5);

displayb(temp1%10000/1000+16,6);

displayb(temp1%1000/100+16,7);

displayb(temp1%100/10+16,8);

displayb(temp1%10+16,9);

displayb(40,10); //H

displayb(90,11); //z

//-------CHB---------//

displayd(34,0);

displayd(26,1);

displayd(temp2/1000000+16,3);

displayd(temp2%1000000/100000+16,4);

displayd(temp2%100000/10000+16,5);

displayd(temp2%10000/1000+16,6);

displayd(temp2%1000/100+16,7);

displayd(temp2%100/10+16,8);

displayd(temp2%10+16,9);

displayd(40,10); //H

displayd(90,11); //z

/*****************************************************************

******************相位显示 函 数*****************

*****************************************************************/

//------CHA------------------//

displayc(0,0);

displayc(26,1);

displayc(48,3);

displayc(temp3/100+16,4);

displayc(temp3%100/10+16,5);

displayc(temp3%100%10+16,6);

displayc(92,7); //相位

displayc(47,9);

displayc(w1,10);

displayc(w2,11);

//----------------CHB---------//

displaye(0,0);

displayc(26,1);

displaye(48,3);

displaye(temp4/100+16,4);

displaye(temp4%100/10+16,5);

displaye(temp4%100%10+16,6);

displaye(92,7);//相位

displaye(47,9);

displaye(w3,10);

displaye(w4,11);

displayf(38,0); //频率比值

displayf(26,1);

displayf(c1+16,2);

displayf(26,3); //:

displayf(c2+16,4);

displayf(27,5);

displayf(93,6); //相位差

displayf(92,7);

if(temp3>=temp4)

{

displayf((temp3-temp4)/100+16,8); //temp3>temp4时,相位差=temp3-temp4

displayf((temp3-temp4)%100/10+16,9);

displayf((temp3-temp4)%10+16,10);

}

else

{

displayf((temp4-temp3)/100+16,8);

displayf((temp4-temp3)%100/10+16,9);

displayf((temp4-temp3)%10+16,10);

}

displayf(92,11);

}

void IntConfiguration()

{

//设置INT0

IT0=1;//跳变沿出发方式(下降沿)

EX0=1;//打开INT0的中断允许。

//设置INT1

IT1=1;

EX1=1;

EA=1;//打开总中断

}

void Int1() interrupt 2 //外部中断1的中断函数

{

uchar i;

delay(100); //延时消抖

if(floag1==0) floag1=1;

else floag1=0;

while(i<20&K4==0)

{

i++;

}

}

void Int0() interrupt 0 //外部中断0的中断函数

{

uchar i;

delay(100); //延时消抖

output_f1(temp1); //写通道a频率控制字

output_f2(temp2); //写通道b频率控制字

if(R==33)//检测按键r=33表示通道a

{

if(y==1) {write_ad9833ic1_d16(0x2100);y1=1;} //关闭通道a

else{

if(y2 ==0)

{write_ad9833_d16(0x2000);y1=0;}

else { write_ad9833ic1_d16(0x2000);y1=0;}

}

}

if(R==34) //检测按键r=34表示通道b

{

if(y==1) {write_ad9833ic2_d16(0x2100);y2=1;} //关闭通道b 0x2100

else

{

if(y1==0) //若通道a打开,则打开双通道

{write_ad9833_d16(0x2000);y2=0;}

else {write_ad9833ic2_d16(0x2000);y2=0;} // 否则只打开通道b0x2000

}

}

if(y==1) z=y=0;

else z=y=1;

while(i<20&K3==0)

{

i++;

}

}

因篇幅问题不能全部显示,请点此查看更多更全内容