文档库 最新最全的文档下载
当前位置:文档库 › 正弦波,方波,三角波的发生电路设计

正弦波,方波,三角波的发生电路设计

正弦波﹑方波﹑三角波的发生电路设计

摘要现今世界中电子技术与电子产品的应用越加广泛,人们对电子技术的要求也越来越高。因此如何根据实际要求设计出简便实用的电子技术物品便显得尤为重要。灵活、快速的选用不同特征的信号源成了现代测量技术值得深入研究的课题。能将简单的易获取的信号转换为自己所需的复杂信号是一项必不可少的技术。我们有必要做好这相关方面的研究,为被测电路提供所需要的信号及各种波形,以便完成各种相关试验。信号源在各种试验应用和实验测试处理中,仿真各种测试信号,提供给被测电路,用来满足实验的各种要求。

关键词:单片机,信号发生器,波形

ABSTRACT:The application of electronic technology and electronic products in today's world increasingly extensive, people also more and more high to the requirement of electronic technology. According to actual requirements so how to design simple and practical electronic technology items, it becomes very important. Flexible, fast, choose different characteristics of the signal source is worth studying deeply the modern measuring technology. Can be simple, easy to obtain signal can be converted into their complex signal is an essential technology. It is necessary for us to do the related research, to provide the required signal circuit under test and various waveform, to complete various related experiment. Signal source in various test application and test processing, simulation of testing signal, provided to the circuit under test, to satisfy the requirements of the experiments.

KEY WORDS:Microcontroller, signal generator, waveform

目录

第一章前言 (5)

1.1 课题研究背景 (5)

1.2 波形介绍 (5)

1.2.1正弦波 (5)

1.2.2三角波 (6)

1.2.3方波 (6)

1.3硬件介绍 (7)

1.3.1 AT89C51单片机 (7)

1.3.2 DAC0832转换器 (7)

第二章发生电路设计原理 (9)

2.1功能和基本原理 (9)

2.2红外电路 (9)

2.3复位电路 (10)

2.4LCD显示部分电路 (10)

2.5电源部分 (11)

2.6外部时钟电路 (11)

2.7显示接口电路 (11)

2.8独立按键部分 (12)

2.9波形转换电路 (12)

2.10串口通信模块 (13)

第三章软件设计 (15)

3.2 键盘中断子程序 (21)

3.3系统初始化子程序 (21)

第四章系统仿真 (22)

4.1仿真电路图 (22)

4.2输出波形图 (22)

4.2.1、测量仪器及测试说明 (22)

4.2.2测试过程 (22)

4.2.3、测试结果 (24)

第五章结束语 (25)

参考文献 (26)

附录 (27)

致谢 (28)

第一章前言

1.1 课题研究背景

函数信号发生器是一种常用信号源。通常能够产生正弦波、方波、三角波等多种波形,因其时间波形可用某种时间函数来描述而得名。函数信号发生器在电路实验和设备检测中具有十分广泛的应用,密切地联系着工业、农业、生物医学等产业,并对它们的发展起到极大的促进作用。

伴随着单片机技术的快速发展与普遍应用,函数信号发生器的性能和性价比将会有更大的提升空间。基于单片机的函数信号发生器将为智能化生活提供实质的帮助。

1.2 波形介绍

1.2.1正弦波

正弦信号可用如下形式表示:f (t)=A sin(ωt+θ ),其中,A 为振幅,ω是角频率,θ为初相位。正弦函数为一周期信号如下图1所示:

图1 正弦波

1.2.2三角波

三角波波形如下图2所示:

图2 三角波

1.2.3方波

方波函数是我们常用且所熟知的简单波形函数,做脉冲等,其表示形式如下:

方波波形如下图3所示:

图3 方波

当方波下半段幅值为0时,就为矩形波,一个原理,所以不再赘述矩形波。

1.3硬件介绍

1.3.1 AT89C51单片机

1.AT89C51单片机的简介

AT89C51单片机是一种带4 k字节的闪存(FPEROM - FLASH编程和可擦只读存储器)的低电压、高性能CMOS 8位微处理器。AT89C2051是一种带2 k字节flash可编程单片机可擦除只读存储器(ROM)。单片机可擦除只读存储器可以抹去反复1000次。该设备采用ATMEL高密度非易失存储器制造技术,和行业标准的MCS - 51指令集和输出管兼容。由于多功能8位CPU和闪存在单一芯片,ATMEL AT89C51单片机的结合是一种有效的微控制器,AT89C2051的精简版本。AT89C51为许多嵌入式控制系统提供了一个解决方案概述高灵活性和低价格的特点。能够提供以下标准特性:4 k字节的Flash闪存,128字节的内部RAM,32个I / O端口线,两个16位定时器/计数器,一个两个阶段5向量中断结构、全双工串行通信端口,芯片上的时钟振荡器电路及时。同时,AT89C51单片机静态逻辑运算可以减少到0赫兹,和两个软件支持可选的节能工作模式。免费停止CPU的工作方式,但是允许RAM,定时器/计数器,串行通信端口和中断系统继续工作。电方式节省内存的内容,但振荡器停止工作和其他工作,直到下一个硬件复位所有部分。

2.AT89C2051的功能

单片机各功能部件的运行都是以时钟频率为基准的,有条不紊地进行工作。因而时钟频率直接影响单片机的速度,时钟电路的质量也直接影响单片机系统的稳定性。常用的时钟电路方式有两种:一种是内部时钟方式,一种是外部时钟方式,这里采用的是内部时钟方式,外接晶振。时钟电路由片外晶体、微调电容和单片机的内部电路组成。选取频率为11.0592MHz的晶振,微调电容是瓷片电容。

89S52单片机的P0.7口作为波形输出口,若接示波器,则可通过示波器来观察波形,是一个矩形波。

1.3.2 DAC0832转换器

1. DAC0832转换器的简介

DAC0832DAC0832是8分辨率的D/A转换集成芯片。与微处理器完全兼容。这个DA 芯片以其价格低廉、接口简单、转换控制容易等优点,在单片机应用系统中得到广泛的应用。D/A转换器由8位输入锁存器、8位DAC寄存器、8位D/A转换电路及转换控制电

路构成。

2. DAC0832的功能

(1)分辨率

它反映了最小输出模拟电压值的变化。定义为满量程输出电压之比2 n,其中n位DAC。分辨率有一定的与数字量的输入数字的关系。全系列的5 v,使用8位DAC,分辨率为5 v / 256 = 19.5 mV;当使用DAC分辨率为5 v / 1024 = 4.88 mV。显然,位数越高分辨率越高。

(2)建立时间

建立时间是描述DAC转换速度快慢的参数。定义为从输入数字量变化到输出达到终值误差±1/2 LSB(最低有效位)所需的时间。

(3)接口形式

接口是DAC的输入/输出特性。包括输入数字量的形式:十六进制或BCD,是否输入。 DAC0832是使用一个非常常见的8 D / A转换器,因为它和输入数据寄存器,它可以直接与单片机接口。

DAC0832输出电流的形式,需要时将可以外部运算放大器的电压输出。属于系列芯片和DAC0830 DAC0831,它们可以相互替换。根据数据输入过程中,有三种单片机和DAC0832连接方式:二级缓冲单级缓冲的连接方法连接模式,直接连接。

第二章发生电路设计原理

2.1功能和基本原理

AT89C51外接12M晶振作为时钟频率,设计并使用功率降低。使用电复位复位电路,其工作原理是,得电,相当于电容的两端短路,因此TST引脚为高电平,那么电容器充电。RST端电压下降缓慢,在一定程度上,是低水平,单片机就开始工作。产生方波计划:低于100赫兹的频率,根据定时器溢出时间1us,定时器溢出时代的等效频率值,当达到规定的数量,达到的状态的方波的输出接脚; 对于大于100HZ的频率,直接根据频率值设置其定时溢出的时间,当溢出时间达到时,将输出管脚取反达到方波的产生。产生三角波计划的想法:产生峰值电压5 v的三角波,一个周期需要时间510次,可以计算每次溢出的时间,然后每次加权可以实现三角波电压波形;生成正弦波程序理念:设定一个周期的正弦波表,通过20个数据,相当于255倍,每个周期时间,时间可以计算为每个时间的溢出,每个点可以得到电压加权正弦电压,即正弦波的形成。

2.2红外电路

红外的工作原理:51单片机对遥控的解码和我们前面所讲的串口并口通信不同,他不是单纯的用高电平代表1,低电平代表0。这一点大家要从思想上面转变过来。他是发送一连串的数据帧,这个数据帧就是一连串的二进制代码,单片机通过区分高电平的持续时间来区别红外编码的。我们就以HC6800单片机上的红外接头为例来说明,当高电平的脉冲宽度为1.12ms的时候单片机认为它为0,当高电平的脉冲宽度为2.25的时候单片机认为它为1。单片机是通过判断脉冲的宽度来得到信息位为0还是为1的。根据各部分的功能。可将它们分为5部分,分别为引导码、地址码、地址码、数据码、数据反码。遥控器发射代码时.均是低位在前。高位在后。分析可以得到.引导码高电平为4.5ms,低电平为4.5ms。当接收到此码时.表示一帧数据的开始。单片机可以准备接收下面的数据。地址码由8位二进制组成,共256种。地址码重发了一次。主要是加强遥控器的可靠性.如果两次地址码不相同.则说明本帧数据有错.应丢弃。不同的设备可以拥有不同的地址码.因此。同种编码的遥控器只要设置地址码不同,也不会相互干扰。在同一个遥控器中.所有按键发出的地址码都是相同的。数据码为8位,可编码256种状态,代表实际所按下的键。数据反码是数据码的各位求反,通过比较数据码与数据反码.可判断接收到的数据是否正确。如果数据码与数据反码之间的关系不满足相反的关系.则本次遥控接收有误.数据应丢弃。在同一个遥控器上.所有按键的数据码均不相同。数据码为十六进制的0CH,数据反码为十六进制的0F3H(注意低位在前).两者之

和应为0FFH。

2.3复位电路

这种复位电路的工作原理是:单片机的复位电路在刚接通电时,刚开始电容是没有电的,电容内的电阻很低,通电后,5V的电通过电阻给电容进行充电,电容两端的电会由0V慢慢的升到4V左右(此时间很短一般小于0.3秒),RC构成的微分电路在上电瞬间产生一个微分脉冲,其宽度大于两个机器周期,89C51将复位。正因为这样,复位脚的电由低电位升到高电位,引起了内部电路的复位工作,RST端电压慢慢下降,降到一定电压值以后,即为低电平,单片机开始正

常工作(这是单片机的上电复位,也叫初始化复位);当按下复位键时,电容两端放电,电容又回到0V了,于是又进行了一次复位工作(这是手动复位原理)。下图4为复位电路

图4复位电路

2.4LCD显示部分电路

为了节约成本,采用1602来作为显示器,用独立按键来控制不同的显示,能完成基本的显示功能。

图5 LCD液晶显示电路

2.5电源部分

本电源设计了两个接口,方便不同接口的电源接入,并且在电源部分加上滤波电容,起过滤接入电源的杂波的作用,为了电路中得到+12V、-12V和+5V的直流工作电压,用变压器变压后再通过芯片和电容设计出所需要的电路。

图6电源电路

2.6外部时钟电路

图7采用11.0592MHz的晶振和两个22pf的电容组成时钟电路部分

图7外部时钟电路

2.7显示接口电路

功能:驱动Led液晶显示器,扫描按钮。

LCD1602液晶显示和一个矩阵的按钮。按键时, 通过P2口将数字信号发送到LCD1602,LCD1602显示液晶点阵设计,如字母、数字、符号,其外部电压5 v。扫描通过使用软件程序实现,当按键时,立即扫描发现,立即调用子程序,执行相应的功能。与单片机连接如图8所示:

图8 部分电路图

2.8独立按键部分

图9为用独立按键来控制不同的输出波形

图9独立按键

2.9波形转换电路

功能:转换波形样本值编码模拟值,完成波形的输出。由一块DAC0832和LF356运放。

DAC0832是两个输入数据寄存器的8位DAC。当前生产的DAC芯片分为两种,一种是芯片内部数据寄存器设置,不需要外加电路,就可以直接与微机接口连接。另一种类型的芯片没有数据寄存器、输出信号变化状态的数据输入行,所以你不能直接与微机接口连接,必须通过并口与微机接口相连。DAC0832 有20条引线的双列直插式CMOS设备,里面有两个级别的数据寄存器,完成8位 D / A转换,且不需要额外的电路。DAC0832是电流输出类型,在示波器上显示波形,通常需要电压信号和电流信号,电压信号的转换可以使用运算放大器LF356实现。

单片机发送DAC0832数字编码,生成不同的输出。先利用采样定理对各种波形进行抽样,然后把各种采样值进行编码,收到的数字量存入各个波形表,执行程序时通过查表的方法依次取出,D / A转换后输出波形可以计算出来。假如N个点构成波形的一个周期,DAC0832输出N个样本值,样本点能形成一个轨迹,即,一个周期。重复输出N点之后,成为第二个周期。利用单片机的晶振控制输出周期的速度,也就是控制输出的波形的频率。从而控制输出波形和振幅和频率,如正弦波,取20个样值点。具体连接的电路图如图10所示:

示:

图10 D/A转换的电路连接图

2.10串口通信模块

图11中通过MAX232进行TTL电平和232电平转换,从而单片机和上位机之间通信提供通道。

图11串口通信电路

通信电路的目的就是让通信双发的电平匹配,单片机用的是TTL电平,上位机的串口用的是232电平。TTL电平的逻辑1的电压范围是+3.3V到+5V,逻辑0的电压范围是0到+3.3V;232电平的逻辑1的电压范围是-15V到-5V,逻辑0的电压范围是+5V到+15V。因此设计串口通信电路就是让这两种电平统一。

第三章软件设计

信号发生器的软件设计包括主程序、延时子程序、系统初始化程序、键盘中断子程序、定时器中断子程序。

3.1 主程序

#include

unsigned char i,sqar_num=128; //最大值100,默认值50

unsigned char cho=0; //0:正弦波。1:方波。2:三角波。

unsigned char num=0;

unsigned char TIME0_H=0xff,TIME0_L=0xd9; //定时器0的初值设置;

全局变量.对应正弦波

sbit chg= P1^0; //三角波100Hz.

sbit freq_u=P1^1;

sbit freq_d=P1^2;

sbit duty_u=P1^3;

sbit duty_d=P1^4;

sbit cs =P3^7;

bit flag=0;

unsigned int FREQ=50;//初始化频率,50HZ

sbit rs=P3^5;

sbit lcdcs=P3^0;

unsigned char TempBuffer[7];

unsigned char value1[]={"Frequency:"};

void delay(unsigned int ms)

{

unsigned int i,j;

for (j=0;j

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

}

unsigned char code sin_num[]={

0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 2, 2, 2,

2, 3, 3, 4, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9,

10, 10, 11, 12, 12, 13, 14, 15, 15, 16, 17, 18,18, 19, 20, 21,

22, 23, 24, 25, 25, 26, 27, 28, 29, 30, 31, 32,34, 35, 36, 37,

38, 39, 40, 41, 42, 44, 45, 46, 47, 49, 50, 51,52, 54, 55, 56,

57,59,60, 61, 63, 64, 66, 67, 68, 70, 71, 73, 74, 75, 77, 78,

80,81,83, 84, 86, 87, 89, 90, 92, 93, 95, 96, 98, 99, 101,102,

104,106,107,109,110,112,113,115,116,118,120,121,123,124,126, 128, 129, 131, 132, 134, 135, 137, 139, 140, 142,

143, 145, 146, 148, 149, 151, 153,

154, 156, 157, 159, 160, 162, 163, 165, 166, 168, 169, 171, 172, 174, 175, 177,

178, 180, 181, 182, 184, 185, 187, 188, 189,

191, 192, 194, 195, 196, 198, 199,

200, 201, 203, 204, 205, 206, 208, 209, 210,

211, 213, 214, 215, 216, 217, 218,

219, 220, 221, 223, 224, 225, 226, 227, 228,

229, 230, 230, 231, 232, 233, 234,

235, 236, 237, 237, 238, 239, 240, 240, 241,

242, 243, 243, 244, 245, 245, 246,

246, 247, 247, 248, 248, 249, 249, 250, 250,

251, 251, 251, 252, 252, 253, 253,

253, 253, 254, 254, 254, 254, 254, 255, 255,

255, 255, 255, 255, 255, 255, 255

};

//调节部分--频率

void freq_ud(void)

{

unsigned int temp;

if(freq_d==0)

{ FREQ--; }

else if(freq_u==0)

{ FREQ++; }

if(cho==1|cho==3) //三角波256次中断一周期,特殊处理下。否则他的频率是100(+\-)n*2Hz.

{

temp=0xffff-3906/FREQ; //方波,三角波默认为100hz,切换后频率也为50HZ 65336-10^6/(256*FREQ)

TIME0_H=temp/256;

TIME0_L=temp%256;

}

else if(cho==0|cho==3)//正弦波三角波默认周期50hz 65536-10^6//(512*FREQ)

{

temp=0xffff-1953/FREQ;

TIME0_H=temp/256;

TIME0_L=temp%256;

}

}

//调节部分--方波的占空比

void duty_ud(void) //方波也采用512次中断构成一个周期。

{

if(duty_d==0&sqar_num>0)

sqar_num--;

else if(duty_u==0&sqar_num<255)

sqar_num++;

}

//波形发生函数

void sint(void)

{

if(!flag)

{

cs=0;P2=sin_num[num++];cs=1;

if(num==0){num=255;flag=1;}

}

else if(flag)

{

cs=0;P2=sin_num[num--];cs=1;

if(num==255){num=0;flag=0;}

}

}

void square(void)

{

if(i++

}/*

void triangle(void)

{

cs=0;P2=num++;cs=1;

} */

void triangle(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;

lcdcs=1;

lcdcs=0;

}

void write_data(unsigned char data0)

{

rs=1;

P0=data0;

lcdcs=1;

lcdcs=0;

}

void init_1602()

{

delay(15);

write_command(0x38);

delay(5);

write_command(0x0c);

delay(5);

write_command(0x06);

delay(5);

}

//1602显示结束

/*******************频率值转换为字符串**********************/ void temp_to_str()

{

TempBuffer[0]=FREQ/1000+'0'; //千位

TempBuffer[1]=FREQ%1000/100+'0'; //百位

TempBuffer[2]=FREQ%1000%100/10+'0';//十位

TempBuffer[3]=FREQ%1000%100%10+'0';//个位

TempBuffer[4]='H';

TempBuffer[5]='Z';

TempBuffer[6]='\0';

}

/*******************频率显示*****************/

void show_frequency()

{

unsigned char i;

//init_1602();//初始化lcd

write_command(0x8a);//液晶显示位置

temp_to_str();

/*for (i=0;i

{

write_data(value1[i]);

delay(5);

}*/

for (i=0;i

{

write_data(TempBuffer[i]);

delay(5);

}

}

void main()

{

TMOD=0X01;

TH0=0xff;

TL0=0xd9;

IT0=1; //设置中断触发方式,下降沿

EA=1;

EX0=1;

ET0=1;

IP=0X01; //键盘中断级别高

init_1602();//初始化lcd

write_command(0x80);//液晶显示位置

delay(5);

for (i=0;i

{

write_data(value1[i]);

delay(5);

}

TR0=1;

while(1)

{

show_frequency();

}

}

//按键中断处理程序。

void it0() interrupt 0

{

if(chg==0) {FREQ=50; if(++cho==3) {cho=0;num=0;} } //num=0;所有数据从新开始,保证波形的完整性

相关文档
相关文档 最新文档