作品简介
该函数发生器采用AT89S51 单片机作为控制核心,外围采用模拟/数字转换电路(DAC0832)、运放电路(LM324)、按键和LED显示灯电路等。电路采用AT89S51单片机和一片DAC0832数模转换器组成数字式低频信号发生器。函数信号发生器,它具有价格低、性能高和在低频范围内稳定性好、操作方便、体积小、耗电少等特点。由于采用了LM324运算放大器,使其电路更加具有较高的稳定性能,性能比高。此电路清晰,出现故障容易查找错误,操作简单、方便。
通过按键控制可产生方波、锯齿波、三角波、正弦波等,同时用LED显示灯指示对应的波形。所产生的波形在一定频率范围可调,波形准确并且平滑。本系统设计简单、性能优良,具有一定的实用性。 本设计主要应用AT89S51作为控制核心。硬件电路简单,软件功能完善,控制系统可靠,性价比较高等特点,具有一定的使用和参考价值。 1.绪 论信号发生器现状信号发生器作为一种常见的应用电子仪器设备,传统的可以完全由硬件电路搭接而成,如采用555振荡电路发生正弦波、三角波和方波的电路便是可取的路径之一,不用依靠单片机。但是这种电路存在波形质量差,控制难,可调范围小,电路复杂和体积大等缺点。在科学研究和生产实践中,如工业过程控制,生物医学,地震模拟机械振动等领域常常要用到低频信号源。而由硬件电路构成的低频信号其性能难以令人满意,而且由于低频信号源所需的RC很大;大电阻,大电容在制作上有困难,参数的精度亦难以保证; 利用单片机采用程序设计方法来产生低频信号,其下限频率很低。具有线路相对简单,结构紧凑,价格低廉,频率稳定度高,抗干扰能力强,用途广泛等优点,并且能够对波形进行细微调整,改良波形,使其满足系统的要求。只要对电路稍加修改,调整程序,即可完成功能升级。 这里采用AT89S51单片机和一片DAC0832数模转换器做成的数字式低频信号发生器,它的特点是价格低、性能高,在低频范围稳定性好、操作方便、体积小、耗电少等。 信号发生器与其它相比还具有如下优点:①较分立 元件信号发生器而言,具有频率高,工作稳定,容易调试等特性;②较专用DDS芯片的信号发生器而言,具有结构简单,成本低等特性。 2.系统设计 2.1 系统方案的比较2.1.1选题论证制作低频信号发生器可以用一片DAC0832来实现,它可以分为单极性和双极性。而本项目选择了单片双极性。之所以选单片双极性是因为其精度高,滤波好,抗干扰效果好。 2.1.2方案选择方案一: AT89S51芯片中每一路模拟输出与DAC0832芯片相连,构成多个DAC0832同步输出电路,输出波形稳定,精度高,但是第二级DAC0832输出,发生错误并且电路连接复杂。方案二: AT89S51芯片中只有一路模拟输出或几路模拟信号非同步输出,这种情况下CPU对DAC0832 执行一次写操作,则把一个数据直接写入DAC寄存器,DAC0832的输出模拟信号随之对应变化。输出波形稳定,精度高,滤波好,抗干扰效果好,连接简单,性价比高。因此我们设计中采用方案二。2.2芯片选择模块方案一:AT89S51单片机是一种高性能8位单片微型计算机。它把构成计算机的中央处理器CPU、存储器、寄存器、I/O接口制作在一块集成电路芯片中,从而构成较为完整的计算机。同时,为什么选AT89S51而不选用AT89C51,那是因为AT89S51相对于AT89C51更强大,S51增加的新功能包括: ⑴性能有了较大提升,价格基本不变,甚至比89C51更低! ⑵ISP在线编程功能,这个功能的优势在于改写单片机存储器内的程序不需要把芯片从工作环境中剥离。是一个强大易用的功能。 ⑶最高工作频率为33MHz,大家都知道89C51的极限工作频率是24M,就是说S51具有更高工作频率,从而具有了更快的计算速度。 ⑷具有双工UART串行通道。 ⑸内部集成看门狗计时器,不再需要像89C51那样外接看门狗计时器单元电路。 ⑹双数据指示器。 ⑻全新的加密算法,这使得对于89S51的解密变为不可能,程序的保密性大大加强,这样就可以有效的保护知识产权不被侵犯。 ⑼兼容性方面:向下完全兼容51全部字系列产品。比如8051、89C51等等早期MCS-51兼容产品。也就是说所有教科书、网络教程上的程序(不论教科书上采用的单片机是8051还是89C51还是MCS-51等等),在89S51上一样可以照常运行,这就是所谓的向下兼容。 方案二:C8051F005单片机是完全集成的混合信号系统级芯片,具有与AT89S51兼容的微控制器的内核,与MCS-51指令集完全兼容。除了具有标准AT89S51的数字外设部件之外,片内还集成了数据采集和控制系统中常用的模拟部件和其他数字外设及功能部件。 方案选择:方案二中C8051F005芯片系统内部结构复杂,不易控制,芯片成本高,对于本系统而言利用率低,AT89S51芯片简单易控制,成本低,性能稳定,因此采用方案一。 3.硬件电路的设计3.1系统框图如图3-1所示:
图3-1 低频信号发生器系统框图 低频信号发生器系统主要由CPU、D/A转换电路、基准电压电路、电流/电压转换电路、按键和波形指示电路、电源等电路组成。 其工作原理为当分别每按下按键一次就会分别出现方波、锯齿波、三角波、正弦波,并且有数码管会指示是那种波形序号,另外,发光二极管发光说明系统处于工作状态。 3.2 资源分配软、硬件设计是设计中不可缺少的,为了满足功能和指标的要求,资源分配如下 1.晶振采用12MHZ; 2.内存分配 P2口与DAC0832的DI0-DI7数据输入端相连。 P2口用来控制DAC0832的输入寄存器选择信号CS、输入寄存器写选通信号WR1及DAC寄存器写选通信号WR2和数据传送信号XFER。 表3-1 端口引脚图 3.3.4 AT89S51的晶振及其连接方法 图3-3 89S51的时钟脉冲 图3-3中:J一般为石英晶体,其频率由系统需要和器件决定,在频率稳定度要求不高时也可以使用陶瓷滤波器。 C1、C2:使用石英晶体时,C1=C2=30(±10)pF 使用陶瓷滤波器时,C1=C2=40(±10)pF 3.3.5 AT89S51的复位 图3-4 89S51的复位电路 3.3.6芯片擦除 整个PEROM阵列和三个锁定位的电擦除可通过正确的控制信号组合,并保持ALE管脚处于低电平10ms 来完成。在芯片擦操作中,代码阵列全被写“1”且在任何非空存储字节被重复编程以前,该操作必须被执行。 此外,AT89S51设有稳态逻辑,可以在低到零频率的条件下静态逻辑,支持两种软件可选的掉电模式。在闲置模式下,CPU停止工作。但RAM,定时器,计数器,串口和中断系统仍在工作。在掉电模式下,保存RAM的内容并且冻结振荡器,禁止所用其他芯片功能,直到下一个硬件复位为止。 3.4各部分电路原理3.4.1 DAC0832芯片原理①管脚功能介绍(如图3-5所示) 图3-5 DAC0832管脚图 (1) D7~D0:8位的数据输入端,D7为最高位。 (2)IOUT1:模拟电流输出端1。 (3) IOUT2:模拟电流输出端2,当DAC寄存器中数据全为1时,输出电流最大,当 DAC寄存器中数据全为0时,输出电流为0, IOUT2与IOUT1的和为一个常数,即IOUT1+IOUT2=常数。 (4) Rfe:反馈电阻引出端,DAC0832内部已经有反馈电阻,所以 Rfe端可以直接接到外部运算放大器的输出端,这样相当于将一个反馈电阻接在运算放大器的输出端和输入端之间。 (5) Vref:参考电压输入端,此端可接一个正电压,也可接一个负电压,它决定0至255的数字量转化出来的模拟量电压值的幅度,VREF范围为(+10~-10)V。VREF端与D/A内部T形电阻网络相连。 (6) Vcc:芯片供电电压,范围为(+5~ 15)V。 (7) GND(3脚):模拟量地,即模拟电路接地端。 (8) GND(10脚):数字量地。 当WR2和XFER同时有效时,8位DAC寄存器端为高电平“1”,此时DAC寄存器的输出端Q跟随输入端D也就是输入寄存器Q端的电平变化;反之,当端为低电平“0”时,第一级8位输入寄存器Q端的状态则锁存到第二级8位DAC寄存器中,以便第三级8位DAC转换器进行D/A转换。 一般情况下为了简化接口电路,可以把和直接接地,使第二级8位DAC寄存器的输入端到输出端直通,只有第一级8位输入寄存器置成可选通、可锁存的单缓冲输入方式。 特殊情况下可采用双缓冲输入方式,即把两个寄存器都分别接成受控方式 制作低频信号发生器有许多方案:主要有单缓冲方式,双缓冲方式和直通方式。 单缓冲方式具有适用于只有一路模拟信号输出或几路模拟信号非同步输出的情形的优点,但是电路线路连接比较简单。而双缓冲方式适用于在需要同时输出几路模拟信号的场合,每一路模拟量输出需一片DAC0832芯片,构成多个DAC0832同步输出电路,程序简单化,但是电路线路连接比较复杂。根据以上分析,我们的课题选择了单缓冲方式使用方便,程序简单,易操作。 ②工作原理 DAC0832主要由8位输入寄存器、8位DAC寄存器、8位D/A转换器以及输入控制电路四部分组成。8 位输入寄存器用于存放主机送来的数字量,使输入数字量得到缓冲和锁存,由加以控制;8位DAC寄存器用于存放待转换的数字量,由加以控制;8位D/A转换器输出与数字量成正比的模拟电流;由与门、非与门组成的输入控制电路来控制2个寄存器的选通或锁存状态。 DAC0832与反相比例放大器相连,实现电流到电压的转换,因此输出模拟信号的极性与参考电压的极性相反,数字量与模拟量的转换关系为Vout1=-Vref×(数字码/256) 若D/A转换器输出为双极性,如图3-6所示。 图3-6 D/A转换器双极性输出电路 图3-6中,运算放大器A2的作用是把运算放大器A1的单向输出电压转换成双向输出电压。其原理是将A2的输入端Σ通过电阻R1与参考电压VREF相连,VREF经R1向A2提供一个偏流I1,其电流方向与I2相反,因此运算放大器A2的输入电流为I1、I2之代数和。则D/A转换器的总输出电压为: VOUT2= -[(R3/R2) VOUT1+(R3/R1)] VREF 设R1=R3=2R R2=R,则 VOUT2= -(2VOUT1+VREF) DAC0832主要是用于波形的数据的传送,是本题目电路中的主要芯片。 3.4.2LM324工作原理
图3-7 LM324原理图 管脚图 LM324时四运放集成电路 ,它采用14脚双列直插塑料封袋,外形上图所示。它的内部包含四组形式完全相同的运算放大器,除电源共用外,四组运放相互独立。每一组运算放大器可用图中所示的符号来表示,它有5个引出脚,其中“+”、“-”为两个信号输入端,“V+”、“V-”为正、负电源端,“OUT”为输出端。两个信号输入端中,“-”为反相输入端,表示运放输出端OUT的信号与该输入端的为相反;“+”为同相输入端,表示运放输出端OUT的信号与输入端的相位相同。LM324的引脚排列见图7。 由于LM324四运放电路具有电源电压范围宽,静态功耗小,可但电源使用,价格低廉等优点,因此被广泛应用在各种电路中。 4.软件设计 软件设计上,根据功能分了几个模块编程。模块主要有:主程序模块、方波模块、三角波模块、锯齿波模块、正弦波模块、延时子程序模块等。 显示波形模块是利用DAC0832的8位特点,把波形的数据以8位数据的形势送进CPU中,只要一按键就能显示波形。 4.1主程序流程图
图4-1 主程序流程图 本软件设计过程中主要实现利用按键来控制不同波形的输出,当按键KEY1按下1次时,函数发生器就输出方波;当按键KEY1按下2次时,函数发生器就输出三角波;当按键KEY1按下3次时,函数发生器就输出锯齿波;当按键KEY1按下4次时,函数发生器就输出正弦波。通过按键可以以任意循环方式输出不同波形,数码管上显示的数字分别对应相应的波形。按键KEY2按下时复位。 4.2方波程序流程图 图4-2 方波程序流程图 方波产生首先将DAC0832口地址至为4000H,当A中的内容为0时,输出对应模拟量,然后延时,当A中的内容为0FFH时,同样输出对应模拟量,再延时,从而得到方波。4.3三角波程序流程图 图4-3三角波程序流程图 三角波产生首先将DAC0832口地址至为4000H,通过A中数值的加一递升,当A中的内容为0时,与0FFH相比,相等时A中的内容减一递减,从而循环产生三角波。 4.4锯齿波程序流程图 图4-4 锯齿波程序流程图 锯齿波产生首先将DAC0832口地址至为4000H,然后将00H送入寄存器A中,DAC0832输出A中的内容,当A中的内容等于F0H返回开始,当A中的内容不为0FH时,A中的内容累加,从而输出波形。 4.5 正弦波程序流程图 图12 正弦波程序流程图 5.测试结论 5.1产生各种波形电压输出范围及频率如下: 方波: VP-P min=2.8V T=10.8ms f=92.592593Hz VP-P max=3.4V 三角波:VP-P min=2.4V T=6.2ms f=161.28032Hz VP-P max=5V 锯齿波:VP-P min=2.2V T=4.6ms f=217.3913Hz VP-P max=4.6V 正弦波:VP-P min=2.8V T=9.2ms f=108.69565Hz VP-P max=3.4V 通过按键控制可产生方波、锯齿波、三角波、正弦波等,同时用LED显示灯指示对应的波形。所产生的波形VP-P范围为2.2~5 V,频率范围为92.592593Hz~ 217.3913Hz,波形准确并且平滑。本系统设计简单、性能优良,具有一定的实用性。 方波: 三角波: 锯齿波: 正弦波: 图5-1 各波形图 程序部分 //函数名称:void fangbo(void) //函数说明:方波函数 //函数功能: // 注意: *************************************************************************/ void fangbo(void)//while(1)是个死循环看执行一次多长时间*128求算频率,一个周期大约3ms多,这个频率为300hz左右 { while(1) { unsigned char fangbo_1; fangbo_1++; if(fangbo_1>128&fangbo_1<256) {P2=0x00;} if(fangbo_1<128) {P2=0xff;} if(P3_7==0) {delay(1,50,248); if(P3_7==0) { count=2; disp(count); sanjiaobo(); } } while(P3_7==0); } //函数名称:void sanjiaobo(void) //函数说明:三角波函数 //函数功能: // 注意: *************************************************************************/ void sanjiaobo(void) { while(1) { unsigned char sanjiaobo_2; if(sanjiaobo_2<128) {P2=sanjiaobo_2;} else {P2=255-sanjiaobo_2;} sanjiaobo_2++; if(sanjiaobo_2>=255) {sanjiaobo_2=0x00;} if(P3_7==0) { delay(1,50,248); if(P3_7==0) {count=3; disp(count); juchibo(); } } while(P3_7==0); //函数名称:void juchibo(void) //函数说明:锯齿波函数 //函数功能: void juchibo(void) { while(1) {unsigned char juchibo_3; if(juchibo_3<180) {P2=juchibo_3;} juchibo_3++; if(juchibo_3>=180) {juchibo_3=0x00;} if(P3_7==0) {delay(1,50,248); if(P3_7==0) {count=4; disp(count); zhengxianbo(); } } while(P3_7==0); } } //函数名称:void zhengxianbo(void) //函数说明:正弦波函数 //函数功能: void zhengxianbo(void) { while(1) {unsigned char zhengxianbo_4; P2=stable[zhengxianbo_4]; zhengxianbo_4++; if(zhengxianbo_4>=255) {zhengxianbo_4=0;} if(P3_7==0) {delay(1,50,248); if(P3_7==0) { count=0; disp(count); anjian(); } } while(P3_7==0);
|