《基于DDS与单片机的信号发生器的设计毕业设计.doc》由会员分享,可在线阅读,更多相关《基于DDS与单片机的信号发生器的设计毕业设计.doc(30页珍藏版)》请在三一办公上搜索。
1、基于DDS与单片机的信号发生器的设计参赛队员: 陈天元杨维龙王伟健选题:信号源的设计和制作(B题)摘 要在信号发生器的设计中,传统的用分立元件或通用数字电路元件设计电子线路的方法设计周期长,花费大,可移植性差。本设计是用直接数字频率合成器(DDS)。与传统的频率合成方法相比,DDS合成信号具有频率切换时间短、频率分辨率高、相位变化连续等诸多优点。使用单片机灵活的控制能力与液晶显示相结合,使得可以直观的控制波形的产生与调整,带来了很大的便利。关键词:单片机,直接数字频率合成,液晶1、现有元件电源模块7805,STC89C52单片机,DDS直接式数字合成频率计,模数转换器ADC0804,1602液
2、晶显示模块,独立按键等。2、设计要求一、任务在给定12V电源电压条件下,设计并制作一个正弦波信号源。二、要求1、基本要求:(1)输出信号频率:20Hz300kHz;(2)信号幅度:负载50时,输出电压峰峰值为13V可调;(3)信号源输出电阻为50;(4)显示信号的频率和幅度。2、发挥部分:(1)提高信号的输出频率至1MHz;(2)提高信号的输出电压峰峰值至110V可调(带50负载);(3)自行扩展信号源功能。3、可以达到的效果本设计可以将输出频率调整到130 MHz,而由于在超高频条件下,一般运放的带宽不足以满足放大波幅的设计要求,但是我们通过负电压增加电流的方式,使得信号输出电压峰峰值为0.
3、7v2.4v可调。本设计可以通过按键进入设置模式,左右按键移动光标,上下按键加减频率,再通过旋钮调节幅值,然后按键结束设置模式,就可以从输出口输出我们在设置模式下给定的波形。4、硬件设计4.1、总体设计通过STC89c52给定DDS频率,短接DDS上J3口,使DDS可以输出稳定频率和幅值的波形,同时通过液晶显示出幅值与频率。通过按键中断进入波形设置模式,可以通过按键增减与移位调整液晶屏上的频率显示,通过调整LM348设置新的幅值,在跳出波形设置模式时,DDS会按照设置好的波形参数产生一个新的波形,用以输出。STC89c52中央处理DDS直接式数字合成频率计AD检测输出峰峰值LM348为波形调相
4、,放大或缩小1602液晶显示频率和幅值按键和旋钮调频调幅给入设置中断4.2、 STC89C52单片机介绍4.2.1 STC89C52是一种低功耗、高性能CMOS8位微控制器,其特性及参数如下:、1、增强型8051单片机,6时钟/机器周期和12时钟/机器周期可以任意选择,指令代码完全兼容传统8051。2、工作电压:5.5V3.3V(5V单片机)/3.8V2.0V(3V单片机),此设计用的是5V的单片机。3、工作频率范围:040MHz,相当于普通8051的080MHz,实际工作频率可达48MHz。4、8K字节程序存储空间。5、片上集成512字节RAM。6.通用I/O口(32个),复位后为:P0/P
5、1/P2/P3是准双向口/弱上拉,P0口是漏极开路输出,作为总线扩展用时,不用加上拉电阻,作为I/O口用时,需加上拉电阻。7、ISP(在系统可编程)/IAP(在应用可编程),无需专用编程器,无需专用仿真器,可通过串口(RxD/P3.0,TxD/P3.1)直接下载用户程序,数秒即可完成一片。8、共3个16位定时器/计数器。即定时器T0、T1、T2。9、具有看门狗功能,PDIP封装。4.2.2 STC89C52各个引脚分布如下图3-3所示:图3-3本设计主要用的是P0口,(P0口连接数码管前要加1千欧的排阻作为上拉电阻)P2.7P2.4口,这12口用于控制数码管;P3.2,P3.3,P3.6,P3
6、.7口与ADC0804相连接用以接受ADC0804转换后的数字信号;引脚9用以单片机的复位电路;P2.0口用以控制蜂鸣器;18,19引脚用以晶振相关的电路;40和31引脚用以连接+5V电压。(注:单片机的核心部分晶振必不可少,并且晶振应该尽量靠近单片机,否则将使得单片机无法正常工作。)4.3 模数转换器ADC0804介绍4.3.1 ADC0804规格及引脚分配图如下图3-4所示:图3-4本设计采用的模数转换器ADC0804,它是CMOS8位单通道逐次渐近型的模数转换器,各个引脚的大致功能如下:1、/CS:芯片片选信号,低电平有效,即/CS=0,该芯片才能正常工作。2、/WR:启动ADC0804
7、进行ADC采样,该信号低电平有效,即/WR信号由高电平变成低电平时,触发一次ADC转换。3、/RD:低电平有效,即/RD=0时,可以通过数据端口DB0DB7读出本次的采样结果。4、UIN(+)和UIN(-):模拟电压输入端,模拟电压输入接UIN(+)端,UIN(-)端接地。5、VREF/2:参考电压接入引脚,该引脚可外接电压也可悬空。6、CLKR和CLKIN:外接RC电路产生模数转换器所需的时钟信号,时钟频率CLK = 1/1.1RC,一般要求频率范围100KHz1.28MHz。7、AGND和DGND:分别接模拟地和数字地。8、/INT:中断请求信号输出引脚,该引脚低电平有效,当一次A/D转换
8、完成后,将引起/INT=0,实际应用时,该引脚应与微处理器的外部中断输入引脚相连(如51单片机的INT0,INT1脚),当产生/INT信号有效时,还需等待/RD=0才能正确读出A/D转换结果,若ADC0804单独使用,则可以将/INT引脚悬空。9、DB0DB7:输出A/D转换后的8位二进制结果。4.3.2 ADC0804的外围电路如下图3-5所示:图3-5如图3-5所示,图中的C4为104的电容,其中104表示的是大小为10乘以10的4次方皮法的电容;R4是大小为十千欧的电容。VccREF接+5V的电压,Vin(-)和A-GND以及D-GND均接地,Vref/2不接任何线路,Vin(+)接输入
9、的模拟电压信号;DB0DB7分别于单片机上的P0.0P0.7引脚相连;INTR、CS、RD和WR分别连接单片机的P3.3、P3.2、P3.7及P3.6引脚相连。4.3.3 ADC0804转换时序图如下图3-6所示:图3-6ADC0804转换主要包含下面三个步骤:1.启动转换:由图3-6中的上部“FIGURE 10A”可知,在/CS信号为低电平的情况下,将/WR引脚先由高电平变成低电平,经过至少tW(WR)I 延时后,再将/WR引脚拉成高电平,即启动了一次AD转换。注:正常启动AD转换/WR的低电平保持时间tW(WR)I的最小值为100ns,即/WR拉低后延时大于100ns即可以,具体做法可通过
10、插入NOP指令或者调用delay()延时函数实现,不用太精确,只要估计插入的延时大于100ns即可。2延时等待转换结束:依然由图3-6中的上部“FIGURE 10A”可知,由拉低/WR信号启动AD采样后,经过1到8个Tclk+INTERNAL Tc延时后,AD转换结束,因此,启动转换后必须加入一个延时以等待AD采样结束。注:内部转换时间“INTERNAL Tc”的时间范围为6273个始终周期,因此延时等待时间应该至少为8+73=81个时钟周期。本试验时钟频率约为Fclk=1/1.1R36C15=606KHz,其中R36约为150K, C15约为150pF,因此时钟周期约为Tclk=1/Fclk
11、=1.65us。所以该步骤至少应延时81*Tclk=133.65us. 具体做法可通过调用delay()延时函数实现,不用太精确,只要估计插入的延时大于133.65us即可。3.读取转换结果:由图3-6的下部“FIGURE 10B”可知,采样转换完毕后,再/CS信号为低的前提下,将/RD脚由高电平拉成低电平后,经过tACC的延时即可从DB脚读出有效的采样结果。注:tACC的典型值和最大值分别为135ns和200ns,因此将/RD引脚拉低后,等待大于200ns后即可从DB读出有效的转换结果。具体做法可通过调用delay()延时函数实现,不用太精确,只要估计插入的延时大于200ns即可。4.4单片
12、机最小系统电路单片机最小系统电路包括单片机CPU,复位电路以及晶振电路,具体电路如下图3-7所示:图3-7如上图所示与第9引脚相连的即为复位电路,与第18、19引脚相连的为晶振电路。其中Y1为晶振,频率为11.0592MHZ。复位电路中的106是大小为10F的电容,R1为200欧姆的电阻,S1为复位按键。其中GND接地,第40和31引脚接+5V电压。4.5单片机与模数转换器的引脚连接电路单片机与模数转换器的引脚连接电路如下图3-8所示:图3-84.6 DDS模块DDS采用串行写入模式,省下了单片机的5个IO口。4.7液晶1602模块液晶屏幕光标指针对应的实际位置如下:采用串口写入模式,省下4个
13、IO口。back1,back2用来调整背景光,V0用来调整液晶中的文字显示电压,调整文字亮度。4.8按键设置采用5个独立按键作为波形设置按键,一个外部中断0的按键,采用跳变沿触发进入设置模式。P0.0按键加一,P0.1按键减一,P0.2按键液晶光标左移一位,P0.3按键液晶光标右移一位,P0.4按键跳出频率设置,进入幅值设置,再次按下,跳出波形调试,开始产生波形。4.9整体电路5、系统程序设计本设计采用c语言编程。程序流程图:开始液晶与DDS模块初始化,显示此时的幅值与频率设置初值1MHz按下设置按键按键控制液晶光标左右移动以及数值加减跳出频率设置,进入幅值设置,旋钮调整波幅,同时可以在液晶上
14、及时显示设置幅值按下break键按下break键跳出设置模式,输出设置波形频率与幅值检测设置按键有无按下6、测试6.1测试仪器:示波器6.2测试方法:按键,通过示波器查看波形频率与幅值是否与液晶显示值相吻合。左 加右 减调幅SetBreak按下Set键后进入波形设置模式,分为两个环节,先调整频率,之后按下break键锁住频率,通过旋钮调整幅值,再按下break键锁住幅值,跳出设置,产生波形。7、结束语经过几天的辛勤努力,三人合理分工,我们虽然没能实现题目的所有要求,但在调试的过程中,遇到了很多问题,有硬件上的,也有软件上的,但在大家的努力下,最终解决了不少问题。由于时间紧,任务重,不可能做到尽
15、善尽美,系统还可以进行很多改进。这次竞赛增强了我们的实践能力和协作精神,而且懂得了联系实际的重要性,这对我们以后的学习和工作大有裨益。虽然我们遇到了很多困难和障碍,但同时也是困难与希望并存,我们将继续努力争取更大的进步。附录:单片机程序# include # include #include typedef unsigned char BYTE;typedef unsigned int WORD;typedef bit BOOL;sbit add=P00;sbit miu=P01;sbit left=P02;sbit right=P03;sbit keybreak=P04;sbit ad985
16、0_w_clk =P22; /P2.2口接ad9850的w_clk脚/PIN7sbit ad9850_fq_up =P21; /P2.1口接ad9850的fq_up脚/PIN8sbit ad9850_rest =P20; /P2.0口接ad9850的rest脚/PIN12sbit ad9850_bit_data =P23; /P2.3口接ad9850的D7脚/PIN25sbit int1=P33;/定义管脚功能 sbit cs=P30;/使能端sbit wr=P36;/写端口sbit rd=P37;/读端口sbit rs=P07; /lcdsbit rw=P06;sbit ep=P05;sbi
17、t d7=P27;sbit d6=P26;sbit d5=P25;sbit d4=P24;BYTE dis1=V:00000000 V ;BYTE dis2=F:01000000 Hz;double frequence=1000000;double volt=1.17;void dds(); /dds模块输出波形void reset_serial();/dds初始化void wr_serial(unsigned char w0,double frequence); /dds写入频率void delay2(int m) /延时1us左右unsigned char i,j;for (i=0;im;
18、i+)for (j=0;j0;qwe-);BOOL lcd_bz() /检测lcd是否忙BOOL result;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 (BYTE cmd) /向lcd写入设置工作命令while (lcd_bz();rs=0;rw=0;ep=0;_nop_();_nop_();P2=cmd;_nop_();_nop_();_no
19、p_();_nop_();ep=1;_nop_();_nop_();_nop_();_nop_();ep=0;rs=0;rw=0;ep=0;_nop_();_nop_();P2=cmd4;_nop_();_nop_();_nop_();_nop_();ep=1;_nop_();_nop_();_nop_();_nop_();ep=0;lcd_pos (BYTE pos) /定位lcd光标(指针)位置lcd_wcmd (pos|0x80);lcd_wdat (BYTE dat) /lcd写数据while (lcd_bz();rs=1;rw=0;ep=0;_nop_();_nop_();P2=da
20、t;_nop_();_nop_();_nop_();_nop_();ep=1;_nop_();_nop_();_nop_();_nop_();ep=0; rs=1;rw=0;ep=0;_nop_();_nop_();dat=dat4;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);lc
21、d_wcmd (0x01);delay2 (1);void display()/显示初始频率与幅值初值BYTE i;lcd_init ();delay2 (20);lcd_pos (0x00);i=0;while (dis1i!=0) lcd_wdat (dis1i); i+; lcd_pos (0x40);i=0;while (dis2i!=0) lcd_wdat (dis2i); i+; void display1(); /按键调频同时显示void display1()unsigned int i;long int sum=10000000,freq,h; freq=(long int)f
22、requence;for(i=0;i8;i+)lcd_pos (0x40+i+2);h=freq/sum; lcd_wdat (0+h);freq=freq%(sum);sum=sum/10;void display2(); /按键设置模式结束后,液晶显示幅值void display2()unsigned int i;long int h,v,sum=1000000;v=(long int)(volt*1000000);for(i=0;i=0);for(i=0;ii)&0x01;ad9850_w_clk=1;ad9850_w_clk=0;/写w3数据w=(y8);for(i=0;ii)&0x0
23、1;ad9850_w_clk=1;ad9850_w_clk=0;/写w2数据w=(y16);for(i=0;ii)&0x01;ad9850_w_clk=1;ad9850_w_clk=0;/写w1数据w=(y24);for(i=0;ii)&0x01;ad9850_w_clk=1;ad9850_w_clk=0;/写w0数据w=w0; for(i=0;ii)&0x01;ad9850_w_clk=1;ad9850_w_clk=0;/移入始能ad9850_fq_up=1;ad9850_fq_up=0;void keyboard(); /按键触发中断,进入波形设置模式void keyboard()unsi
24、gned int a=9;lcd_pos (0x40+a);while(1)if(left=0)delay2(20);if(left=0)while(!left);if(a!=2) a-;else a=a+7;lcd_pos (0x40+a);if(right=0)delay2(20);if(right=0)while(!right);if(a!=9) a+;else a=a-7;lcd_pos (0x40+a);if(add=0)delay2(20);if(add=0)while(!add);lcd_pos (0x40+a);if(dis2a=0x39)dis2a=0x30;lcd_wdat
25、 (dis2a);frequence=frequence-pow(10,(9-a)*9;lcd_pos (0x40+a);elsedis2a=dis2a+1;lcd_wdat (dis2a);frequence=frequence+pow(10,(9-a);lcd_pos (0x40+a); if(miu=0)delay2(20);if(miu=0)while(!miu);lcd_pos (0x40+a);if(dis2a=0x30)dis2a=0x39;lcd_wdat (dis2a);frequence=frequence+pow(10,(9-a)*9;lcd_pos (0x40+a);e
26、lsedis2a=dis2a-1;lcd_wdat (dis2a);frequence=frequence-pow(10,(9-a);lcd_pos (0x40+a); if(keybreak=0)delay2(20);if(keybreak=0)while(!keybreak);break;keybreak=1;lcd_pos (0x40+10);double ad8();/输出ad最终处理结果,信号幅值double convert(unsigned char sixteen);/把ad读数转化为double型unsigned char dushu(void);/从AD读数double ad
27、8() unsigned char output; /从AD读出的8位2二进制 double dianya;output=dushu();dianya=convert(output);dianya=1.08-0.72*dianya;return(dianya);unsigned char dushu( void ) unsigned char q,i; rd=1;wr=1;int1=1;/读ADC0804前准备 P1=0xff;/P1全部置一准备 cs=0;wr=0;wr=1;/启动ADC0804开始测电压 while(int1=1);/等待A/D转换完毕产生INT1(低电平有效)信号 rd=
28、0;/开始读转换后数据 i=i; i=i;q=P1;/读出的数据赋与outputrd=1;cs=1;/读数完毕 return(q);double convert(unsigned char sixteen)unsigned int a;double qq;a=(unsigned int)sixteen;/强制装换char为unsigned intqq=(double)a;qq=qq/256*5;return(qq);void main()int g;EA=1; /总中断EX0=1; /外部中断0IT0=1; /触发方式为下降沿触发display();display1();volt=ad8();display2();dds();while(1)g=1;g=0;void exter0 () interrupt 0EA=0;keyboard();while(1)volt=ad8();display2();if(keybreak=0)delay2(10);if(keybreak=0)while(!keybreak);break;lcd_pos (0x40+11);dds();EA=1; /总中断EX0=1; /外部中断0IT0=1; /触发方式为下降沿触发