標題: DA9833+51單片機DDS信號發(fā)生器的設(shè)計(含源碼+PCB+仿真)高精度頻率 [打印本頁]
作者: c820415525 時間: 2018-10-31 00:32
標題: DA9833+51單片機DDS信號發(fā)生器的設(shè)計(含源碼+PCB+仿真)高精度頻率
DDS信號發(fā)生器硬件電路主要包括:主控電路、DA9833模塊電路、獨立按鍵、液晶顯示等。
本方案選擇了AD9833(AD9833數(shù)據(jù)手冊)作為核心芯片,并與單片機STC89C52(STC89C52數(shù)據(jù)手冊)結(jié)合,設(shè)計一款簡易的高精度頻率信號發(fā)生器,具有體積小功耗低等優(yōu)點。AD9833是AD公司生產(chǎn)的一款采用DDS技術(shù)、低功耗、可編程波形發(fā)生器。
可產(chǎn)生正弦波,三角波,方波三種波形,正弦波0~4MHz,三角波0~3MHz,方波0~2MHz;任意調(diào)節(jié)幅度范圍0~15V;
仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)
111111111111.PNG (104.7 KB, 下載次數(shù): 163)
下載附件
proteus仿真圖
2018-10-31 00:25 上傳
電路原理圖如下:
2222222.PNG (94.03 KB, 下載次數(shù): 116)
下載附件
AD原理圖
2018-10-31 00:25 上傳
Altium Designer畫的DDS信號發(fā)生器原理圖和PCB圖如下:(51hei附件中可下載工程文件)
0.png (27.18 KB, 下載次數(shù): 101)
下載附件
2018-10-31 00:39 上傳
0.png (7.21 KB, 下載次數(shù): 93)
下載附件
2018-10-31 00:40 上傳
幅度的放大電路:
0.png (18.99 KB, 下載次數(shù): 118)
下載附件
2018-10-31 00:40 上傳
0.png (14.45 KB, 下載次數(shù): 104)
下載附件
2018-10-31 00:40 上傳
單片機源碼:
- #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 信號發(fā)生器 ";
- 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; //上調(diào)鍵
- sbit s3=P2^2; //下調(diào)鍵
- void Wave_Generate(ulong,uchar); //波形的頻率和波形的選擇
- void AD9833_Send_Word(uint); //AD9833的數(shù)據(jù)接收函數(shù)
- void delay(uint); //延時函數(shù)
- 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寫入的數(shù)據(jù)
- {
- 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() //矩形鍵盤掃描函數(shù)
- {
- 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) //上調(diào)鍵
- {
- 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]);
- }
- }
復(fù)制代碼
0.png (4.19 KB, 下載次數(shù): 93)
下載附件
2018-10-31 00:41 上傳
全部資料51hei下載地址:
信號發(fā)生器仿真圖及AD原理圖.zip
(14.2 MB, 下載次數(shù): 867)
2018-10-31 00:31 上傳
點擊文件名下載附件
本信號發(fā)生器課程設(shè)計的所有資料下載
下載積分: 黑幣 -5
作者: ptlantu 時間: 2018-10-31 11:06
good~~~~
作者: gemxie 時間: 2018-11-4 22:18
學(xué)習(xí)學(xué)習(xí)了,謝謝分享了
作者: 醬油醬油咸 時間: 2019-1-14 22:10
謝謝分享,感恩
作者: hellowC8051 時間: 2019-1-25 16:43
好資料,謝謝分享
作者: 逆風(fēng)丶蒲公英灬 時間: 2019-3-8 21:47
牛逼

作者: anyi123 時間: 2019-4-13 08:00
謝謝分享
作者: hyzqq 時間: 2019-5-1 05:34
謝謝分享,學(xué)習(xí)了。
作者: yywysd 時間: 2019-5-1 19:13
謝謝分享,好好學(xué)習(xí)學(xué)習(xí)。
作者: user2402167 時間: 2019-5-13 23:20
樓上運行成功嗎
作者: Linyux 時間: 2019-5-20 15:34
謝謝分享
作者: sqmfs1 時間: 2019-7-19 16:30
謝謝分享
作者: nmg729183 時間: 2019-8-1 18:09
小白來學(xué)習(xí)
作者: a25575703 時間: 2019-9-12 22:42
感謝樓主的分享。
作者: 626487324 時間: 2019-10-6 17:09
op07帶寬才500KHZ,接近和超過500KHZ時波形失真衰減嚴重,根本做不到1M以上,用高速運放可以。
作者: yywysd 時間: 2019-10-6 17:54
謝謝分享,好好學(xué)習(xí)學(xué)習(xí)。
作者: xuyu20084636@12 時間: 2019-10-24 11:46
這款程序非常不錯
作者: 莫超人 時間: 2019-10-25 10:54
感謝樓主分享
作者: snaiodiwa 時間: 2019-12-13 08:59
謝謝分享
作者: 文鐸同學(xué) 時間: 2019-12-13 10:44
感謝分享
作者: abc745188365 時間: 2019-12-29 02:18
為什么我的源碼用不了顯示沒有權(quán)限呢 樓主
作者: 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,預(yù)留了7個PIN的9833模塊接口,卻沒說是哪種模塊,按照原理圖理解應(yīng)是自帶有幅值調(diào)節(jié)電位器的那種。
3,OP07只能對1MHz以下的信號進行運放,這個最好說一下,畢竟9833產(chǎn)生的信號大概能跑到8M呢。
作者: wdadzggcd 時間: 2023-4-1 22:28
你好,我根據(jù)電路圖進行了打板,但是燒錄時12864無顯示,請問是有什么位置可能不對嗎
作者: wdadzggcd 時間: 2023-4-2 01:06
能指導(dǎo)一下為什么電源接通了而不能顯示
作者: 元元元。。。 時間: 2023-6-12 17:31
可調(diào)節(jié)頻率嗎
作者: 奧赫特海泉灣 時間: 2023-6-21 09:34
有人做成功了嗎
作者: babyvoxsky 時間: 2023-6-23 11:21
感謝分享,我就是沖著代碼來學(xué)習(xí)的!
作者: ASDZXC123TGFG 時間: 2023-7-6 20:02
感謝分享,請問代碼要在哪個軟件上寫
作者: aide51 時間: 2023-8-12 08:25
這個很不錯,有時間做一個,謝謝分享
作者: 937866242@qq.co 時間: 2024-6-30 12:59
沒仔細看,這個仿真是DA0832,頻率比較低的
歡迎光臨 (http://www.torrancerestoration.com/bbs/) |
Powered by Discuz! X3.1 |