基于DDS与单片机的信号发生器的设计Word下载.docx
- 文档编号:20272269
- 上传时间:2023-01-21
- 格式:DOCX
- 页数:31
- 大小:1.78MB
基于DDS与单片机的信号发生器的设计Word下载.docx
《基于DDS与单片机的信号发生器的设计Word下载.docx》由会员分享,可在线阅读,更多相关《基于DDS与单片机的信号发生器的设计Word下载.docx(31页珍藏版)》请在冰豆网上搜索。
4.1、总体设计
通过STC89c52给定DDS频率,短接DDS上J3口,使DDS可以输出稳定频率和幅值的波形,同时通过液晶显示出幅值与频率。
謀荞抟箧飆鐸怼类蒋薔。
通过按键中断进入波形设置模式,可以通过按键增减与移位调整液晶屏上的频率显示,通过调整LM348设置新的幅值,在跳出波形设置模式时,DDS会按照设置好的波形参数产生一个新的波形,用以输出。
厦礴恳蹒骈時盡继價骚。
STC89c52中央处理
DDS直接式数字合成频率计
AD检测输出峰峰值
LM348为波形调相,放大或缩小
1602液晶显示频率和幅值
按键和旋钮调频调幅
给入设置中断
茕桢广鳓鯡选块网羈泪。
4.2、STC89C52单片机介绍
4.2.1STC89C52是一种低功耗、高性能CMOS8位微控制器,其特性及参数如下:
、
1、增强型8051单片机,6时钟/机器周期和12时钟/机器周期可以任意选择,指令代码完全兼容传统8051。
鹅娅尽損鹌惨歷茏鴛賴。
2、工作电压:
5.5V~3.3V(5V单片机)/3.8V~2.0V(3V单片机),此设计用的是5V的单片机。
籟丛妈羥为贍偾蛏练淨。
3、工作频率范围:
0~40MHz,相当于普通8051的0~80MHz,实际工作频率可达48MHz。
4、8K字节程序存储空间。
5、片上集成512字节RAM。
6.通用I/O口(32个),复位后为:
P0/P1/P2/P3是准双向口/弱上拉,P0口是漏极开路输出,作为总线扩展用时,不用加上拉电阻,作为I/O口用时,需加上拉电阻。
預頌圣鉉儐歲龈讶骅籴。
7、ISP(在系统可编程)/IAP(在应用可编程),无需专用编程器,无需专用仿真器,可通过串口(RxD/P3.0,TxD/P3.1)直接下载用户程序,数秒即可完成一片。
渗釤呛俨匀谔鱉调硯錦。
8、共3个16位定时器/计数器。
即定时器T0、T1、T2。
铙誅卧泻噦圣骋贶頂廡。
9、具有看门狗功能,PDIP封装。
4.2.2STC89C52各个引脚分布如下图3-3所示:
图3-3
本设计主要用的是P0口,(P0口连接数码管前要加1千欧的排阻作为上拉电阻)P2.7~P2.4口,这12口用于控制数码管;
P3.2,P3.3,P3.6,P3.7口与ADC0804相连接用以接受ADC0804转换后的数字信号;
引脚9用以单片机的复位电路;
P2.0口用以控制蜂鸣器;
18,19引脚用以晶振相关的电路;
40和31引脚用以连接+5V电压。
(注:
单片机的核心部分晶振必不可少,并且晶振应该尽量靠近单片机,否则将使得单片机无法正常工作。
)擁締凤袜备訊顎轮烂蔷。
4.3模数转换器ADC0804介绍
4.3.1ADC0804规格及引脚分配图如下图3-4所示:
图3-4
本设计采用的模数转换器ADC0804,它是CMOS8位单通道逐次渐近型的模数转换器,各个引脚的大致功能如下:
贓熱俣阃歲匱阊邺镓騷。
1、/CS:
芯片片选信号,低电平有效,即/CS=0,该芯片才能正常工作。
2、/WR:
启动ADC0804进行ADC采样,该信号低电平有效,即/WR信号由高电平变成低电平时,触发一次ADC转换。
坛摶乡囂忏蒌鍥铃氈淚。
3、/RD:
低电平有效,即/RD=0时,可以通过数据端口DB0~DB7读出本次的采样结果。
4、UIN(+)和UIN(-):
模拟电压输入端,模拟电压输入接UIN(+)端,UIN(-)端接地。
5、VREF/2:
参考电压接入引脚,该引脚可外接电压也可悬空。
6、CLKR和CLKIN:
外接RC电路产生模数转换器所需的时钟信号,时钟频率CLK=1/1.1RC,一般要求频率范围100KHz~1.28MHz。
蜡變黲癟報伥铉锚鈰赘。
7、AGND和DGND:
分别接模拟地和数字地。
8、/INT:
中断请求信号输出引脚,该引脚低电平有效,当一次A/D转换完成后,
将引起/INT=0,实际应用时,该引脚应与微处理器的外部中断输入引脚相连(如51单片机的INT0,INT1脚),当产生/INT信号有效时,还需等待/RD=0才能正确读出A/D转换结果,若ADC0804单独使用,则可以将/INT引脚悬空。
買鲷鴯譖昙膚遙闫撷凄。
9、DB0~DB7:
输出A/D转换后的8位二进制结果。
4.3.2ADC0804的外围电路如下图3-5所示:
图3-5
如图3-5所示,图中的C4为104的电容,其中104表示的是大小为10乘以10的4次方皮法的电容;
R4是大小为十千欧的电容。
VccREF接+5V的电压,Vin(-)和A-GND以及D-GND均接地,Vref/2不接任何线路,Vin(+)接输入的模拟电压信号;
DB0~DB7分别于单片机上的P0.0~P0.7引脚相连;
INTR、CS、RD和WR分别连接单片机的P3.3、P3.2、P3.7及P3.6引脚相连。
綾镝鯛駕櫬鹕踪韦辚糴。
4.3.3ADC0804转换时序图如下图3-6所示:
图3-6
ADC0804转换主要包含下面三个步骤:
1.启动转换:
由图3-6中的上部“FIGURE10A”可知,在/CS信号为低电平的情况下,将/WR引脚先由高电平变成低电平,经过至少tW(WR)I延时后,再将/WR引脚拉成高电平,即启动了一次AD转换。
驅踬髏彦浃绥譎饴憂锦。
注:
正常启动AD转换/WR的低电平保持时间tW(WR)I的最小值为100ns,即/WR拉低后延时大于100ns即可以,具体做法可通过插入NOP指令或者调用delay()延时函数实现,不用太精确,只要估计插入的延时大于100ns即可。
猫虿驢绘燈鮒诛髅貺庑。
2.延时等待转换结束:
依然由图3-6中的上部“FIGURE10A”可知,由拉低/WR信号启动AD采样后,经过1到8个Tclk+INTERNALTc延时后,AD转换结束,因此,启动转换后必须加入一个延时以等待AD采样结束。
锹籁饗迳琐筆襖鸥娅薔。
内部转换时间“INTERNALTc”的时间范围为62~73个始终周期,因此延时等待时间应该至少为8+73=81个时钟周期。
本试验时钟频率约为Fclk=1/1.1R36C15=606KHz,其中R36约为150K,C15约为150pF,因此时钟周期约为Tclk=1/Fclk=1.65us。
所以该步骤至少应延时81*Tclk=133.65us.具体做法可通过调用delay()延时函数实现,不用太精确,只要估计插入的延时大于133.65us即可。
構氽頑黉碩饨荠龈话骛。
3.读取转换结果:
由图3-6的下部“FIGURE10B”可知,采样转换完毕后,再/CS信号为低的前提下,将/RD脚由高电平拉成低电平后,经过tACC的延时即可从DB脚读出有效的采样结果。
輒峄陽檉簖疖網儂號泶。
tACC的典型值和最大值分别为135ns和200ns,因此将/RD引脚拉低后,等待大于200ns后即可从DB读出有效的转换结果。
具体做法可通过调用delay()延时函数实现,不用太精确,只要估计插入的延时大于200ns即可。
尧侧閆繭絳闕绚勵蜆贅。
4.4单片机最小系统电路
单片机最小系统电路包括单片机CPU,复位电路以及晶振电路,具体电路如下图3-7所示:
图3-7
如上图所示与第9引脚相连的即为复位电路,与第18、19引脚相连的为晶振电路。
其中Y1为晶振,频率为11.0592MHZ。
复位电路中的106是大小为10μF的电容,R1为200欧姆的电阻,S1为复位按键。
其中GND接地,第40和31引脚接+5V电压。
识饒鎂錕缢灩筧嚌俨淒。
4.5单片机与模数转换器的引脚连接电路
单片机与模数转换器的引脚连接电路如下图3-8所示:
图3-8
4.6DDS模块
DDS采用串行写入模式,省下了单片机的5个IO口。
4.7液晶1602模块
液晶屏幕光标指针对应的实际位置如下:
采用串口写入模式,省下4个IO口。
back1,back2用来调整背景光,V0用来调整液晶中的文字显示电压,调整文字亮度。
凍鈹鋨劳臘锴痫婦胫籴。
4.8按键设置
采用5个独立按键作为波形设置按键,一个外部中断0的按键,采用跳变沿触发进入设置模式。
P0.0按键加一,P0.1按键减一,P0.2按键液晶光标左移一位,P0.3按键液晶光标右移一位,P0.4按键跳出频率设置,进入幅值设置,再次按下,跳出波形调试,开始产生波形。
恥諤銪灭萦欢煬鞏鹜錦。
4.9整体电路
5、系统程序设计
本设计采用c语言编程。
程序流程图:
开始
液晶与DDS模块初始化,显示此时的幅值与频率设置初值1MHz
按下设置按键
按键控制液晶光标左右移动以及数值加减
跳出频率设置,进入幅值设置,旋钮调整波幅,同时可以在液晶上及时显示设置幅值
按下break键
跳出设置模式,输出设置波形频率与幅值
检测设置按键有无按下
鯊腎鑰诎褳鉀沩懼統庫。
6、测试
6.1测试仪器:
示波器
6.2测试方法:
按键,通过示波器查看波形频率与幅值是否与液晶显示值相吻合。
左加
右减
调幅
Set
Break
按下Set键后进入波形设置模式,分为两个环节,先调整频率,之后按下break键锁住频率,通过旋钮调整幅值,再按下break键锁住幅值,跳出设置,产生波形。
硕癘鄴颃诌攆檸攜驤蔹。
7、结束语
经过几天的辛勤努力,三人合理分工,我们虽然没能实现题目的所有要求,但在调试的过程中,遇到了很多问题,有硬件上的,也有软件上的,但在大家的努力下,最终解决了不少问题。
由于时间紧,任务重,不可能做到尽善尽美,系统还可以进行很多改进。
这次竞赛增强了我们的实践能力和协作精神,而且懂得了联系实际的重要性,这对我们以后的学习和工作大有裨益。
虽然我们遇到了很多困难和障碍,但同时也是困难与希望并存,我们将继续努力争取更大的进步。
阌擻輳嬪諫迁择楨秘騖。
附录:
单片机程序
#include<
reg52.h>
intrins.h>
#include<
math.h>
typedefunsignedcharBYTE;
typedefunsignedintWORD;
typedefbitBOOL;
sbitadd=P0^0;
sbitmiu=P0^1;
sbitleft=P0^2;
sbitright=P0^3;
sbitkeybreak=P0^4;
sbitad9850_w_clk=P2^2;
//P2.2口接ad9850的w_clk脚/PIN7氬嚕躑竄贸恳彈瀘颔澩。
sbitad9850_fq_up=P2^1;
//P2.1口接ad9850的fq_up脚/PIN8釷鹆資贏車贖孙滅獅赘。
sbitad9850_rest=P2^0;
//P2.0口接ad9850的rest脚/PIN12怂阐譜鯪迳導嘯畫長凉。
sbitad9850_bit_data=P2^3;
//P2.3口接ad9850的D7脚/PIN25谚辞調担鈧谄动禪泻類。
sbitint1=P3^3;
//定义管脚功能
sbitcs=P3^0;
//使能端
sbitwr=P3^6;
//写端口
sbitrd=P3^7;
//读端口
sbitrs=P0^7;
//lcd
sbitrw=P0^6;
sbitep=P0^5;
sbitd7=P2^7;
sbitd6=P2^6;
sbitd5=P2^5;
sbitd4=P2^4;
BYTEdis1[]={"
V:
00000000V"
};
BYTEdis2[]={"
F:
01000000Hz"
doublefrequence=1000000;
doublevolt=1.17;
voiddds();
//dds模块输出波形
voidreset_serial();
//dds初始化
voidwr_serial(unsignedcharw0,doublefrequence);
//dds写入频率嘰觐詿缧铴嗫偽純铪锩。
voiddelay2(intm)//延时1us左右
{
unsignedchari,j;
for(i=0;
i<
m;
i++)
for(j=0;
j<
253;
j++);
}
voiddelay(unsignedintt);
//延时很短
voiddelay(unsignedintt)
unsignedintqwe;
for(qwe=t;
qwe>
0;
qwe--);
BOOLlcd_bz()//检测lcd是否忙
BOOLresult;
rs=0;
//读忙信号
rw=1;
ep=1;
_nop_();
result=(BOOL)((P2&
0xf0)&
0x80);
ep=0;
return(result);
lcd_wcmd(BYTEcmd)//向lcd写入设置工作命令
while(lcd_bz());
rw=0;
P2=cmd;
P2=cmd<
<
4;
lcd_pos(BYTEpos)//定位lcd光标(指针)位置
lcd_wcmd(pos|0x80);
lcd_wdat(BYTEdat)//lcd写数据
rs=1;
P2=dat;
dat=dat<
lcd_init()//lcd初始化
lcd_wcmd(0x28);
delay2
(1);
lcd_wcmd(0x0f);
lcd_wcmd(0x06);
lcd_wcmd(0x01);
voiddisplay()//显示初始频率与幅值初值
BYTEi;
lcd_init();
delay2(20);
lcd_pos(0x00);
i=0;
while(dis1[i]!
='
\0'
)
{
lcd_wdat(dis1[i]);
i++;
}
lcd_pos(0x40);
while(dis2[i]!
lcd_wdat(dis2[i]);
voiddisplay1();
//按键调频同时显示
voiddisplay1()
unsignedinti;
longintsum=10000000,freq,h;
freq=(longint)frequence;
for(i=0;
8;
lcd_pos(0x40+i+2);
h=freq/sum;
lcd_wdat('
0'
+h);
freq=freq%(sum);
sum=sum/10;
}
voiddisplay2();
//按键设置模式结束后,液晶显示幅值
voiddisplay2()
longinth,v,sum=1000000;
v=(longint)(volt*1000000);
6;
lcd_pos(0x00+i+4);
h=v/sum;
if(i==0)
{
lcd_pos(0x00+i+5);
lcd_wdat(0x2e);
i++;
}
v=v%(sum);
lcd_pos(0x00+11);
voiddds()//dds总程序
ad9850_w_clk=0;
ad9850_fq_up=0;
ad9850_rest=0;
ad9850_bit_data=0;
reset_serial();
wr_serial(0x00,frequence);
delay2(20);
//P1为8位数据口
//ad9850复位(串口模式)//
voidreset_serial()
//rest信号
ad9850_rest=1;
//w_clk信号
ad9850_w_clk=1;
//fq_up信号
ad9850_fq_up=1;
//向ad9850中写命令与数据(串口)//
voidwr_serial(unsignedcharw0,doublefrequence)//wr_serial(0x00,1000);
//熒绐譏钲鏌觶鷹緇機库。
unsignedchari,w;
longinty;
doublex;
//计算频率的HEX值
x=4294967295/125;
//适合125M晶振这是计算机程序设计里面的一个值,表示无符号整数的十进制最大值。
鶼渍螻偉阅劍鲰腎邏蘞。
//如果是16进制,那么是0xFFFFFFFF。
//如果时钟频率不为180MHZ,修改该处的频率值,单位MHz!
!
frequence=frequence/1000000;
frequence=frequence*x;
y=frequence;
//写w4数据
w=(y>
>
=0);
ad9850_bit_data=(w>
i)&
0x01;
ad9850_w_clk=1;
ad9850_w_clk=0;
//写w3数据
8);
//写w2数据
16);
//写w1数据
24);
//写w0数据
w=w0;
//移入始能
voidkeyboard();
//按键触发中断,进入波形设置模式
voidkeyboard()
unsignedinta=9;
lcd_pos(0x40+a);
while
(1)
if(left==0)
delay2(20);
if(left==0)
{
while(!
left);
if(a!
=2)a--;
elsea=a+7;
lcd_pos(0x40+a);
}
if(right=
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 基于 DDS 单片机 信号发生器 设计