简易函数信号发生器设计_毕业论文.doc_第1页
简易函数信号发生器设计_毕业论文.doc_第2页
简易函数信号发生器设计_毕业论文.doc_第3页
简易函数信号发生器设计_毕业论文.doc_第4页
简易函数信号发生器设计_毕业论文.doc_第5页
已阅读5页,还剩19页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

简易函数信号发生器设计摘要:信号发生器又称信号源或振荡器,在生产实践和科技领域中有着广泛的应用。这次的设计分为五个模块:单片机控制及显示模块、数模转换模块、波形产生模块、输出显示模块、电源模块。使用at89c52作为主控台结合芯片dac0832产生1hz-300hz频率可调的五种信号波(正弦波、三角波和方波)。这几种波形有几个开关控制,可以随意进行切换,十分方便。另外,波形的频率和振幅也可以通过开关进行更改。可以说这次的设计操作简单,内容丰富,而且电路快捷明了。在编程语言上,我们选择自身比较熟悉的c语言,这样在后期波形的调试及与硬件衔接方面更容易发挥出自身优势。经过设计及后期长时间的调试,设计的所有功能均已实现。关键字:信号发生器、频率、幅度、at98c52、dac08321、设计要求1)以单片机为核心,经过d/a转换和放大电路的处理,最后输出信号;2)要求能输出正弦波、三角波和方波四种信号;3)输出信号可以通过按键来改变;4)频率可变,范围在1-300hz;5)幅度可调0-10v;6)可实现四路a/d电压采样;2、总体设计2.1系统组成及工作原理该函数信号发生器可以输出四种波形,有正弦波、三角波和方波。在此基础上进一步实现对波形频率和占空比的调节,并用液晶屏分两行显示波形名称和波形频率。函数信号发生器的设计总体框图如图1所示,主要有单片机at89c52,电源,键盘模块,lcd1602显示模块构成。按案件模块:由5个复位开关与74ls21组成的系统通过对单片机传输中断信号来实现波形切换及频率和占空比的调节。显示模块:用lcd1602,分行显示波形类型和波形频率的显示。图1 系统总体框图2.2测量原理我们这个系统可实现四路a/d电压采样,使用的算法是:v=5*n/256,取五个点电压进行测量,并将测量完的十进制数据转化为二进制数据。 ad采样数据电压源输入0.100.200.300.400.45电压表测得(放大后)1.012.003.024.014.51采集系统测得1.012.003.024.024.523、硬件设计 3.1硬件组成3.1.1 资源分配晶振采用12mhz。p1口的p1.0-p1.4分别与四个按键连接,分别控制波形切换、频率加、频率减,占空比加,占空比减。p2口与dac0832的d0-d7数据输入端相连。p3口用来控制dac0832的输入寄存器选择信号cs。3.1.2 d/a转换模块部件dac0832芯片原理管脚功能介绍(如图2所示)图2 dac0832管脚图di7di0:8位的数据输入端,di7为最高位。ile:数据锁存允许控制信号输入线,高电平有效。cs:选片信号输入线(选通数据锁存器),低电平有效。wr1:数据锁存器写选选通输入线,负脉冲有效,由ile、cs、wr1的逻辑组合产生le1,当le1为高电平时,数据锁存器状态随输入数据线变化,le1的负跳变时将输入数据锁存。xfer:数据传输控制信号输入线,低电平有效,负脉冲有效。wr2:dac寄存器选通输入线,负脉冲有效,由wr2、xfer的逻辑组合产生le2,当le2为高电平时,dac寄存器的输出随寄存器的输入而变化,le2的负跳变时将数据锁存器的内容打入dac寄存器并开始d/a转换。iout1:模拟电流输出端1,当dac寄存器中数据全为1时,输出电流最大,当 dac寄存器中数据全为0时,输出电流为0。iout2:模拟电流输出端2, iout2与iout1的和为一个常数,即iout1iout2常数。rfb:反馈电阻引出端,dac0832内部已经有反馈电阻,所以 rfb端可以直接接到外部运算放大器的输出端,这样相当于将一个反馈电阻接在运算放大器的输出端和输入端之间。vref:参考电压输入端,此端可接一个正电压,也可接一个负电压,它决定0至255的数字量转化出来的模拟量电压值的幅度,vref范围为(+10-10)v。vref端与d/a内部t形电阻网络相连。vcc:芯片供电电压,范围为(+5+15)v。agnd:模拟量地,即模拟电路接地端。dgnd:数字量地。3.1.3放大部分 放大部分采用双极运算放大电路,lm358 内部包括有两个独立的、高增益、内部频率补偿的双运算放大器,适合于电源电压范围很宽的单电源使用,也适用于双电源工作模式,在推荐的工作条件下,电源电流与电源电压无关。它的使用范围包括传感放大器、直流增益模块和其他所有可用单电源供电的使用运算放大器的场合。图3 lm3583.2单片机核心模块3.2.1 at89c52单片机及其说明 at89c52为8 位通用微处理器: 图4 pdip封装的at89c52引脚图采用工业标准的c51内核,在内部功能及管脚排布上与通用的8xc52 相同,其主要用于会聚调整时的功能控制。功能包括对会聚主ic 内部寄存器、数据ram及外部接口等功能部件的初始化,会聚调整控制,会聚测试图控制,红外遥控信号ir的接收解码及与主板cpu通信等。主要管脚有:xtal1(19 脚)和xtal2(18 脚)为振荡器输入输出端口,外接12mhz 晶振。rst/vpd(9 脚)为复位输入端口,外接电阻电容组成的复位电路。vcc(40 脚)和vss(20 脚)为供电端口,分别接+5v电源的正负端。p0p3 为可编程通用i/o 脚,其功能用途由软件定义,在本设计中,p0 端口(3239 脚)被定义为n1 功能控制端口,分别与n1的相应功能管脚相连接,13 脚定义为ir输入端,10 脚和11脚定义为i2c总线控制端口,分别连接n1的sdas(18脚)和scls(19脚)端口,12 脚、27 脚及28 脚定义为握手信号功能端口,连接主板cpu 的相应功能端,用于当前制式的检测及会聚调整状态进入的控制功能。 p0 口p0 口是一组8 位漏极开路型双向i/o 口, 也即地址/数据总线复用口。作为输出口用时,每位能吸收电流的 方式驱动8 个ttl逻辑门电路,对端口p0 写“1”时,可作为高阻抗输入端用。 在访问外部数据存储器或程序存储器时,这组口线分时转换地址(低8 位)和数据总线复用,在访问期间激活内部上拉电阻。 在flash 编程时,p0 口接收指令字节,而在程序校验时,输出指令字节,校验时,要求外接上拉电阻。 p1 口p1 是一个带内部上拉电阻的8 位双向i/o 口, p1 的输出缓冲级可驱动(吸收或输出电流)4 个ttl 逻辑 门电路。对端口写“1”,通过内部的上拉电阻把端口拉到高电平,此时可作输入口。作输入口使用时,因为内部存在上拉电阻,某个引脚被外部信号拉低时会输出一个电流(iil)。 p2 口p2 是一个带有内部上拉电阻的8 位双向i/o 口,p2 的输出缓冲级可驱动(吸收或输出电流)4 个ttl 逻辑 门电路。对端口p2 写“1”,通过内部的上拉电阻把端口拉到高电平,此时可作输入口,作输入口使用时,因为内部存在上拉电阻,某个引脚被外部信号拉低时会输出一个电流(iil)。 在访问外部程序存储器或16 位地址的外部数据存储器(例如执行movx dptr 指令)时,p2 口送出高8 位地址数据。在访问8 位地址的外部数据存储器(如执行movx ri 指令)时,p2 口输出p2 锁存器的内容。 flash 编程或校验时,p2亦接收高位地址和一些控制信号。 p3 口p3 口是一组带有内部上拉电阻的8 位双向i/o 口。p3 口输出缓冲级可驱动(吸收或输出电流)4 个ttl 逻 辑门电路。对p3 口写入“1”时,它们被内部上拉电阻拉高并可作为输入端口。此时,被外部拉低的p3 口将用上拉电阻输出电流(iil)。 p3 口除了作为一般的i/o 口线外,更重要的用途是它的第二功能 p3 口还接收一些用于flash 闪速存储器编程和程序校验的控制信号。 rst复位输入。当振荡器工作时,rst引脚出现两个机器周期以上高电平将使单片机复位。 ale/prog当访问外部程序存储器或数据存储器时,ale(地址锁存允许)输出脉冲用于锁存地址的低8 位字节。一般情况下,ale 仍以时钟振荡频率的1/6 输出固定的脉冲信号,因此它可对外输出时钟或用于定时目的。要注意的是:每当访问外部数据存储器时将跳过一个ale 脉冲。 对flash 存储器编程期间,该引脚还用于输入编程脉冲(prog)。 如有必要,可通过对特殊功能寄存器(sfr)区中的8eh 单元的d0 位置位,可禁止ale 操作。该位置位后,只有一条 movx 和movc指令才能将ale 激活。此外,该引脚会被微弱拉高,单片机执行外部程序时,应设置ale 禁止位无效。 psen程序储存允许(psen)输出是外部程序存储器的读选通信号,当at89c52 由外部程序存储器取指令(或数 据)时,每个机器周期两次psen 有效,即输出两个脉冲。在此期间,当访问外部数据存储器,将跳过两次psen信号。 ea/vpp 外部访问允许。欲使cpu 仅访问外部程序存储器(地址为0000hffffh),ea 端必须保持低电平(接 地)。需注意的是:如果加密位lb1 被编程,复位时内部会锁存ea端状态。 如ea端为高电平(接vcc端),cpu 则执行内部程序存储器中的指令。 flash 存储器编程时,该引脚加上+12v 的编程允许电源vpp,当然这必须是该器件是使用12v 编程电压vpp。 xtal1振荡器反相放大器的及内部时钟发生器的输入端。 xtal2振荡器反相放大器的输出端。 特殊功能寄存器在at89c52 片内存储器中,80h-ffh 共128 个单元为特殊功能寄存器(sfe),sfr 的地址空间映象如表2 所示。 并非所有的地址都被定义,从80hffh 共128 个字节只有一部分被定义,还有相当一部分没有定义。对没有定义的 单元读写将是无效的,读出的数值将不确定,而写入的数据也将丢失。 不应将数据“1”写入未定义的单元,由于这些单元在将来的产品中可能赋予新的功能,在这种情况下,复位后这些单 元数值总是“0”。 at89c52除了与at89c51所有的定时/计数器0 和定时/计数器1 外,还增加了一个定时/计数器2。定时/计数器2 的控 制和状态位位于t2con(参见表3)t2mod(参见表4),寄存器对(rcao2h、rcap2l)是定时器2 在16 位捕获方式或16 位 自动重装载方式下的捕获/自动重装载寄存器。 数据存储器at89c52 有256 个字节的内部ram,80h-ffh 高128 个字节与特殊功能寄存器(sfr)地址是重叠的,也就是高128 字节的ram 和特殊功能寄存器的地址是相同的,但物理上它们是分开的。 当一条指令访问7fh 以上的内部地址单元时,指令中使用的寻址方式是不同的,也即寻址方式决定是访问高128 字节 ram 还是访问特殊功能寄存器。如果指令是直接寻址方式则为访问特殊功能寄存器。 例如,下面的直接寻址指令访问特殊功能寄存器0a0h(即p2 口)地址单元。 mov 0a0h,#data 间接寻址指令访问高128 字节ram,例如,下面的间接寻址指令中,r0 的内容为0a0h,则访问数据字节地址为0a0h, 而不是p2 口(0a0h)。 mov r0,#data 堆栈操作也是间接寻址方式,所以,高128 位数据ram 亦可作为堆栈区使用。定时器0和定时器1: 3.2.2单片机最小系统版模块图 53.3两级运放电路图 6芯片特性:内部频率补偿直流电压增益高(约100db)单位增益频带宽(约1mhz)电源电压范围宽:单电源(330v)双电源(1.5 一15v)低功耗电流,适合于电池供电 低输入偏流低输入失调电压和失调电流共模输入电压范围宽,包括接地差模输入电压范围宽,等于电源电压范围输出电压摆幅大(0 至vcc-1.5v)3.4显示电路图 7lcd1602 主要功能 a、 40通道点阵lcd 驱动; b、 可选择当作行驱动或列驱动; c、 输入/输出信号:输出,能产生202个lcd驱动波形;输入,接受控制器送出的串行数据和控制信号,偏压(v1v6); d、 通过单片机控制将所测的频率信号读数显示出来4、程序设计4.1主程序设计图 84.2子程序设计4.2.1三角波程序流程图 三角波的实现是设置一个初值,然后进行加数,同样是加到某个数之后再进行减数,减到初值之后就再返回到先前的操作,这个操作跟锯齿波的实现是相似的。此程序输入的vref的电压是5v,因此该波形输出的最大频率是初值为00h和最终值为0ffh,且步数为1,这样输出的波形是最大的。程序流程图如下图所示: 置初值 输出信号 num+,步数 判断是否已满? 否 是 num,步数 判断是否等于初值? 否/是 开 始 图94.2.2 方波程序流程图 此波形的实现更加简单,只需开始的时候设置一个初值然后直接输出这个值就行了,输出一段时间后,然后再重新置一个数据,然后再输出这个数据一段时间,但是此时的时间一定要等于前面那段时间。这样才是一个方波,如果两个时间不相同,那就相当于一个脉冲波了。流程图如下图所示:开 始 给a设置初值 输出信号 设置输出的时间 再设置一个初值 输出信号 输出一段时间 图104.2.3 正弦波程序流程图 正弦波的实现则相对比较复杂,因为正弦波的实现是输出各个点的值就行了,可是各个点值则要通过正弦函数来求出,不过这些值直接去网上下载下来使用就可以了。输出的数据刚好是256个数据,这样则可以直接相加就行了。流程图如下图所示:图11程序设计24#includetypedef unsigned char uchar;unsigned char i,j=0,sqar_num=128; /最大值100,默认值50unsigned char cho=0; /0:正弦波。1:方波。2:三角波。3:锯齿波。unsigned char num=0;unsigned char time0_h=0xff,time0_l=0xd9; /定时器0的初值设置;全局变量.对应正弦波,锯齿波50hzsbit chg= p10; /三角波100hz.sbit freq_u=p11;sbit freq_d=p12;sbit duty_u=p13;sbit duty_d=p14;sbit cs =p37;bit flag=0;unsigned int freq=150;/初始化频率,50hzsbit rw=p36;sbit rs=p35;sbit lcde=p30;unsigned char tempbuffer7;unsigned char value1=frequency:;void delay(unsigned int ms)unsigned int i,j;for (j=0;jms;j+)for (i=0;i0) sqar_num-; else if(duty_u=0&sqar_num255) sqar_num+;/波形发生函数void sint(void) if(!flag) cs=0;p2=sin_numnum+;cs=1; if(num=0)num=255;flag=1; else if(flag) cs=0;p2=sin_numnum-;cs=1; if(num=255)num=0;flag=0; void square(void) if(i+sqar_num) cs=0;p2=0xff;cs=1; elsecs=0;p2=0x00;cs=1;void triangle(void) cs=0;p2=num+;cs=1;void stw(void) if(flag) cs=0;p2=num+;cs=1; if(num=0)num=255;flag=1; else if(flag) cs=0;p2=num-;cs=1; if(num=255)num=1;flag=0; /1602显示开始void write_command(unsigned char command)rs=0;p0=command;lcde=1;lcde=0;void write_data(unsigned char data0)rs=1;p0=data0;lcde=1;lcde=0; void init_1602()delay(5);write_command(0x38);delay(5);write_command(0x01);delay(5);write_command(0x06);delay(5);write_command(0x0c);delay(5); /1602显示结束/*频率值转换为字符串*/void temp_to_str() / tempbuffer0=freq/1000+0; /千位 tempbuffer1=freq%1000/100+0; /百位 tempbuffer2=freq%1000%100/10+0;/十位 tempbuffer3=freq%1000%100%10+0;/个位 tempbuffer4=h; tempbuffer5=z; /tempbuffer6=0;void lcd_disp_str(uchar x,uchar y,uchar *str) uchar address; if(y=1) address=0x80+x; else address=0xc0+x; write_command(address); while(*str!=0) write_data(*str); str+; /*频率显示*/void show_frequency() unsigned char i,j; /init_1602();/初始化lcdwrite_command(0xc0);for(i=0;isizeof(value1)-1;i+)write_data(value1i);delay(2); write_command(0xca);/液晶显示位置 temp_to_str(); for(j=0;jsizeof(tempbuffer)-1;j+)write_data(tempbufferj);delay(5);void show_wave() if(j=0) lcd_disp_str(0,1, wave: sine );else if(j=1) lcd_disp_str(0,1, wave: square );else if(j=2) lcd_disp_str(0,1, wave: sawtooth);else if(j=3) lcd_disp_str(0,1, wave: triangle); void main() tmod=0x01; th0=0xff; tl0=0xd9; it0=1; /设置中断触发方式,下降沿 ea=1; ex0=1; et0=1; ip=0x01; /键盘中断级别高 init_1602();/初始化lcd tr0=1; write_command(0xc0);/液晶显示位置 /* delay(2); for (i=0;isizeof(value1)-1;i+)write_data(value1i);delay(2);*/ tr0=1; while(1) show_frequency();show_wave();/按键中断处理程序。void it0() interrupt 0 if(chg=0) delay(5); if(chg=0) freq=150; j+; if(+cho=4) j=0;cho=0;num=0; /num=0;所有数据从新开始,保证波形的完整性 else if(freq_u=0|freq_d=0) freq_ud(); else if (cho=1&(duty_d=0|duty_u=0) duty_ud(); else; /定时器中断处理程序。void intt0() interrupt 1 /th0=0x00;tl0=0x00;sinx(); switch(cho) case 0:th0=time0_h;tl0=time0_l;sint() ;break; /正弦波/每半周期256取样。 case 1:th0=time0_h;tl0=time0_l;square();break;/方波 /为了提高方波的最高频率,只有牺牲占空比的最小可调值。分100份 每次1%。 case 2:th0=time0_h;tl0=time0_l;triangle();break;/三角波 case 3:th0=time0_h;tl0=time0

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论