1、程控赋值函数发生器程控幅值函数发生器摘 要 本设计核心任务是:以89S52为核心,结合DAC0832实现程序控制产生正弦波、三角波、方波和锯齿波四种常用低频信号。可以通过键盘选择波型和输入波形幅值。另外,采用KEIL,以达到验证作品功能的目的,并且做出一块电路板。关键词:信号发生器;89S52;KEIL 目录第一章 设计的任务和要求 41.1设计的基本要求 41.2课题具体的工作内容 4第2章系统总体设计 52.1主要功能系统的性能指标 52.2总体方案设计 5第3章系统硬件设计 63.1 ADC0832与单片机的链接 63.2键盘控制器zlg7289与单片机的连接 73.3 波形输出部分装置
2、 8第4章系统软件设计 84.1信号频率数据采集程序 84.1.1正弦波产生 84.1.2三角波产生 94.1.3方波产生 104.1.4锯齿波的产生 114.2 zlg7289相关程序设计 124.3波形切换程序 134.4系统总的流程图 14第5章 函数发生器的调试与测试 145.1 键值的测试 145.2 影响上限频率的因素和已完成的最大值分析 16六 问题与改进 171.实验中遇到的问题 172.建议与改进 17附录(源程序) 18 第一章 设计的任务和要求1.1设计的基本要求(1)原始数据1正弦波的频率范围:下限频率为0.1Hz,上限频率暂时不确定,但应尽量提高,并在实验报告中分析影
3、响上限频率的因素和已完成的最大值。2输出正弦波中不能含有尖峰干扰。3输出正弦波峰峰值最大为5 V、最小幅度自定,直流偏移为2V。5扩展输出波形种类,如三角波、方波等,幅度和频率范围自定。 (3)工作要求:1组建基于单片机的函数发生器的总体结构框图;2根据设计测量范围和准确度要求,通过理论分析和计算选择电路参数;3根据操作功能要求,确定键盘控制功能;4按设计要求确定显示位数、指示类型和单位;5采用C语言编写应用程序并调试通过;6对系统进行测试和结果分析; 7撰写论文。1.2课题具体的工作内容本设计采用89S52及其外围扩展系统,软件方面主要是应用C语言设计程序。系统以89S52单片机为核心,配置
4、相应的外设及接口电路,用C语言开发,组成一个多功能信号发生系统。该系统的软件可运行于Windows XP环境下,硬件电路设计具有典型性。同时,本系统中任何一部分电路模块均可移植于实用开发系统的设计中,电路设计具有实用性。本设计将完成以下几个方面的工作:(1)选芯片,尽量满足一般工业控制要求、以增强其实用性。(2)原理图设计在保证正确的前提下,尽量采用典型的电路设计。(3)印制板设计既要精巧,又要便于摆放及测试。(4)固化于单片机芯片中的软件采用模块设计,层次清楚,具有上电复位及初始化功能,具有很好的软件开发框架。(5)掌握单片机仿真软件keil3的使用。第2章系统总体设计2.1主要功能系统的性
5、能指标主要功能是实现利用单片机AT89C52和8位D/A转换芯片DAC0832共同实现正弦波,方波,三角波,锯齿波这四种常见波形的发生,并且可以接收外接键盘输入而在一定范围内改变频率。可以在没有波形发生器的情况下仍然可以的到简单的正弦波,方波,三角波,锯齿波这四种常用的波,并且可以通过zlg7289及键盘显示模块,键盘可以实现对几种波形的切换,改变幅度,LED显示波的幅度。主要性能指标正弦波的频率范围:下限频率为0.1Hz,上限频率暂时不确定,但应尽量提高,并在实验报告中分析影响上限频率的因素和已完成的最大值;输出正弦波中不能含有尖峰干扰;输出正弦波峰峰值最大为5 V、最小幅度自定,直流偏移为
6、2V。2.2总体方案设计系统总体框图设计本系统是以单片机AT89C52和8位D/A转换芯片DAC0832以及zlg7289键盘及显示共同实现正弦波,方波,三角波,锯齿波这四种常见波形的产生及显示相互切换的功能。第3章系统硬件设计3.1 ADC0832与单片机的链接本设计采用的时使用2片DAC0832.由其中一片的输出电压作为另一片的参考电压,这样就可以方便的控制最大输出电压。两个ADC0832的连接方式如图3-11 图 3-11具体的对于本设计是把DAC0832(1)的输出作为了ADCO832(2)的参考电压,于是输出信号的峰峰值可由DAC0832(2)的所连接的运放的输出控制。由于DAC08
7、32存在的非线性,输出信号的幅值存在一定的误差。在程序设计时,我们已经知道两片DAC0832的地址分别07fffH和0bfffH,因而欲给其赋值,我们只需要选定其地址,然后将所需要的数值传到即可。3.2键盘控制器zlg7289与单片机的连接本设计的7289键盘及显示模块链接如图3-67289的CS,CLK,DIO,KEY 端分别和单片机的P1.0,P1.1,P1.2,P1.3相连,通过程序达到由单片机从7289读入信息和控制的目的 3.3 波形输出部分装置、通过DAC0832的输出控制左边的放大器的输出电压,同时左边这片放大器的输出电压接到另一片DAC0832的VREF端作为另一片DAC083
8、2的参考电压,这样,当我们通过改变第一片DAC0832的输出的时候,我们就可以改变由第二片输出的函数的幅值,从而达到我们的目的第4章系统软件设计4.1信号频率数据采集程序本设计将各种波形的数据固定在单片机的程序存储器里,通过改变这些数据的输出速度来改变信号的频率,然后通过改变D/A转换器的参考点要来改变信号的峰峰值,电路较为简单,成本较低。4.1.1正弦波产生我们采用直接输入正弦波的采样点,然后在正弦波的产生程序中,依次调用这写采样点即可正弦函数采样点如下,我们将其保存在一个数组中:一共256个点uchar const code sin_code256=0x80,0x83,0x86,0x89,
9、0x8c,0x8f,0x92,0x95,0x98,0x9c,0x9f,0xa2,0xa5,0xa8,0xab,0xae,0xb0,0xb3,0xb6,0xb9,0xbc,0xbf,0xc1,0xc4,0xc7,0xc9,0xcc,0xce,0xd1,0xd3,0xd5,0xd8,0xda,0xdc,0xde,0xe0,0xe2,0xe4,0xe6,0xe8,0xea,0xec,0xed,0xef,0xf0,0xf2,0xf3,0xf4,0xf6,0xf7,0xf8,0xf9,0xfa,0xfb,0xfc,0xfc,0xfd,0xfe,0xfe,0xff,0xff,0xff,0xff,0xff,
10、0xff,0xff,0xff,0xff,0xff,0xff,0xfe,0xfe,0xfd,0xfc,0xfc,0xfb,0xfa,0xf9,0xf8,0xf7,0xf6,0xf5,0xf3,0xf2,0xf0,0xef,0xed,0xec,0xea,0xe8,0xe6,0xe4,0xe3,0xe1,0xde,0xdc,0xda,0xd8,0xd6,0xd3,0xd1,0xce,0xcc,0xc9,0xc7,0xc4,0xc1,0xbf,0xbc,0xb9,0xb6,0xb4,0xb1,0xae,0xab,0xa8,0xa5,0xa2,0x9f,0x9c,0x99,0x96,0x92,0x8f,
11、0x8c,0x89,0x86,0x83,0x80,0x7d,0x79,0x76,0x73,0x70,0x6d,0x6a,0x67,0x64,0x61,0x5e,0x5b,0x58,0x55,0x52,0x4f,0x4c,0x49,0x46,0x43,0x41,0x3e,0x3b,0x39,0x36,0x33,0x31,0x2e,0x2c,0x2a,0x27,0x25,0x23,0x21,0x1f,0x1d,0x1b,0x19,0x17,0x15,0x14,0x12,0x10,0xf,0xd,0xc,0xb,0x9,0x8,0x7,0x6,0x5,0x4,0x3,0x3,0x2,0x1,0x1,
12、0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x1,0x2,0x3,0x3,0x4,0x5,0x6,0x7,0x8,0x9,0xa,0xc,0xd,0xe,0x10,0x12,0x13,0x15,0x17,0x18,0x1a,0x1c,0x1e,0x20,0x23,0x25,0x27,0x29,0x2c,0x2e,0x30,0x33,0x35,0x38,0x3b,0x3d,0x40,0x43,0x46,0x48,0x4b,0x4e,0x51,0x54,0x57,0x5a,0x5d,0x60,0x63,0x66,0x69,0x6c,0x6f,0
13、x73,0x76,0x79,0x7c;正弦函数产生函数如下: DAC0832_2=sin_codecnt; cnt+;4.1.2三角波产生1产生三角波的原理设个自变量i让它不断地自加1,直到加到255时,t=i ,对t进行不断地自减一直到减到t=0,然后再不断地重复上述过程进而产生三角波。2程序流程图见图4-1 图 4-1 三角波流程图3.程序 if(cnt128) DAC0832_2=(uchar)(float)(cnt)*0xff/255); cnt+; else DAC0832_2=255-(uchar)(float)(cnt)*0xff/255); cnt+; 4.1.3方波产生1产生
14、方波的原理设个自变量i=0使之延时一段时间,再另i=255时在延时与i=0相同的时间,然后在重复上述过程。 2.方波流程图见图4-2图 4-2 方波流程图3程序if(cnt128) DAC0832_2=0x00; cnt+; else DAC0832_2=0xff; cnt+;4.1.4锯齿波的产生1产生锯齿波的原理锯齿波中的斜线用一个个小台阶来逼近,在一个周期内从最小值开始逐步递增,当达到最大值后又回到最小值,如此循环,当台阶间隔很小时,波形基本上近似于直线。适当选择循环的时间,可以得到不同周期的锯齿波。锯齿波发生原理与方波类似,只是高低两个延时的常数不同,所以用延时法,来产生锯齿波,设个自
15、变量i让它不断地自加1,直到加到255,DAC0832可以又自动归0,然后再不断地重复上述过程进而产生锯齿波。2程序流程图见图4-3图 4-3 锯齿波流程图3程序DAC0832_2=(uchar)(float)(cnt)*0xff/255); cnt+;4.2 zlg7289相关程序设计程序流程图如下:具体7289程序要用到一些其专用的命令,具体程序见附录中程序代码及注释,此处不再复述。4.3波形切换程序我们采用的是利用中断程序来切换波形,通过利用定时器/计数器在计数达到满值之后所产生中断来进入中断程序;再通过按键来改变程序中某一个变量的取值,进而利用不同取值,在中断程序中所对应的函数发生程序
16、的不同来产生不同的波形。具体见附录程序代码及注释4.4系统总的流程图具体见附录中程序代码及注释第5章 函数发生器的调试与测试简单系统硬件的调试通常采用载入简单的测试程序并运行,使用数字表或示波器观察;对有些硬件例如显示器、键盘等可直接编入程序观察程序执行状态。 5.1 键值的测试对于新给定的一个ZLG7289及键盘是,我们应当首先确定每个按键的键值,只有当我们确定键之后,才可以对我们所要设置的按键的功能通过真正做到使软硬件相结合在一起,实现我们的目标功能,真是我们可以利用系统的显示部分也即就是系统的LED,我们通过假设法使出本系统的键值。一般对于设计心得系统我们都可以采用这种方法,因为现在是人
17、性化社会每个设计都有自己的特色,在设计中我们的充分利用系统为我们所提供的一些显而易见的东西来完成我们所打算实现的功能。例如LED与键盘我们为了知道每个键值,而利用LED的显示最终确定出每个键值。(从下到上,从右到左)对于设计十六个按键及功能见表5-1 表 5-1KEY作用0X0600X0E10X1620X1E30X2640X2E50X3660X3E70X0780X0F90X17小数点0X1F幅度设置0X27波形切换0X2FReset0X37确定键0X3F无功能对于键盘作用说明如下:1. 波形切换按键我们用波形切换键被按下的次数来区分输出何种波:初始时产生锯齿波按键被按下一次为正弦波按键被按下两
18、次为方波按键被按下四次次为三角波2幅值设定运行后,首先应显示锯齿波。之后,欲设定幅值,先按“幅值设置”键数码管显示“A”输入幅值“确定”电压峰值测试数据如表 电压峰值测试数据设定电压(V)示波器测试电压值(V)22.044.066.088.0 1010.0 1212.0 1412.05.2 影响上限频率的因素和已完成的最大值分析在程序中我们采用的是中断的方式来产生波形上的每一个点。具体是利用定时器0,在模式1下,设定初值,然后开始计数,在数值达到ffffH的时候产生中断。在终端程序中,我们放置波形产生的函数。因而,波形频率的大小决定于我们所设定初值的大小。如果我们把初值设定为0xf000H,那
19、么我们最终得到的正弦波的频率是2.68Hz如果我们把初值设定为0xffffH,那么我们最终得到的正弦波的频率是36.87Hz六 问题与改进1.实验中遇到的问题 实验中遇到很多问题,主要问题归纳为以下三点:实验中遇到的第一个问题就是当按下不同的键后,其键值和理论所对应的键值不一样,比如我们按下键值应该是0x3F键值的键后,rebuf中显示的键值是0x38,当按下0x37键值所对应的键后,rebuf中显示的是0x30。并且上一排按键和下一排按键所对应的键值是一样的。比如,0x3F和0x3E所对应的键值都是0x38;我们最终求教于金老师,最后在金老师的帮助下我们发现使我们的阻排的方向焊接反了,导致以
20、上的情况。在重新焊接阻排之后,按键的键值恢复正常。实验中遇到的第二个问题就是我们的八个数码管不管怎么样都亮不了,即便是发送测试指令使其闪烁也不亮,经过和其他同学讨论我们发现另一组同学也有也遇到了类似的问题。在求教于金老师之后,我们发现是因为我们所用的数码管不能由7289驱动,最终我们换了八个数码管之后,数码管的显示恢复了正常。实验中第三个主要的问题就是发现其中有一片DAC0832不论输给其多大的数值,转换过来的模拟信号的大小都不发生改变。但是另一片DAC0832还能产生正常的函数波形。我们依次交换了DAC和与其相连的两片运放,最后发现是其中的一片运放工作不正常导致。2.建议与改进我们所设计的波
21、形发生器还远远不够,距离我们实验室和现实生活中所用到的函数发生器还相去甚远。1.我们的函数的频率没法调整,频率只能由程序代码中的中断来决定,而在程序烧入单片机后,函数的频率就是定值,没法改变。2.函数的幅值改变范围非常有限:因为函数波形最终是由运放产生,基于运放的饱和电压,函数的幅值不可能太高。我们使用的运放供电电源电压是12V,因而,函数波形幅值最大值不会超过12V,这一点也极大的限制了其应用范围。附录(源程序)#include#include#include#define uchar unsigned char#define DAC0832_1 XBYTE0x7fff#define DAC
22、0832_2 XBYTE0xbfffsbit CS=P10;sbit CLK=P11;sbit DIO=P12;sbit KEY=P13;uchar rebuf,sebuf;uchar amp=0x80;uchar number;uchar dis_bit=0;uchar valid=0;uchar fun=1;uchar cnt=0;uchar tl=0x00,th=0xf0;bdata uchar com_data;sbit mos_bit=com_data7;sbit low_bit=com_data0;uchar c_max=255;uchar const code sin_code2
23、56=0x80,0x83,0x86,0x89,0x8c,0x8f,0x92,0x95,0x98,0x9c,0x9f,0xa2,0xa5,0xa8,0xab,0xae,0xb0,0xb3,0xb6,0xb9,0xbc,0xbf,0xc1,0xc4,0xc7,0xc9,0xcc,0xce,0xd1,0xd3,0xd5,0xd8,0xda,0xdc,0xde,0xe0,0xe2,0xe4,0xe6,0xe8,0xea,0xec,0xed,0xef,0xf0,0xf2,0xf3,0xf4,0xf6,0xf7,0xf8,0xf9,0xfa,0xfb,0xfc,0xfc,0xfd,0xfe,0xfe,0x
24、ff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xfe,0xfe,0xfd,0xfc,0xfc,0xfb,0xfa,0xf9,0xf8,0xf7,0xf6,0xf5,0xf3,0xf2,0xf0,0xef,0xed,0xec,0xea,0xe8,0xe6,0xe4,0xe3,0xe1,0xde,0xdc,0xda,0xd8,0xd6,0xd3,0xd1,0xce,0xcc,0xc9,0xc7,0xc4,0xc1,0xbf,0xbc,0xb9,0xb6,0xb4,0xb1,0xae,0xab,0xa8,0xa5,0xa2,0x9f,0x
25、9c,0x99,0x96,0x92,0x8f,0x8c,0x89,0x86,0x83,0x80,0x7d,0x79,0x76,0x73,0x70,0x6d,0x6a,0x67,0x64,0x61,0x5e,0x5b,0x58,0x55,0x52,0x4f,0x4c,0x49,0x46,0x43,0x41,0x3e,0x3b,0x39,0x36,0x33,0x31,0x2e,0x2c,0x2a,0x27,0x25,0x23,0x21,0x1f,0x1d,0x1b,0x19,0x17,0x15,0x14,0x12,0x10,0xf,0xd,0xc,0xb,0x9,0x8,0x7,0x6,0x5,0
26、x4,0x3,0x3,0x2,0x1,0x1,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x1,0x2,0x3,0x3,0x4,0x5,0x6,0x7,0x8,0x9,0xa,0xc,0xd,0xe,0x10,0x12,0x13,0x15,0x17,0x18,0x1a,0x1c,0x1e,0x20,0x23,0x25,0x27,0x29,0x2c,0x2e,0x30,0x33,0x35,0x38,0x3b,0x3d,0x40,0x43,0x46,0x48,0x4b,0x4e,0x51,0x54,0x57,0x5a,0x5d,0x60,0x6
27、3,0x66,0x69,0x6c,0x6f,0x73,0x76,0x79,0x7c;void delay_50us() uchar i; for(i=0;i6;i+) ; void delay_8us() uchar i; for(i=0;i1;i+) ; void delay_50ms() uchar i,j; for(j=0;j50;j+) for(i=0;i125;i+) ; void send(uchar sebuf) uchar i; com_data=sebuf; CLK=0; CS=0; DIO=0; delay_50us(); for(i=0;i8;i+) delay_8us(
28、); DIO=mos_bit; CLK=1; delay_8us(); com_data=com_data1; CLK=0; DIO=0; void receive() uchar i; CLK=1; delay_50us(); for(i=0;i8;i+) com_data=com_data1; low_bit=DIO; CLK=1; delay_8us(); CLK=0; delay_8us(); rebuf=com_data; DIO=0; CS=1;void reset() KEY=1; DIO=1; delay_50ms(); send(0xa4); CS=1;void time0_
29、int(void)interrupt 1 /中断函数 TR0=0; TH0=th; TL0=tl; TR0=1; if(fun=0) /锯齿波 DAC0832_1=amp; DAC0832_2=(uchar)(float)(cnt)*0xff/255); cnt+; else if(fun=1) / 正弦波 DAC0832_1=amp; DAC0832_2=sin_codecnt; cnt+; else if(fun=2) / 三角波 DAC0832_1=amp; if(cnt128) DAC0832_2=(uchar)(float)(cnt)*0xff/255); cnt+; else DAC0832_2=255-(uchar)(float)(cnt)*0xff/255); cnt+; else if(fun=3) DAC0832_1=amp; / 方波 if(cnt128) DAC0832_2=0x00; cnt+; else DAC0832_2=0xff; cnt+; void down0_show(uchar dis_bit) /按方式0译码 send(0xa1); /左移 send(0x80|dis_bit); /
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1