工程训练课程设计报告设计课题:信号发生器的设计姓名:班级:设计时间:基于51单片机的多功能信号发生器设计摘要:本系统利用单片机AT89S52采用程序设计方法产生正弦波、脉冲波两种波形,再通过D/A转换器DAC0832将数字信号转换成模拟信号,滤波放大,最终由示波器显示出来,能产1Hz—5kHz的波形。通过键盘来控制两种波形的类型选择、频率变化,幅度变化,并通过数码管显示其各自的类型以及数值,系统大致包括信号发生部分、数/模转换部分以及数码管显示部分三部分,其中尤其对数/模转换部分和波形产生和变化部分进行详细论述。关键词:单片机AT89S52、DAC0832Abstract:thissystemcapitalizeonAT89s52,itmakesuseofcentralprocessortogeneratethreekindsofwaves,theyaretrianglewave,anduseD/Aconversionmodule,wavegeneratemodule,itcanhavethe1Hz-5KHzprofile.Inthissystemitcancontrolwaveformchoosing,frequency,range,canhavethesinewave,thesquare-wave,thetriangularwave.Simultaneouslymayalsotakethefrequencymeasurementfrequency,anddisplaysthemthroughliquidcrystaldisplayof1602.thisdesignincludesthreemodules.TheyareD/Aconversionmodule,wavegeneratemoduleandliquidcrystaldisplayofLEDmodule.Inthisdesign,thewavegeneratorintowaveformmoduleandD/Aconversionmodulearediscussedindetail.keyword:AT89S52,DAC0832.目录1.1设计要求1.2方案设计与论证1.2.1信号发生电路方案论证1.2.2单片机的选择论证1.2.3显示方案论证1.2.4幅度控制论证1.3总体系统设计1.4硬件实现及单元电路设计1.4.1单片机最小系统的设计1.4.2数模转换模块设计1.4.3显示模块的设计1.5软件设计流程1.6源程序1.7.输出波形的种类与频率的测试1.8附录1.81参考文献1.82总体设计图1、系统设计经过考虑,我确定方案如下:利用AT89S52单片机采用程序设计方法产生正弦波、脉冲波两种波形,再通过D/A转换器DAC0832将数字信号转换成模拟信号,滤波放大,最终由示波器显示出来,通过另一块DAC0832控制幅度的调节,通过键盘来控制两种波形的类型选择、频率变化,幅度变化,最终输出显示其各自的类型以及数值。1.1、设计要求1、基本要求(1)正弦波信号源①信号频率:kHzHz20~20步进调整,步长为Hz5;②频率稳定度:优于410;③非线性失真系数%3。(2)脉冲波信号源①信号频率:kHzHz20~20步进调整,步长为Hz5;②上升时间和下降时间:s1;③平顶斜降:%5;④脉冲占空比:%98~%2步进调整,步长为%2。(3)上述两个信号源公共要求①信号频率可预置;②在负载为600时,输出幅度为V3;③完成5位频率的数字显示。2、发挥部分(1)正弦波和脉冲波频率步长改为Hz1;(2)正弦波和脉冲波幅度可步进调整,调整范围为VmV3~100,步长为mV100;(3)正弦波和脉冲波频率可自动步进,步长为Hz1;(4)降低正弦波非线性失真系数。1.2方案设计与论证1.2.1信号发生电路方案论证方案一:通过单片机控制D/A,输出三种波形。此方案输出的波形不够稳定,抗干扰能力弱,不易调节。但此方案电路简单、成本低。方案二:使用传统的锁相频率合成方法。通过芯片IC145152,压控振荡器搭接的锁相环电路输出稳定性极好的正弦波,再利用过零比较器转换成方波,积分电路转换成三角波。此方案,电路复杂,干扰因素多,不易实现。方案三:利用MAX038芯片组成的电路输出波形。MAX038是精密高频波形产生电路,能够产生准确的三角波、方波和正弦波三种周期性波形。但此方案成本高,程序复杂度高。以上三种方案综合考虑,选择方案一。1.2.2单片机的选择论证方案一:AT89S52单片机是一种高性能8位单片微型计算机。它把构成计算机的中央处理器CPU、存储器、寄存器、I/O接口制作在一块集成电路芯片中,从而构成较为完整的计算机、而且其价格便宜。方案二:C8051F005单片机是完全集成的混合信号系统级芯片,具有与8051兼容的微控制器内核,与MCS-51指令集完全兼容。除了具有标准8052的数字外设部件,片内还集成了数据采集和控制系统中常用的模拟部件和其他数字外设及功能部件,而且执行速度快。但其价格较贵以上两种方案综合考虑,选择方案一1.2.3显示方案论证方案一:采用LED数码管。LED数码管由8个发光二极管组成,每只数码管轮流显示各自的字符。由于人眼具有视觉暂留特性,当每只数码管显示的时间间隔小于1/16s时人眼感觉不到闪动,看到的是每只数码管常亮。使用数码管显示编程较易,占用时间较短。方案二:采用LCD液晶显示器1602。其功率小,效果明显,显示编程容易控制,可以显示字母,但使用液晶显示,需要较长时间的软件延迟,影响产生波形的频率。以上两种方案综合考虑,选择方案一。1.2.4幅度控制方案论证:方案一:可以将送给DA的数字量乘以一个系数,这样就可以改变DA输出电流的幅度,从而改变输出电压;但是这样做有很严重的问题,单片机在做乘法运算时需要很长的时间,这样的话输出波形的频率就会很低,达不到至少500HZ的要求;并且该方案的输出电压做不到连续可调,当DA的输入数字量比较小时,输出的波形失真就会比较严重。方案二:将输出电压通过一个运算放大器的放大。这样还有个优点是幅度连续可调。方案三:用另外一片DA控制波形输出DA的参考电压值,以实现幅度控制。经比较,方案三既可满足课程设计的基本要求,并且电路也挺简单1.3总体系统设计该系统采用单片机作为数据处理及控制核心,由单片机完成人机界面、系统控制、信号的采集分析以及信号的处理和变换,采用按键输入,利用液晶显示电路输出数字显示的方案。将设计任务分解为按键电路、液晶显示电路等模块。图(1)为系统的总体框图图(1)总体方框图主控芯片D/A转换滤波放大输出按键控制显示模块幅度控制1.4硬件实现及单元电路设计1.4.1单片机最小系统的设计89C51是片内有ROM/EPROM的单片机,因此,这种芯片构成的最小系统简单﹑可靠。用80C51单片机构成最小应用系统时,只要将单片机接上时钟电路和复位电路即可,如图(2)89C51单片机最小系统所示。由于集成度的限制,最小应用系统只能用作一些小型的控制单元。其应用特点:(1)有可供用户使用的大量I/O口线。(2)内部存储器容量有限。(3)应用系统开发具有特殊性。图(2)89C51单片机最小系统1.4.2波形产生模块设计由单片机采用编程方法产生三种波形、通过DA转换模块DAC0832在进过滤波放大之后输出。其电路图如下:图(3)数模转换模块如上图所示,单片机的P0口连接DAC0832的八位数据输入端,DAC0832的输出端接放大器,经过放大后输出所要的波形。DAC0832的为八位数据并行输入的,其结构图如下:图(4)DAC0832的内部结构1.4.3显示模块的设计图(5)数码管显示模块1.4.4幅度控制模块及滤波模块设计图(6)幅度控制模块图(6)滤波模块模块1.5软件设计流程本系统采用AT89S52单片机,用编程的方法来产生三种波形,并通过编程来切换三种波形以及波形频率的改变。具体功能有:(1)各个波形的切换;(2)各种参数的设定;(3)频率增减等。软件调通后,通过编程器下载到AT89S52芯片中,然后插到系统中即可独立完成所有的控制。1.6源程序#includereg52.h#includeabsacc.h#includeintrins.hsbitk1=P3^0;sbitk2=P3^1;sbitk3=P3^3;sbitk4=P3^4;sbitk5=P3^5;sbitk6=P3^7;bitled=1;//sbitRS=P3^4;//sbitRW=P3^5;//sbitE=P3^7;/*sbitLED0=P3^0;sbitLED1=P3^1;sbitLED2=P3^3;sbitLED3=P3^4;sbitLED4=P3^5;sbitLED5=P3^7;*/unsignedchari=0,k,f=14,g=255,n=0,m=0;unsignedintj=200,num=800,num1;unsignedcharcodesin[16]={135,176,218,245,254,243,213,170,121,72,24,3,2,20,55,102};unsignedcharcodemai[2]={255,0};unsignedcharcodedu[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e};unsignedcharcodewe[]={0x01,0x02,0x04,0x08,0x10,0x20};init(){EA=1;EX0=1;IT0=1;EA=1;ET0=1;TMOD=0x01;TH0=(65536-1)/256;TL0=(65536-1)%256;TR0=1;}main(){init();XBYTE[0xbfff]=255;while(1){//num=16+j*16;if(k5==0&&g0){g--;XBYTE[0xbfff]=g;}if(k6==0&&g255){g++;XBYTE[0xbfff]=g;}if(k1==0&&j65535){j+=30;}if(k2==0&&j0){j-=30;}if(led==1){XBYTE[0x7fff]=sin[0];for(i=0;ij;i++);XBYTE[0x7fff]=sin[1];for(i=0;ij;i++);XBYTE[0x7fff]=sin[2];for(i=0;ij;i++);XBYTE[0x7fff]=sin[3];for(i=0;ij;i++);XBYTE[0x7fff]=sin[4];for(i=0;ij;i++);XBYTE[0x7fff]=sin[5];for(i=0;ij;i++);XBYTE[0x7fff]=sin[6];for(i=0;ij;i++);XBYTE[0x7fff]=sin[7];for(i=0;ij;i++);XBYTE[0x7fff]=sin[8];for(i=0;ij;i++);XBYTE[0x7fff]=sin[9];for(i=0;ij;i++);XBYTE[0x7fff]=sin[10];for(i=0;ij;i++);XBYTE[0x7fff]=sin[11];for(i=0;ij;i++);XBYTE[0x7fff]=sin[12];for(i=0;ij;i++);XBYTE[0x7fff]=sin[13];for(i=0;ij;i++);XBYTE[0x7fff]=sin[14];for(i=0;ij;i++);XBYTE[0x7fff]=sin[15];for(i=0;ij;i++);}if(led==0){if(k4==0&&f14){f++;}if(k3==0&&f0){f--;}for(k=0;kf;k++){XBYTE[0x7fff]=mai[0];for(i=0;ij;i++);}for(k=0;k(1