//---------------------------------------------------//
//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++; } } 因篇幅问题不能全部显示,请点此查看更多更全内容