标题: DA9833+51单片机DDS信号发生器的设计(含源码+PCB+仿真)高精度频率 [打印本页]
作者: c820415525 时间: 2018-10-31 00:32
标题: DA9833+51单片机DDS信号发生器的设计(含源码+PCB+仿真)高精度频率
DDS信号发生器硬件电路主要包括:主控电路、DA9833模块电路、独立按键、液晶显示等。
本方案选择了AD9833(AD9833数据手册)作为核心芯片,并与单片机STC89C52(STC89C52数据手册)结合,设计一款简易的高精度频率信号发生器,具有体积小功耗低等优点。AD9833是AD公司生产的一款采用DDS技术、低功耗、可编程波形发生器。
可产生正弦波,三角波,方波三种波形,正弦波0~4MHz,三角波0~3MHz,方波0~2MHz;任意调节幅度范围0~15V;
仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)
电路原理图如下:
Altium Designer画的DDS信号发生器原理图和PCB图如下:(51hei附件中可下载工程文件)
幅度的放大电路:
单片机源码:
- #include <reg52.h> //头文件
- #include <intrins.h>
- #include <stdio.h>
- #include <math.h>
- #define uint unsigned int
- #define uchar unsigned char
- #define ulong unsigned long
- uchar s1num,shape,num,a,b,c,d,e,f,h,boxing;
- ulong Freq,g;
- uint Config_Data[8];
-
- uchar code table1[]="波形选择 : SIN ";
- uchar code table2[]="波形频率 : ";
- uchar code table3[]="0 0 0 0 0 0 0 HZ";
- uchar code table4[]="DDS 信号发生器 ";
- sbit rs=P2^7; //12864液晶端口的定义
- sbit rw=P2^6;
- sbit ep=P2^5;
- sbit lcd_psb=P2^4;
- sbit FSYNC=P1^4; //AD9833端口的定义
- sbit SCLK =P1^3;
- sbit SDATA=P1^2;
- sbit s1=P2^0; //光标键
- sbit s2=P2^1; //上调键
- sbit s3=P2^2; //下调键
- void Wave_Generate(ulong,uchar); //波形的频率和波形的选择
- void AD9833_Send_Word(uint); //AD9833的数据接收函数
- void delay(uint); //延时函数
- void delay(uint xms)
- {
- uint i,j;
- for(i=xms;i>0;i--)
- for(j=110;j>0;j--);
- }
- void lcd_cmd(uchar cmd) //12864写入的指令
- {
- rs=0;
- rw=0;
- ep=0;
- P0=cmd;
- delay(5);
- ep=1;
- delay(5);
- ep=0;
- }
- void lcd_dat(uchar dat) //12864写入的数据
- {
- rs=1;
- rw=0;
- ep=0;
- P0=dat;
- delay(5);
- ep=1;
- delay(5);
- ep=0;
- }
- void lcd_init() //12864液晶的初始化
- {
-
- lcd_psb=1;
- delay(5);
- lcd_cmd(0x34);
- delay(5);
- lcd_cmd(0x30);
- delay(5);
- lcd_cmd(0x0c);
- delay(5);
- lcd_cmd(0x01);
- delay(5);
-
- }
- void display()
- {
- uint i;
- lcd_cmd(0x80); //第一行显示
- while(table1[i]!='\0')
- {
- lcd_dat(table1[i]);
- i++;
- }
-
- i=0;
- lcd_cmd(0x90); //第二行显示
- while(table2[i]!='\0')
- {
- lcd_dat(table2[i]);
- i++;
- }
-
- i=0;
- lcd_cmd(0x88); //第三行显示
- while(table3[i]!='\0')
- {
- lcd_dat(table3[i]);
- i++;
- }
-
- i=0;
- lcd_cmd(0x98); //第四行显示
- while(table4[i]!='\0')
- {
- lcd_dat(table4[i]);
- i++;
- }
- }
- void input_freq() //矩形键盘扫描函数
- {
- if(s1==0) //光标键
- {
- delay(5);
- if(s1==0)
- {
- s1num++;
- while(!s1);
- lcd_cmd(0x0f);
- if(s1num==1)
- {
- lcd_cmd(0x80+7);
- }
- if(s1num==2)
- {
- lcd_cmd(0x88+6);
- }
- if(s1num==3)
- {
- lcd_cmd(0x88+5);
- }
- if(s1num==4)
- {
- lcd_cmd(0x88+4);
- }
- if(s1num==5)
- {
- lcd_cmd(0x88+3);
- }
- if(s1num==6)
- {
- lcd_cmd(0x88+2);
- }
- if(s1num==7)
- {
- lcd_cmd(0x88+1);
- }
- if(s1num==8)
- {
- lcd_cmd(0x88+0);
- }
- if(s1num==9)
- {
- s1num=0;
- lcd_cmd(0x0c);
- g=a+10*b+100*c+1000*d+10000*e+100000*f+1000000*h;
- Freq=g;
- boxing=shape;
- Wave_Generate(Freq,boxing);
- }
- }
- }
- if(s1num!=0) //上调键
- {
- if(s2==0)
- {
- delay(5);
- if(s2==0)
- {
- while(!s2);
- if(s1num==1)
- {
- shape++;
- if(shape==3)
- shape=0;
- lcd_cmd(0x80+6);
- switch(shape)
- {
-
- case 0:
- lcd_dat('S'); //按0为正弦波
- delay(5);
- lcd_dat('I');
- delay(5);
- lcd_dat('N');
- delay(5);
- break;
- case 1:
- lcd_dat('T'); //按1为三角波
- delay(5);
- lcd_dat('R');
- delay(5);
- lcd_dat('I');
- delay(5);
- break;
- case 2:
- lcd_dat('D'); //按2为方波
- delay(5);
- lcd_dat('A');
- delay(5);
- lcd_dat('C');
- delay(5);
- break;
- }
- }
- if(s1num==2)
- {
- a++;
- if(a==10)
- a=0;
- lcd_cmd(0x88+6);
- lcd_dat(0x30+a);
- }
- if(s1num==3)
- {
- b++;
- if(b==10)
- b=0;
- lcd_cmd(0x88+5);
- lcd_dat(0x30+b);
- }
- if(s1num==4)
- {
- c++;
- if(c==10)
- c=0;
- lcd_cmd(0x88+4);
- lcd_dat(0x30+c);
- }
- if(s1num==5)
- {
- d++;
- if(d==10)
- d=0;
- lcd_cmd(0x88+3);
- lcd_dat(0x30+d);
- }
- if(s1num==6)
- {
- e++;
- if(e==10)
- e=0;
- lcd_cmd(0x88+2);
- lcd_dat(0x30+e);
- }
- if(s1num==7)
- {
- f++;
- if(f==10)
- f=0;
- lcd_cmd(0x88+1);
- lcd_dat(0x30+f);
- }
- if(s1num==8)
- {
- h++;
- if(h==10)
- h=0;
- lcd_cmd(0x88+0);
- lcd_dat(0x30+h);
- }
-
- }
- }
- }
- if(s1num!=0)
- {
- if(s3==0)
- {
- delay(5);
- if(s3==0)
- {
- while(!s3);
- if(s1num==1)
- {
- shape--;
- if(shape==-1)
- shape=2;
- lcd_cmd(0x80+6);
- switch(shape)
- {
-
- case 0:
- lcd_dat('S'); //按0为正弦波
- delay(5);
- lcd_dat('I');
- delay(5);
- lcd_dat('N');
- delay(5);
- break;
- case 1:
- lcd_dat('T'); //按1为三角波
- delay(5);
- lcd_dat('R');
- delay(5);
- lcd_dat('I');
- delay(5);
- break;
- case 2:
- lcd_dat('D'); //按2为方波
- delay(5);
- lcd_dat('A');
- delay(5);
- lcd_dat('C');
- delay(5);
- break;
- }
- }
- if(s1num==2)
- {
- a--;
- if(a==-1)
- a=9;
- lcd_cmd(0x88+6);
- lcd_dat(0x30+a);
- }
- if(s1num==3)
- {
- b--;
- if(b==-1)
- b=9;
- lcd_cmd(0x88+5);
- lcd_dat(0x30+b);
- }
- if(s1num==4)
- {
- c--;
- if(c==-1)
- c=9;
- lcd_cmd(0x88+4);
- lcd_dat(0x30+c);
- }
- if(s1num==5)
- {
- d--;
- if(d==-1)
- d=9;
- lcd_cmd(0x88+3);
- lcd_dat(0x30+d);
- }
- if(s1num==6)
- {
- e--;
- if(e==-1)
- e=9;
- lcd_cmd(0x88+2);
- lcd_dat(0x30+e);
- }
- if(s1num==7)
- {
- f--;
- if(f==-1)
- f=9;
- lcd_cmd(0x88+1);
- lcd_dat(0x30+f);
- }
- if(s1num==8)
- {
- h--;
- if(h==-1)
- h=9;
- lcd_cmd(0x88+0);
- lcd_dat(0x30+h);
- }
- }
-
- }
-
- }
- }
- void main()
- {
- P0=0xff;
- P1=0xff;
- P2=0xff;
- P3=0xff;
- //delay(10000);
-
- lcd_init();
- display();
- FSYNC=1;
- SCLK=0;
- delay(5);
- Wave_Generate(1000,0);
- while(1)
- {
- input_freq();
- }
- }
- void AD9833_Send_Word(uint Data_In)
- {
- uchar i;
- SCLK=1;
- FSYNC=0;
- for(i=0;i<16;i++)
- {
- SCLK=1;
- SDATA=(bit)((Data_In & 0x8000)>>15);
- SCLK=0;
- Data_In=Data_In<<1;
- }
- FSYNC=1;
- SCLK=0;
- }
- void Wave_Generate(ulong Freq,uchar shape)
- {
- ulong temp;
- uchar k;
- if(Freq>12000000) Freq=12000000;
- switch(shape)
- {
- case 0:
- Config_Data[0]=0x2108; //按0为正弦波
- Config_Data[7]=0x2008;
- break;
- case 1:
- Config_Data[0]=0x210A; //按1为三角波
- Config_Data[7]=0x200A;
- break;
- case 2:
- Config_Data[0]=0x2128; //按2为方波
- Config_Data[7]=0x2028;
- break;
- default:
- Config_Data[0]=0x2108;
- Config_Data[7]=0x2008;
- }
- temp=Freq*10.73; //temp=Freq*(0x10000000/20000000);
- Config_Data[1]=temp&0x00003fff;
- Config_Data[3]=Config_Data[1];
- Config_Data[2]=(temp&0x0fffc000)>>14;
- Config_Data[4]=Config_Data[2];
-
- Config_Data[1]=Config_Data[1]|0x4000;
- Config_Data[2]=Config_Data[2]|0x4000;
- Config_Data[3]=Config_Data[3]|0x8000;
- Config_Data[4]=Config_Data[4]|0x8000;
- Config_Data[5]=0xC000;
- Config_Data[6]=0xE000;
- for(k=0;k<8;k++)
- {
- AD9833_Send_Word(Config_Data[k]);
- }
- }
复制代码
全部资料51hei下载地址:
信号发生器仿真图及AD原理图.zip
(14.2 MB, 下载次数: 867)
作者: ptlantu 时间: 2018-10-31 11:06
good~~~~
作者: gemxie 时间: 2018-11-4 22:18
学习学习了,谢谢分享了
作者: 酱油酱油咸 时间: 2019-1-14 22:10
谢谢分享,感恩
作者: hellowC8051 时间: 2019-1-25 16:43
好资料,谢谢分享
作者: 逆风丶蒲公英灬 时间: 2019-3-8 21:47
牛逼

作者: anyi123 时间: 2019-4-13 08:00
谢谢分享
作者: hyzqq 时间: 2019-5-1 05:34
谢谢分享,学习了。
作者: yywysd 时间: 2019-5-1 19:13
谢谢分享,好好学习学习。
作者: user2402167 时间: 2019-5-13 23:20
楼上运行成功吗
作者: Linyux 时间: 2019-5-20 15:34
谢谢分享
作者: sqmfs1 时间: 2019-7-19 16:30
谢谢分享
作者: nmg729183 时间: 2019-8-1 18:09
小白来学习
作者: a25575703 时间: 2019-9-12 22:42
感謝樓主的分享。
作者: 626487324 时间: 2019-10-6 17:09
op07带宽才500KHZ,接近和超过500KHZ时波形失真衰减严重,根本做不到1M以上,用高速运放可以。
作者: yywysd 时间: 2019-10-6 17:54
谢谢分享,好好学习学习。
作者: xuyu20084636@12 时间: 2019-10-24 11:46
这款程序非常不错
作者: 莫超人 时间: 2019-10-25 10:54
感谢楼主分享
作者: snaiodiwa 时间: 2019-12-13 08:59
谢谢分享
作者: 文铎同学 时间: 2019-12-13 10:44
感谢分享
作者: abc745188365 时间: 2019-12-29 02:18
为什么我的源码用不了显示没有权限呢 楼主
作者: 15835994480 时间: 2020-1-2 16:53
我打不开PCB
作者: mcyhlm 时间: 2020-1-21 15:17
感谢感谢
作者: 9901241208 时间: 2020-2-5 14:32
有人做成功了吗?感觉它那个pcb不对lcd12864少了个焊盘,周围为啥要打一堆叉
作者: kkadc 时间: 2022-1-9 16:15
ad9833和dac0832,到底哪个?
作者: 红花无常 时间: 2022-7-31 20:30
这个资料不错,谢谢分享,但还是有一些地方不够清楚:
1,仿真的和资料里的不是同一套电路;
2,预留了7个PIN的9833模块接口,却没说是哪种模块,按照原理图理解应是自带有幅值调节电位器的那种。
3,OP07只能对1MHz以下的信号进行运放,这个最好说一下,毕竟9833产生的信号大概能跑到8M呢。
作者: wdadzggcd 时间: 2023-4-1 22:28
你好,我根据电路图进行了打板,但是烧录时12864无显示,请问是有什么位置可能不对吗
作者: wdadzggcd 时间: 2023-4-2 01:06
能指导一下为什么电源接通了而不能显示
作者: 元元元。。。 时间: 2023-6-12 17:31
可调节频率吗
作者: 奥赫特海泉湾 时间: 2023-6-21 09:34
有人做成功了吗
作者: babyvoxsky 时间: 2023-6-23 11:21
感谢分享,我就是冲着代码来学习的!
作者: ASDZXC123TGFG 时间: 2023-7-6 20:02
感谢分享,请问代码要在哪个软件上写
作者: aide51 时间: 2023-8-12 08:25
这个很不错,有时间做一个,谢谢分享
作者: 937866242@qq.co 时间: 2024-6-30 12:59
没仔细看,这个仿真是DA0832,频率比较低的
欢迎光临 (http://www.51hei.com/bbs/) |
Powered by Discuz! X3.1 |