基于DDS与单片机的信号发生器的设计毕业设计 精品.docx
- 文档编号:24546475
- 上传时间:2023-05-28
- 格式:DOCX
- 页数:36
- 大小:1.81MB
基于DDS与单片机的信号发生器的设计毕业设计 精品.docx
《基于DDS与单片机的信号发生器的设计毕业设计 精品.docx》由会员分享,可在线阅读,更多相关《基于DDS与单片机的信号发生器的设计毕业设计 精品.docx(36页珍藏版)》请在冰豆网上搜索。
基于DDS与单片机的信号发生器的设计毕业设计精品
基于DDS与单片机的信号发生器的设计
参赛队员:
陈天元
杨维龙
王伟健
选题:
信号源的设计和制作(B题)
摘要
在信号发生器的设计中,传统的用分立元件或通用数字电路元件设计电子线路的方法设计周期长,花费大,可移植性差。
本设计是用直接数字频率合成器(DDS)。
与传统的频率合成方法相比,DDS合成信号具有频率切换时间短、频率分辨率高、相位变化连续等诸多优点。
使用单片机灵活的控制能力与液晶显示相结合,使得可以直观的控制波形的产生与调整,带来了很大的便利。
关键词:
单片机,直接数字频率合成,液晶
1、现有元件
电源模块7805,STC89C52单片机,DDS直接式数字合成频率计,模数转换器ADC0804,1602液晶显示模块,独立按键等。
2、设计要求
一、任务
在给定±12V电源电压条件下,设计并制作一个正弦波信号源。
二、要求
1、基本要求:
(1)输出信号频率:
20Hz~300kHz;
(2)信号幅度:
负载50Ω时,输出电压峰峰值为1~3V可调;
(3)信号源输出电阻为50Ω;
(4)显示信号的频率和幅度。
2、发挥部分:
(1)提高信号的输出频率至1MHz;
(2)提高信号的输出电压峰峰值至1~10V可调(带50Ω负载);
(3)自行扩展信号源功能。
3、可以达到的效果
本设计可以将输出频率调整到1~30MHz,而由于在超高频条件下,一般运放的带宽不足以满足放大波幅的设计要求,但是我们通过负电压增加电流的方式,使得信号输出电压峰峰值为0.7v~2.4v可调。
本设计可以通过按键进入设置模式,左右按键移动光标,上下按键加减频率,再通过旋钮调节幅值,然后按键结束设置模式,就可以从输出口输出我们在设置模式下给定的波形。
4、硬件设计
4.1、总体设计
通过STC89c52给定DDS频率,短接DDS上J3口,使DDS可以输出稳定频率和幅值的波形,同时通过液晶显示出幅值与频率。
通过按键中断进入波形设置模式,可以通过按键增减与移位调整液晶屏上的频率显示,通过调整LM348设置新的幅值,在跳出波形设置模式时,DDS会按照设置好的波形参数产生一个新的波形,用以输出。
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语言编程。
程序流程图:
6、测试
6.1测试仪器:
示波器
6.2测试方法:
按键,通过示波器查看波形频率与幅值是否与液晶显示值相吻合。
左加
右减
调幅
Set
Break
按下Set键后进入波形设置模式,分为两个环节,先调整频率,之后按下break键锁住频率,通过旋钮调整幅值,再按下break键锁住幅值,跳出设置,产生波形。
7、结束语
经过几天的辛勤努力,三人合理分工,我们虽然没能实现题目的所有要求,但在调试的过程中,遇到了很多问题,有硬件上的,也有软件上的,但在大家的努力下,最终解决了不少问题。
由于时间紧,任务重,不可能做到尽善尽美,系统还可以进行很多改进。
这次竞赛增强了我们的实践能力和协作精神,而且懂得了联系实际的重要性,这对我们以后的学习和工作大有裨益。
虽然我们遇到了很多困难和障碍,但同时也是困难与希望并存,我们将继续努力争取更大的进步。
附录:
单片机程序
#include
#include
#include
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 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_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); result=(BOOL)((P2&0xf0)&0x80); ep=0; return(result); } lcd_wcmd(BYTEcmd)//向lcd写入设置工作命令 { while(lcd_bz()); rs=0; rw=0; ep=0; _nop_(); _nop_(); P2=cmd; _nop_(); _nop_(); _nop_(); _nop_(); ep=1; _nop_(); _nop_(); _nop_(); _nop_(); ep=0; rs=0; rw=0; ep=0; _nop_(); _nop_(); P2=cmd<<4; _nop_(); _nop_(); _nop_(); _nop_(); ep=1; _nop_(); _nop_(); _nop_(); _nop_(); ep=0; } lcd_pos(BYTEpos)//定位lcd光标(指针)位置 { lcd_wcmd(pos|0x80); } lcd_wdat(BYTEdat)//lcd写数据 { while(lcd_bz()); rs=1; rw=0; ep=0; _nop_(); _nop_(); P2=dat; _nop_(); _nop_(); _nop_(); _nop_(); ep=1; _nop_(); _nop_(); _nop_(); _nop_(); ep=0; rs=1; rw=0; ep=0; _nop_(); _nop_(); dat=dat<<4; P2=dat; _nop_(); _nop_(); _nop_(); _nop_(); ep=1; _nop_(); _nop_(); _nop_(); _nop_(); ep=0; } lcd_init()//lcd初始化 { lcd_wcmd(0x28); delay2 (1); lcd_wcmd(0x0f); delay2 (1); lcd_wcmd(0x06); delay2 (1); lcd_wcmd(0x01); delay2 (1); } voiddisplay()//显示初始频率与幅值初值 { BYTEi; lcd_init(); delay2(20); lcd_pos(0x00); i=0; while(dis1[i]! ='\0') { lcd_wdat(dis1[i]); i++; } lcd_pos(0x40); i=0; while(dis2[i]! ='\0') { lcd_wdat(dis2[i]); i++; } } voiddisplay1();//按键调频同时显示 voiddisplay1() { unsignedinti; longintsum=10000000,freq,h; freq=(longint)frequence; for(i=0;i<8;i++) { lcd_pos(0x40+i+2); h=freq/sum; lcd_wdat('0'+h); freq=freq%(sum); sum=sum/10; } } voiddisplay2();//按键设置模式结束后,液晶显示幅值 voiddisplay2() { unsignedinti; longinth,v,sum=1000000; v=(longint)(volt*1000000); for(i=0;i<6;i++) { lcd_pos(0x00+i+4); h=v/sum; lcd_wdat('0'+h); if(i==0) { lcd_pos(0x00+i+5); lcd_wdat(0x2e); i++; } v=v%(sum); sum=sum/10; } 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() { ad9850_w_clk=0; ad9850_fq_up=0; //rest信号 ad9850_rest=0; ad9850_rest=1; ad9850_rest=0; //w_clk信号 ad9850_w_clk=0; ad9850_w_clk=1; ad9850_w_clk=0; //fq_up信号 ad9850_fq_up=0; ad9850_fq_up=1; ad9850_fq_up=0; } //向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); for(i=0;i<8;i++) { ad9850_bit_data=(w>>i)&0x01; ad9850_w_clk=1; ad9850_w_clk=0; } //写w3数据 w=(y>>8); for(i=0;i<8;i++) { ad9850_bit_data=(w>>i)&0x01; ad9850_w_clk=1; ad9850_w_clk=0; } //写w2数据 w=(y>>16); for(i=0;i<8;i++) { ad9850_bit_data=(w>>i)&0x01; ad9850_w_clk=1; ad9850_w_clk=0; } //写w1数据 w=(y>>24); for(i=0;i<8;i++) { ad9850_bit_data=(w>>i)&0x01; ad9850_w_clk=1; ad9850_w_clk=0; } //写w0数据 w=w0; for(i=0;i<8;i++) { ad9850_bit_data=(w>>i)&0x01; ad9850_w_clk=1; ad9850_w_clk=0; } //移入始能 ad9850_fq_up=1; ad9850_fq_up=0; } 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==0) { delay2(20); if(right==0) { while(! right); if(a! =9)a++; elsea=a-7; lcd_pos(0x40+a); } } if(add==0) { delay2(20); if(add==0) { while(! add); lcd_pos(0x40+a); if(dis2[a]==0x39) { dis2[a]=0x30; lcd_wdat(dis2[a]); frequence=frequence-pow(10,(9-a))*9; lcd_pos(0x40+a); } else { dis2[a]=dis2[a]+1; lcd_wdat(dis2[a]); frequence=frequence+pow(10,(9-a)); lcd_pos(0x40+a); } } } if(miu==0) { delay2(20); if(miu==0) { while(! miu); lcd_pos(0x40+a);
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 基于DDS与单片机的信号发生器的设计毕业设计 精品 基于 DDS 单片机 信号发生器 设计 毕业设计