资源描述
- -
基于单片机和dac0832的波形发生器
目录
一、 容摘要
二、 设计任务
三、 元器件说明
四、 硬件电路设计
五、 程序编译
一、容摘要
波形发生器是一种常用的信号源,广泛的应用于电子电路、自动控制系统和教学实验等领域,是现代测试领域应用最为广泛的通用仪器之一。在研制、生产、测试和维修各种电子元件、部件以及整机设备时,都需要有信号源。由它产生不同频率不同波形的电压、电流信号并加到被测器件或设备上,用其他仪器观察。测量被测仪器的输出响应,以分析确定它们的性能参数。信号发生器是电子测量领域中最根本、应用最为广泛的一类电子仪器。它可以产生多种波形信号,如方波、锯齿波、三角波等,因而广泛应用于通信、雷达、导航、宇航等领域。
本次课程设计使用的AT89C51单片机构成的发生器可产生三角波,正弦波和方波,波形的周期可用程序改变,并可根据需要选择单极性输出或双极性输出,具有线路简单、构造紧凑、性能优越等特点。此设计给出了源代码,通过仿真测试,其性能指标到达了设计要求。
二、设计任务
利用DAC0832输出正弦波信号〔用示波器观察输出波形〕,初始频率为50Hz,变频采用“+〞、“-〞键控制,实时测量输出信号的频率值,并分析和实测输出信号的频率围。具体完成以下任务:
1. 完成系统的方案设计,给出系统框图。
2. 完成系统的硬件设计,给出硬件电路图和系统资源分配表。
3. 完成系统的软件设计,给出程序流程图和程序编写。
4. 运用Proteus仿真软件对所设计的系统进展调试和仿真,直到预定的功能全部仿真通过,给出仿真结果。
5. 准确、高质量地进展印刷电路板的焊接。
6. 完成课程设计报告。
三、元器件说明
u 知识简介:
DAC0832当今世界在以电子信是8位分辨率的D/A转换集成芯片,与微处理器完全兼容,这个系列的芯片以其价格低廉、接口简单、转换控制容易等优点,在单片机应用系统中得到了广泛的应用。这类D/A转换器由8位输入锁存器,8位DAC存放器,8位DA转换电路及转换控制电路构成。
1、DAC0832的引脚及功能:
DAC0832是8分辨率的D/A转换集成芯片。与微处理器兼容。这个DA芯片以其价格低廉、接口简单、转换控制容易等优点,在单片机应用系统中得到广泛的应用。D/A转换器由8位输入锁存器、8位DAC存放器、8位D/A转换电路及转换控制电路构成。
u 应用特性:
·DAC0832是微处理器兼容型D/A转换器,可以充分利用微处理器的控制能力实现对D/A转换的控制。这种芯片有许多控制引脚,可以和微处理器控制线相连,承受微处理器的控制,如ILE、/CS、/WR1、/WR2、/XFER端。
·有两级锁存控制功能,能够实现多通道D/A的同步转换输出。
·DAC0832部无参考电压源;须外接参考电压源。
·DAC0832为电流输入型D/A转换器,要获得模拟电压输出时,需要外加转换电路。
u 各引脚功能说明:
D0~D7:8位数据输入线,TTL电平,有效时间应大于90ns(否那么锁存器的数据会出错);
ILE:数据锁存允许控制信号输入线,高电平有效;
CS:片选信号输入线〔选通数据锁存器〕,低电平有效;
WR1:数据锁存器写选通输入线,负脉冲〔脉宽应大于500ns〕有效。由ILE、CS、WR1的逻辑组合产生LE1,当LE1为高电平时,数据锁存器状态随输入数据线变换,LE1的负跳变时将输入数据锁存;
XFER:数据传输控制信号输入线,低电平有效,负脉冲〔脉宽应大于500ns〕有效;
WR2:DAC存放器选通输入线,负脉冲〔脉宽应大于500ns〕有效。由WR2、XFER的逻辑组合产生LE2,当LE2为高电平时,DAC存放器的输出随存放器的输入而变化,LE2的负跳变时将数据锁存器的容打入DAC存放器并开场D/A转换。
IOUT1:电流输出端1,其值随DAC存放器的容线性变化;
IOUT2:电流输出端2,其值与IOUT1值之和为一常数;
Rfb:反应信号输入线,改变Rfb端外接电阻值可调整转换满量程精度;
Vcc:电源输入端,Vcc的围为+5V~+15V;
VREF:基准电压输入线,VREF的围为-10V~+10V;
AGND:模拟信号地
DGND:数字信号地
u DAC0832三种数据输入方式:〔1〕双缓冲方式:即数据经过双重缓冲后再送入D/A转换电路,执行两次写操作才能完成一次D/A转换。〔2〕单缓冲方式:不需要多个模拟量同时输出时,可采用此种方式。
〔3〕直通方式:此时两个存放器均处于直通状态,因此要将、、和端都接数字地,ILE接高电平,使LE1、LE2均为高电平,致使两个锁存存放器同时处于放行直通状态,数据直接送入D/A转换电路进展D/A转换。
2. CPU芯片—AT89C51
1.AT89C51概述
AT89C51是一种带4K字节闪烁可编程可擦除只读存储器的低电压,高性能CMOS8位微处理器,俗称单片机。单片机的可擦除只读存储器可以反复擦除1000次。该器件采用ATMEL高密度非易失存储器制造技术制造,与工业标准的MCS-51指令集和输出管脚相兼容。
2. AT89C51引脚说明
AT89C51单片机引脚图如图3-2所示。它有40个引脚,其中包含2个专用于主电源的引脚,2个外接晶体的引脚,4个控制或与其它电源复用的引脚,以及32条输入输出I/O引脚。
四、设计原理
D/A转换器产生各种波形的原理:利用D/A转换器输出的模拟量与输入数字量成正比关系这一特点,将D/A转换器作为微机输出接口,CPU通过程序向D/A转换器输出随时间呈现不同变化规律的数字量,那么D/A转换器就可输出各种各样的模拟量,如方波、三角波、锯齿波、正弦波等。
仿真电路图〔输出正弦波、三角波,锯齿波〕
仿真图:
三角波:
锯齿波:
正弦波:
五:程序编译
主程序:
#include<reg52.h>
sbit key2=P2^2;
sbit key1=P2^1;
sbit key0=P2^0;
char flag; //波型输出标置变量
bit time;
unsigned char i;
int num ;
void frequency() ;
void delay(int z) //延时 z毫秒
{
int x,y;
for(x=z;x>0;x--)
for(y=124;y>0;y--);
}
unsigned char sin(unsigned char x)//正弦波
{
unsigned char code sin_tab[]={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, 0xfd, 0xfe, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xfe, 0xfd, 0xfd, 0xfc, 0xfc, 0xfb, 0xfa, 0xf9, 0xf8, 0xf7,
0xf6, 0xf4, 0xf3, 0xf2, 0xf0, 0xef, 0xed, 0xec, 0xea, 0xe8, 0xe6, 0xe4, 0xe2, 0xe0, 0xde, 0xdc,
0xda, 0xd8, 0xd5, 0xd3, 0xd1, 0xce, 0xcc, 0xc9, 0xc7, 0xc4, 0xc1, 0xbf, 0xbc, 0xb9, 0xb6, 0xb3,
0xb0, 0xae, 0xab, 0xa8, 0xa5, 0xa2, 0x9f, 0x9c, 0x99, 0x96, 0x92, 0x8f, 0x8c, 0x89, 0x86, 0x83, 0x80,
0x80, 0x7d, 0x7a, 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, 0x0f, 0x0d, 0x0c, 0x0b,
0x09, 0x08, 0x07, 0x06, 0x05, 0x04, 0x03, 0x03, 0x02, 0x02, 0x01, 0x01, 0x00, 0x00, 0x00,
0x00, 0x01, 0x01, 0x02, 0x02, 0x03, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08 ,0x09, 0x0b, 0x0c, 0x0d,
0x0f, 0x10, 0x12, 0x13, 0x15, 0x17, 0x18, 0x1a, 0x1c, 0x1e, 0x20, 0x23, 0x25, 0x27, 0x2a, 0x2c,
0x2e, 0x30, 0x33, 0x35, 0x38, 0x3b, 0x3d, 0x3e, 0x40, 0x43, 0x46, 0x48, 0x4b, 0x4e, 0x51, 0x54,
0x57, 0x5a, 0x5d, 0x5f, 0x60, 0x63, 0x66, 0x69, 0x6b, 0x6d, 0x6f, 0x72, 0x74, 0x76, 0x78, 0x7a, 0x7e, 0x80};
return sin_tab[x];
}
void DAC0832(unsigned char x)
{
P1=x;
}
void main()
{
char d;
d=1;
TMOD=0X02;
num=10;
TH0=256-num; //num用来控制采样一个点所用的时间
TL0=256-num;
ET0=1; //按键接于外部中断0,与中断1
EA=1;
TR0=1;
flag=2; //开场时有输出
i=0;
while(1)
{
if(key2==0) //按一下key3,d自加1
{
delay(5);
if(key2==0)
{
while(!key2);
d++;
if(d==21)//当d=21,d变为1
d=1;
}
}
frequency() ;
if(time==1)
{
time=0;
if(i>255)
i=0;
else
i=i+d; //设置采样间隔
switch(flag) //当按键1的为输出三角波,按键2时输出正弦波
{
case 0:DAC0832(i);break;// 当flag=0时,锯齿波
case 1:
if(i>127)// 当flag=1时,三角波
DAC0832(255-i);
else
DAC0832(i);
break;
case 2: DAC0832(sin(i)); //当flag=2时,正弦波
break;
default: break;
}
}
}
}
void time0() interrupt 1
{
TH0=256-num;
TL0=256-num;
time=1;
}
void frequency()
{
if(key0==0) // //key0控制flag,频率选择
{
delay(5) ;
if(key0==0) //再次检测
{
while(!key0); //等待按键释放
flag++; //按一下加1
if(flag==3) //大于2返回0
flag=0;
}
}
if(key1==0) //检测P21是否按下
{
delay(5) ;
if(key1==0) //再次检测
{
while(!key1);
num=num+10; //按一下减10
if(num==250) //小于5,返回5
num=10;
}
}
}
- -.可修编- .
展开阅读全文