程控赋值函数发生器.docx

上传人:b****5 文档编号:29078387 上传时间:2023-07-20 格式:DOCX 页数:27 大小:137.96KB
下载 相关 举报
程控赋值函数发生器.docx_第1页
第1页 / 共27页
程控赋值函数发生器.docx_第2页
第2页 / 共27页
程控赋值函数发生器.docx_第3页
第3页 / 共27页
程控赋值函数发生器.docx_第4页
第4页 / 共27页
程控赋值函数发生器.docx_第5页
第5页 / 共27页
点击查看更多>>
下载资源
资源描述

程控赋值函数发生器.docx

《程控赋值函数发生器.docx》由会员分享,可在线阅读,更多相关《程控赋值函数发生器.docx(27页珍藏版)》请在冰豆网上搜索。

程控赋值函数发生器.docx

程控赋值函数发生器

 

程控幅值函数发生器

 

摘要

本设计核心任务是:

以89S52为核心,结合DAC0832实现程序控制产生正弦波、三角波、方波和锯齿波四种常用低频信号。

可以通过键盘选择波型和输入波形幅值。

另外,采用KEIL,以达到验证作品功能的目的,并且做出一块电路板。

 

关键词:

信号发生器;89S52;KEIL

 

 

目录

第一章设计的任务和要求4

1.1设计的基本要求4

1.2课题具体的工作内容4

第2章 系统总体设计5

2.1主要功能系统的性能指标5

2.2总体方案设计5

第3章 系统硬件设计6

3.1ADC0832与单片机的链接6

3.2键盘控制器zlg7289与单片机的连接7

3.3波形输出部分装置8

第4章 系统软件设计8

4.1信号频率数据采集程序8

4.1.1正弦波产生8

4.1.2三角波产生9

4.1.3方波产生10

4.1.4锯齿波的产生11

4.2zlg7289相关程序设计12

4.3波形切换程序13

4.4系统总的流程图14

第5章函数发生器的调试与测试14

5.1键值的测试14

5.2影响上限频率的因素和已完成的最大值分析16

六问题与改进17

1.实验中遇到的问题17

2.建议与改进17

附录(源程序)18

第一章设计的任务和要求

1.1设计的基本要求

(1)原始数据

1.正弦波的频率范围:

下限频率为0.1Hz,上限频率暂时不确定,但应尽量提高,并在实验报告中分析影响上限频率的因素和已完成的最大值。

2.输出正弦波中不能含有尖峰干扰。

3.输出正弦波峰峰值最大为5V、最小幅度自定,直流偏移为±2V。

5.扩展输出波形种类,如三角波、方波等,幅度和频率范围自定。

(3)工作要求:

1.组建基于单片机的函数发生器的总体结构框图;

2.根据设计测量范围和准确度要求,通过理论分析和计算选择电路参数;

3.根据操作功能要求,确定键盘控制功能;

4.按设计要求确定显示位数、指示类型和单位;

5.采用C语言编写应用程序并调试通过;

6.对系统进行测试和结果分析;

7.撰写论文。

1.2课题具体的工作内容

本设计采用89S52及其外围扩展系统,软件方面主要是应用C语言设计程序。

系统以89S52单片机为核心,配置相应的外设及接口电路,用C语言开发,组成一个多功能信号发生系统。

该系统的软件可运行于WindowsXP环境下,硬件电路设计具有典型性。

同时,本系统中任何一部分电路模块均可移植于实用开发系统的设计中,电路设计具有实用性。

本设计将完成以下几个方面的工作:

(1)选芯片,尽量满足一般工业控制要求、以增强其实用性。

(2)原理图设计在保证正确的前提下,尽量采用典型的电路设计。

(3)印制板设计既要精巧,又要便于摆放及测试。

(4)固化于单片机芯片中的软件采用模块设计,层次清楚,具有上电复位及初始化功能,具有很好的软件开发框架。

(5)掌握单片机仿真软件keil3的使用。

第2章 系统总体设计

2.1主要功能系统的性能指标

主要功能是实现利用单片机AT89C52和8位D/A转换芯片DAC0832共同实现正弦波,方波,三角波,锯齿波这四种常见波形的发生,并且可以接收外接键盘输入而在一定范围内改变频率。

可以在没有波形发生器的情况下仍然可以的到简单的正弦波,方波,三角波,锯齿波这四种常用的波,并且可以通过zlg7289及键盘显示模块,键盘可以实现对几种波形的切换,改变幅度,LED显示波的幅度。

主要性能指标正弦波的频率范围:

下限频率为0.1Hz,上限频率暂时不确定,但应尽量提高,并在实验报告中分析影响上限频率的因素和已完成的最大值;输出正弦波中不能含有尖峰干扰;输出正弦波峰峰值最大为5V、最小幅度自定,直流偏移为±2V。

2.2总体方案设计

系统总体框图设计

本系统是以单片机AT89C52和8位D/A转换芯片DAC0832以及zlg7289键盘及显示共同实现正弦波,方波,三角波,锯齿波这四种常见波形的产生及显示相互切换的功能。

第3章 系统硬件设计

3.1ADC0832与单片机的链接

本设计采用的时使用2片DAC0832.由其中一片的输出电压作为另一片的参考电压,这样就可以方便的控制最大输出电压。

两个ADC0832的连接方式如图3-11

图3-11

具体的对于本设计是把DAC0832

(1)的输出作为了ADCO832

(2)的参考电压,于是

输出信号的峰峰值可由DAC0832

(2)的所连接的运放的输出控制。

由于DAC0832存在的非线性,输出信号的幅值存在一定的误差。

在程序设计时,我们已经知道两片DAC0832的地址分别07fffH和0bfffH,因而欲给其赋值,我们只需要选定其地址,然后将所需要的数值传到即可。

3.2键盘控制器zlg7289与单片机的连接

本设计的7289键盘及显示模块链接如图3-6

7289的CS,CLK,DIO,KEY端分别和单片机的P1.0,P1.1,P1.2,P1.3相连,通过程序达到由单片机从7289读入信息和控制的目的

3.3波形输出部分装置

通过DAC0832的输出控制左边的放大器的输出电压,同时左边这片放大器的输出电压接到另一片DAC0832的VREF端作为另一片DAC0832的参考电压,这样,当我们通过改变第一片DAC0832的输出的时候,我们就可以改变由第二片输出的函数的幅值,从而达到我们的目的

第4章 系统软件设计

4.1信号频率数据采集程序

本设计将各种波形的数据固定在单片机的程序存储器里,通过改变这些数据的输出速度来改变信号的频率,然后通过改变D/A转换器的参考点要来改变信号的峰峰值,电路较为简单,成本较低。

4.1.1正弦波产生

我们采用直接输入正弦波的采样点,然后在正弦波的产生程序中,依次调用这写采样点即可

正弦函数采样点如下,我们将其保存在一个数组中:

一共256个点

ucharconstcodesin_code[256]={

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,0xff,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,0x9c,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,0x4,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,0x63,0x66,0x69,0x6c,0x6f,0x73,0x76,0x79,0x7c};

正弦函数产生函数如下:

DAC0832_2=sin_code[cnt];

cnt++;

 

4.1.2三角波产生

1.产生三角波的原理

设个自变量i让它不断地自加1,直到加到255时,t=i,对t进行不断地自减一直到减到t=0,然后再不断地重复上述过程进而产生三角波。

2.程序流程图见图4-1

图4-1三角波流程图

3.程序

if(cnt<128)

{

DAC0832_2=(uchar)((float)(cnt)*0xff/255);

cnt++;

}

else

{DAC0832_2=255-(uchar)((float)(cnt)*0xff/255);

cnt++;

}

4.1.3方波产生

1.产生方波的原理

设个自变量i=0使之延时一段时间,再另i=255时在延时与i=0相同的时间,然后在重复上述过程。

2.方波流程图见图4-2

图4-2方波流程图

3.程序

if(cnt<128)

{

DAC0832_2=0x00;

cnt++;

}

else

{

DAC0832_2=0xff;

cnt++;

4.1.4锯齿波的产生

1.产生锯齿波的原理

锯齿波中的斜线用一个个小台阶来逼近,在一个周期内从最小值开始逐步递增,当达到最大值后又回到最小值,如此循环,当台阶间隔很小时,波形基本上近似于直线。

适当选择循环的时间,可以得到不同周期的锯齿波。

锯齿波发生原理与方波类似,只是高低两个延时的常数不同,所以用延时法,来产生锯齿波,设个自变量i让它不断地自加1,直到加到255,DAC0832可以又自动归0,然后再不断地重复上述过程进而产生锯齿波。

2.程序流程图见图4-3

图4-3锯齿波流程图

3.程序

DAC0832_2=(uchar)((float)(cnt)*0xff/255);

cnt++;

4.2zlg7289相关程序设计

程序流程图如下:

具体7289程序要用到一些其专用的命令,具体程序见附录中程序代码及注释,此处不再复述。

4.3波形切换程序

我们采用的是利用中断程序来切换波形,通过利用定时器/计数器在计数达到满值之后所产生中断来进入中断程序;再通过按键来改变程序中某一个变量的取值,进而利用不同取值,在中断程序中所对应的函数发生程序的不同来产生不同的波形。

具体见附录程序代码及注释

4.4系统总的流程图

具体见附录中程序代码及注释

第5章函数发生器的调试与测试

简单系统硬件的调试通常采用载入简单的测试程序并运行,使用数字表或示波器观察;对有些硬件例如显示器、键盘等可直接编入程序观察程序执行状态。

5.1键值的测试

对于新给定的一个ZLG7289及键盘是,我们应当首先确定每个按键的键值,只有当我们确定键之后,才可以对我们所要设置的按键的功能通过真正做到使软硬件相结合在一起,实现我们的目标功能,真是我们可以利用系统的显示部分也即就是系统的LED,我们通过假设法使出本系统的键值。

一般对于设计心得系统我们都可以采用这种方法,因为现在是人性化社会每个设计都有自己的特色,在设计中我们的充分利用系统为我们所提供的一些显而易见的东西来完成我们所打算实现的功能。

例如LED与键盘我们为了知道每个键值,而利用LED的显示最终确定出每个键值。

(从下到上,从右到左)

对于设计十六个按键及功能见表5-1

表5-1

KEY

作用

0X06

0

0X0E

1

0X16

2

0X1E

3

0X26

4

0X2E

5

0X36

6

0X3E

7

0X07

8

0X0F

9

0X17

小数点

0X1F

幅度设置

0X27

波形切换

0X2F

Reset

0X37

确定键

0X3F

无功能

 

对于键盘作用说明如下:

1.波形切换按键

我们用波形切换键被按下的次数来区分输出何种波:

初始时产生锯齿波

按键被按下一次为正弦波

按键被按下两次为方波

按键被按下四次次为三角波

2.幅值设定

运行后,首先应显示锯齿波。

之后,欲设定幅值,先按“幅值设置”键——数码管显示“A”——输入幅值——“确定”

电压峰值测试数据如表

电压峰值测试数据

设定电压(V)

示波器测试电压值(V)

2

2.0

4

4.0

6

6.0

8

8.0

10

10.0

12

12.0

14

12.0

5.2影响上限频率的因素和已完成的最大值分析

在程序中我们采用的是中断的方式来产生波形上的每一个点。

具体是利用定时器0,在模式1下,设定初值,然后开始计数,在数值达到ffffH的时候产生中断。

在终端程序中,我们放置波形产生的函数。

因而,波形频率的大小决定于我们所设定初值的大小。

 

如果我们把初值设定为0xf000H,那么我们最终得到的正弦波的频率是2.68Hz

如果我们把初值设定为0xffffH,那么我们最终得到的正弦波的频率是36.87Hz

六问题与改进

1.实验中遇到的问题

实验中遇到很多问题,主要问题归纳为以下三点:

实验中遇到的第一个问题就是当按下不同的键后,其键值和理论所对应的键值不一样,比如我们按下键值应该是0x3F键值的键后,rebuf中显示的键值是0x38,当按下0x37键值所对应的键后,rebuf中显示的是0x30。

并且上一排按键和下一排按键所对应的键值是一样的。

比如,0x3F和0x3E所对应的键值都是0x38;我们最终求教于金老师,最后在金老师的帮助下我们发现使我们的阻排的方向焊接反了,导致以上的情况。

在重新焊接阻排之后,按键的键值恢复正常。

实验中遇到的第二个问题就是我们的八个数码管不管怎么样都亮不了,即便是发送测试指令使其闪烁也不亮,经过和其他同学讨论我们发现另一组同学也有也遇到了类似的问题。

在求教于金老师之后,我们发现是因为我们所用的数码管不能由7289驱动,最终我们换了八个数码管之后,数码管的显示恢复了正常。

实验中第三个主要的问题就是发现其中有一片DAC0832不论输给其多大的数值,转换过来的模拟信号的大小都不发生改变。

但是另一片DAC0832还能产生正常的函数波形。

我们依次交换了DAC和与其相连的两片运放,最后发现是其中的一片运放工作不正常导致。

2.建议与改进

我们所设计的波形发生器还远远不够,距离我们实验室和现实生活中所用到的函数发生器还相去甚远。

1.我们的函数的频率没法调整,频率只能由程序代码中的中断来决定,而在程序烧入单片机后,函数的频率就是定值,没法改变。

2.函数的幅值改变范围非常有限:

因为函数波形最终是由运放产生,基于运放的饱和电压,函数的幅值不可能太高。

我们使用的运放供电电源电压是12V,因而,函数波形幅值最大值不会超过12V,这一点也极大的限制了其应用范围。

附录(源程序)

#include

#include

#include

#defineucharunsignedchar

#defineDAC0832_1XBYTE[0x7fff]

#defineDAC0832_2XBYTE[0xbfff]

sbitCS=P1^0;

sbitCLK=P1^1;

sbitDIO=P1^2;

sbitKEY=P1^3;

ucharrebuf,sebuf;

ucharamp=0x80;

ucharnumber;

uchardis_bit=0;

ucharvalid=0;

ucharfun=1;

ucharcnt=0;

uchartl=0x00,th=0xf0;

bdataucharcom_data;

sbitmos_bit=com_data^7;

sbitlow_bit=com_data^0;

ucharc_max=255;

ucharconstcodesin_code[256]={

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,0xff,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,0x9c,

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,0x4,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,0x63,

0x66,0x69,0x6c,0x6f,0x73,0x76,0x79,0x7c

};

voiddelay_50us()

{uchari;

for(i=0;i<6;i++){;}

}

voiddelay_8us()

{uchari;

for(i=0;i<1;i++){;}

}

voiddelay_50ms()

{uchari,j;

for(j=0;j<50;j++)

for(i=0;i<125;i++){;}

}

voidsend(ucharsebuf)

{

uchari;

com_data=sebuf;

CLK=0;

CS=0;

DIO=0;

delay_50us();

for(i=0;i<8;i++)

{

delay_8us();

DIO=mos_bit;

CLK=1;

delay_8us();

com_data=com_data<<1;

CLK=0;

}

DIO=0;

}

voidreceive()

{

uchari;

CLK=1;

delay_50us();

for(i=0;i<8;i++)

{

com_data=com_data<<1;

low_bit=DIO;

CLK=1;

delay_8us();

CLK=0;

delay_8us();

}

rebuf=com_data;

DIO=0;

CS=1;

}

voidreset()

{KEY=1;

DIO=1;

delay_50ms();

send(0xa4);

CS=1;

}

voidtime0_int(void)interrupt1//中断函数

{

TR0=0;

TH0=th;

TL0=tl;

TR0=1;

if(fun==0)//锯齿波

{

DAC0832_1=amp;

DAC0832_2=(uchar)((float)(cnt)*0xff/255);

cnt++;

}

elseif(fun==1)

{//正弦波

DAC0832_1=amp;

DAC0832_2=sin_code[cnt];

cnt++;

}

elseif(fun==2)

{//三角波

DAC0832_1=amp;

if(cnt<128)

{

DAC0832_2=(uchar)((float)(cnt)*0xff/255);

cnt++;

}

else

{DAC0832_2=255-(uchar)((float)(cnt)*0xff/255);

cnt++;

}

}

elseif(fun==3)

{

DAC0832_1=amp;//方波

if(cnt<128)

{

DAC0832_2=0x00;

cnt++;

}

else

{

DAC0832_2=0xff;

cnt++;

}

}

}

voiddown0_show(uchardis_bit)//按方式0译码

{

send(0xa1);//左移

send(0x80|dis_bit);//

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 经管营销

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1