资源描述
-摘要本系统是基于STC89C52单片机利用DDS的合成原理的低频信号发生器。采用STC89C52单片机作为控制核心,外围采用数字/模拟转换电路DAC0832、运放电路LM358、按键等构成整个系统。通过按键控制可产生方波、三角波、正弦波、锯齿波并可以微调频率大小。通过上位机可以通过PC可以选择波形和波形的频率。其设计简单、性能优好,频率的精度由DA和系统时钟大小决定,所以很易的实现精度调整,系统的性价比高,可用于多种需要低频信号的场所,具有一定的实用性。关键词:STC89C52 ; DAC0832 ; LM358 ; DDS. z.-目录摘要I关键词I1设计任务与要求12.方案设计与论证12.1系统信号发生的方案设计12.2系统控制芯片的方案设计13硬件系统模块及理论分析23.1总体设计框架23.2最小系统模块电路23.3DAC0832模块电路33.4按键电路34系统软件设计44.1 主流程图54.2软件模拟仿真64.3方波仿真图64.4按键检测原理7总结7参考文献8附件9I 源程序9II 总电路图17III总图PCB18IV元器件清单18. z.-1设计任务与要求 利用单片机组成一个多波信号发生器。 能输出的波形为三角波、 锯齿波、 方波、 正弦波。 输出波形频率 f=1100Hz、。 输出波形频率通过 PC 机设置。2.方案设计与论证2.1系统信号发生的方案设计 方案一、通过专用DDS芯片如AD9850作为信号发生器件,用专用芯片的特点是,产生的信号频率围宽,可以产生很高的频率,频率的精度高。但是价格比拟贵。方案二、通过产生PWM产生方波,通过低通滤波器变为正弦波,在加上其他外围电路可产生三角波、锯齿波、方波、正弦波。可实现题目要求,这种设计价格便,但是外围比拟复杂,频率不好控制。方案三、通过单片机外围加上DA芯片代替专用的DDS芯片,同样应用DDS信号合成原理产生任意想要的信号,这样构造的系统简单,用廉价的DAC0832就可产生满足题目要求的低频信号。结论:通过上述三个方案可以知道,用专用DDS芯片合成性能比拟高,价格贵,用于本设计就大材小用,用PWM价格廉价,但是性能不好,所以属于中间的DA芯片是理想的选择。2.2系统控制芯片的方案设计方案一、选用STM32作为控制芯片,STM32部资源丰富,时钟速度快,是一块性价比极高的芯片,用本系统会使得系统速度提升。尽管性价比高,还是比传统51单片机要贵点,控制指令多,相对于51单片机来说程序要比拟复杂。方案二、选用STC公司的51单片机,STC89C52是对传统51做了增强,但是与传统51是兼容的,所以指令简单易于操作,12MHZ的系统完全满足题目涉及要求。结论:通过上述可以知道,STM32性价比高,性能强大,但是用本系统是大材小用,而STC89C52则完全能满足题目要求而且价格比STM32要廉价,所以本设计选用STC89C52作为控制芯片。3硬件系统模块及理论分析3.1总体设计框架图3.1总体系统框架是由按键、最小系统模块、DAC0832、转串口模块组成,这样就可以实现多函数输出和PC机通信。按键是为了实现波形的切换和频率的大小调节,最小系统是系统的主控制模块,是沟通按键、DAC0832模块、PC机的主控模块,是系统必不可少的模块。转串口模块式为了实现单片机与PC的通信,PC可以通过上位机控制波形的选择和频率大小设置。3.2最小系统模块电路图3.2 图3.2是STC89C52的最小系统图,组成局部有时钟电路和复位电路。实现的功能是控制DAC0832的模拟输出量的大小和输出的频率,以产生方波、三角波、正弦波、锯齿波,并通过与转串口电路的结合以实现与PC机之间的通信。3.3DAC0832模块电路图3.3上图中DAC0832电路的接法是直通型接法,这种接法的最大特点就是只需要对DAC0832的数据口赋值就可以实现电压的输出,所以操作起来非常方便,而DAC0832输出的并不是电压,而是电流所以要在输出端加上一个运放实现电流到电压的转换。选用LM358的原因是它输出端的电压可以到达负电压,这样就可以实现单电源供电了。3.4按键电路图3.4 按键是通过单片机的P0口进展监控,当单片机检查到有按键按下时,单片机就会根据按键对DA输出进展相应的改变,这样就可以实现按键对输出波形的切换和频率的调节。3.5转串口电路图3.5 转串口用的芯片是CH340,CH340产家提供有两种接法,一种是可以把PC机串口的电平转变为USB电平,另外一种可以直接把单片机的电平转换为USB电平,本设计选用的是第二种接法,因为这样接就可以省去了MA*232把单片机电平转换外PC机电平,这样设计电路变得更加可靠稳定了,同时也可以节省本钱,同样本电路也是需要时钟电路让CH340能正常工作。4系统软件设计系统软件由主程序和产生波形的子程序组成,软件设计主要是产生各种波形的子程序的编程,通过编程可得到各种波形。周期的改变可采用插入延时子程序的方法来实现。主程序和几种常用波形子程序的流程图如下图。4.1 主流程图图4.1由图4.1可以简单的知道,程序的大概思路是,判断按键与上位机是否发送数据来觉得DA的输出量,初始化的时候程序是写输出频率为200HZ的方波信号。4.2软件模拟仿真图4.2 锯齿波仿真锯齿波产生是通过P2口将00H送入存放器A中,DAC0832输出A中的容,读取P2口的状态,取反后作为延时常数,当A中的容不为0FFH时,A中的容加1,当A中的容等于FFH返回开场,从而输出波形。锯齿波程序void juchibo(void)for(num=0;num256;num+) cs=0;DAC0832=num;cs=1;while(a=0);a=0; 4.3方波仿真图图4.3方波仿真方波产生是通过P2口将00H输出给DAC0808,输出对应模拟量,然后读取P2口的状态,取反后作为定时器延时,延时时间到,将FFH输出时,同样输出对应模拟量,再延时,从而得到方波。方波程序如下:void fangbo(void) for(num=0;num0;num-)cs=0;DAC0832=0*00;cs=1;while(a=0);a=0;4.4按键检测原理void changbo(void) if(P32=0); delay(20); if(P32=0) flag+; if(flag=4) flag=0; 总结通过设计简易的函数发生器,我学会了自己查资料,通过大量的资料结合,最终决定了现在所选用的方案,接下来就是运用之前学习过的Protel99se画板技术,成功的画出了电路图。接着是电路的调试,这一个步骤是最难的,当然遇到的挫折也是最多的,例如开场的时候没有对DAC0832深入了解造成了,电路设计没错就是不能正常工作,最后慢慢的调节,发现原来是自己所选用的参考电压出问题,本来应该选用负电压作为参考电压,按照手册提供的经典电路才能得到一个正电压,但是由于没注意到这点所以画了很多的时间。能够把电路正常的调处来还要感同学对我的帮助,因为他们做过这样给我更加大的信心。调完了电路后接下来的是进展写程序,开场调式程序的时候有点乱,因为没有画完流程图在调,所以思路会比拟混乱。不过后来通过参照网上的程序,终于实现了题目所要的功能。参考文献1 周明德.微型计算机系统原理及应用M.:清华大学,2002.341364.2 乐善.微型计算机接口技术及应用M.:航空航天大学,2001.258264.3 童诗白.模拟电路技术根底M.:高等教育,2000.171202.4 杜华.任意波形发生器及应用J.国外电子测量技术,2005.1:3840.5 友德.单片微型机原理、应用与实践M.:复旦大学,2004.4044. 6 程朗.基于8051单片机的双通道波形发生器的设计与实现J.计算机工程与应用,2004.8:100103.7 永瑞.电子测量技术根底M.:电子科技大学,2006.61101.8 叶紫. MCS-51单片机应用教程M.:清华大学,2004.232238.附件I 源程序/*时间:2013年6月23日15:33:43硬件条件:stc89c52rc单片机上工程:函数发生器 龙腾跃准备知识:通过DAC0832实现信号的发生,DAC0832选用的是直通型输出方式修改:*/#include #includeDelay_time.h#includeUart.h#include/#includebo*ing.hsbit CS = P37;sbit up = P00;sbit down = P01;bit flag=0,flag1=0,flag2=1,flag3=0,flag5=0,flag6=1,cont=1;unsigned int num4=170,num3=188,num2=0,num1=0;unsigned char mark=0;unsigned char k=1;unsigned char N=0*00;unsigned int tmp;unsigned char i=0;unsigned int t=2;unsigned char table4;void Triangle(); /输出三角波void Square();/方波void sin(); /正弦波void Sawtooth(); /锯齿波 void change();unsigned char code sin_tab = /正弦波输出表 0*80,0*83,0*86,0*89,0*8D,0*90,0*93,0*96,0*99,0*9C,0*9F,0*A2,0*A5,0*A8,0*AB,0*AE, 0*B1,0*B4,0*B7,0*BA,0*BC,0*BF,0*C2,0*C5,0*C7,0*CA,0*CC,0*CF,0*D1,0*D4,0*D6,0*D8, 0*DA,0*DD,0*DF,0*E1,0*E3,0*E5,0*E7,0*E9,0*EA,0*EC,0*EE,0*EF,0*F1,0*F2,0*F4,0*F5, 0*F6,0*F7,0*F8,0*F9,0*FA,0*FB,0*FC,0*FD,0*FD,0*FE,0*FF,0*FF,0*FF,0*FF,0*FF,0*FF, 0*FF,0*FF,0*FF,0*FF,0*FF,0*FF,0*FE,0*FD,0*FD,0*FC,0*FB,0*FA,0*F9,0*F8,0*F7,0*F6, 0*F5,0*F4,0*F2,0*F1,0*EF,0*EE,0*EC,0*EA,0*E9,0*E7,0*E5,0*E3,0*E1,0*DF,0*DD,0*DA, 0*D8,0*D6,0*D4,0*D1,0*CF,0*CC,0*CA,0*C7,0*C5,0*C2,0*BF,0*BC,0*BA,0*B7,0*B4,0*B1, 0*AE,0*AB,0*A8,0*A5,0*A2,0*9F,0*9C,0*99,0*96,0*93,0*90,0*8D,0*89,0*86,0*83,0*80, 0*80,0*7C,0*79,0*76,0*72,0*6F,0*6C,0*69,0*66,0*63,0*60,0*5D,0*5A,0*57,0*55,0*51, 0*4E,0*4C,0*48,0*45,0*43,0*40,0*3D,0*3A,0*38,0*35,0*33,0*30,0*2E,0*2B,0*29,0*27, 0*25,0*22,0*20,0*1E,0*1C,0*1A,0*18,0*16,0*15,0*13,0*11,0*10,0*0E,0*0D,0*0B,0*0A,0*09,0*08,0*07,0*06,0*05,0*04,0*03,0*02,0*02,0*01,0*00,0*00,0*00,0*00,0*00,0*00, 0*00,0*00,0*00,0*00,0*00,0*00,0*01,0*02,0*02,0*03,0*04,0*05,0*06,0*07,0*08,0*09, 0*0A,0*0B,0*0D,0*0E,0*10,0*11,0*13,0*15,0*16,0*18,0*1A,0*1C,0*1E,0*20,0*22,0*25,0*27,0*29,0*2B,0*2E,0*30,0*33,0*35,0*38,0*3A,0*3D,0*40,0*43,0*45,0*48,0*4C,0*4E,0*51,0*55,0*57,0*5A,0*5D,0*60,0*63,0*66,0*69,0*6C,0*6F,0*72,0*76,0*79,0*7C,0*7E;void main()Uart_init();Delaynms(1000);send_string(作者:龙腾跃 );Delaynms(10);Enter();send_string(作品:简易信号发);Delaynms(10);send_string(生器);Enter();send_string(初始波形为200HZ);Delaynms(10);send_string(方波);CS=0;up=1;down=1;while(1) if(flag) Triangle(); if(flag1) Sawtooth(); if(flag2) Square(); if(flag3) sin(); change(); if(flag5&flag6) if(mark=4&cont) num4=170-t;flag=0;flag1=0;flag2=0;flag3=1;send_data(num4);if(mark=3&cont) num3=(200.0/t)*188;flag=0;flag1=0;flag2=1;flag3=0;send_string(频率:); send_data(t); send_string(HZ);if(mark=2&cont) num2=t;flag=0;flag1=1;flag2=0;flag3=0; send_data(num2); if(mark=1&cont) num1=5-t/10; flag=1;flag1=0;flag2=0;flag3=0; send_data(t);flag5=0; void Uart(void) interrupt 4 using 1/串口中断子函数if(1=RI) /必须进展判断才可以实现中断的对应响应RI = 0;tablei=SBUF;i+;if(i=4) t=(table2-48)*100+(table3-48)*10+(table0-48);mark=table1-48;flag5=1;TR0=0;i=0;flag6=flag6;cont=1;/* 输出三角波*/void Triangle() unsigned char l;unsigned int j; for(l=0;l255;l=l+k) P2=l;while(j1;l=l-k) while(jnum1)j+;j=0;P2=l; /* 输出方波函数*/void Square()unsigned int j=0; N=N; P2=N; while(jnum3)j+;j=0;/* 输出正弦波函数*/void sin() unsigned int i,j=0; for(i=0; i256; i+,j=0) while(jnum4)j+; P2=sin_tabi; /* 输出锯齿波函数*/void Sawtooth() unsigned char l; unsigned int j=0; for(l=0;l255;l+) while(jnum2)j+; P2=l; /data byte /* 调整函数*/void change()if(!up)Delaynms(15);if(!up) k+ ;while(!up);if(k=2)flag=0;flag1=1;flag2=0;flag3=0;if(k=3)flag=0;flag1=0;flag2=1;flag3=0;if(k=4)flag=0;flag1=0;flag2=0;flag3=1;if(k=5) flag=1;flag1=0;flag2=0;flag3=0;k=1; if(!down)Delaynms(15);if(!down)if(mark=4)num4=num4-10;if(mark=3) num3=num3+10; send_data(num3);if(mark=2) num2=num2+10;if(mark=1) num1=num1+10;cont=0;while(!down);II 总电路图III总图PCBIV元器件清单电解电容 10uf1个瓷片电容 30pf2个电阻 10K1个晶振12MHz1个按钮开关2个LM324集成块1块DAC08321块AT89S521块DIP-40封装插座1个DIP-20封装插座2个导线假设干星轨. z.
展开阅读全文