一,芯片介绍
DAC0832是8位的D/A转换集成芯片。与微处理器完全兼容。这个DA芯片以其价格低廉、接口简单、转换控制容易等优点,在单片机应用系统中得到广泛的应用。D/A转换器由8位输入锁存器、8位DAC寄存器、8位D/A转换电路及转换控制电路构成。
-
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:数字信号地。
根据对DAC0832的数据锁存器和DAC寄存器的不同的控制方式,DAC0832有三种工作方式:直通方式、单缓冲方式和双缓冲方式。
1、单缓冲方式。单缓冲方式是控制输入寄存器和DAC寄存器同时接收资料,或者只用输入寄存器而把DAC寄存器接成直通方式。此方式适用只有一路模拟量输出或几路模拟量异步输出的情形。
2、双缓冲方式。双缓冲方式是先使输入寄存器接收资料,再控制输入寄存器的输出资料到DAC寄存器,即分两次锁存输入资料。此方式适用于多个D/A转换同步输出的情节。
3、直通方式。直通方式是资料不经两级锁存器锁存,即 CS*,XFER* ,WR1* ,WR2* 均接地,ILE接高电平。此方式适用于连续反馈控制线路和不带微机的控制系统,不过在使用时,必须通过另加I/O接口与CPU连接,以匹配CPU与D/A转换。
DAC0832引脚功能电路应用原理图DAC0832是采样频率为八位的D/A转换芯片,集成电路内有两级输入寄存器,使DAC0832芯片具备双缓冲、单缓冲和直通三种输入方式,以便适于各种电路的需要(如要求多路D/A异步输入、同步转换等)。
(以上摘自百度)
二,功能实现
通过单片机查表方式输入相应的值到DAC0832中产生相应的波形,通过外接运放电路产生幅值可调的波形。(注:初版程序没有调节频率的功能)。
三,程序源码
#include "reg51.h"
#define uchar unsigned char
#define uint unsigned int
sbit Key_Saw=P2^0; //锯齿波按键.
sbit Key_Tran=P2^1; //三角波按键.
sbit Key_Square=P2^2; //方波按键.
sbit Key_Sin=P2^3; //正弦波按键.
uchar KeyValue;
uchar KeyValue1;
uchar KeyValue2;
uchar KeyValue3;
uchar KeyValue4;
void delay(void); //延时函数
uchar code tab[128]={
64,67,70,73,76,79,82,85,88,91,94,96,99,102,104,106,
109,111,113,115,117,118,120,121,123,124,125,126,126,
127,127,127,127,127,127,127,126,126,125,124,123,121,
120,118,117,115,113,111,109,106,104,102,99,96,94,91,
88,85,82,79,76,73,70,67,64,60,57,54,51,48,45,42,39,
36,33,31,28,25,23,21,18,16,14,12,10,9,7,6,4,3,2,1,
1,0,0,0,0,0,0,0,1,1,2,3,4,6,7,9,10,12,14,16,18,21,23,
25,28,31,33,36,39,42,45,48,51,54,57,60};
/*
* 函数名称:延时
* 参数: 无
* 返回值: 无
*/
void delay(void)
{
uchar i;
for(i=0;i<255;i++);
}
/*
* 函数名称:锯齿波
* 参数: 无
* 返回值: 无
*/
void Sawtooth_Wave(void)
{
uchar temp;
while(1)
{
if(KeyValue1==1)
{
for(temp=0;temp<255;temp++)
P0=temp;
}
else break;
}
}
/*
* 函数名称:三角波
* 参数: 无
* 返回值: 无
*/
void Triangular_Wave(void)
{
uchar i;
while(1)
{
if(KeyValue2==1)
{
for(i=0;i<255;i++)
P0=i;
for(i=255;i>0;i--)
P0=i;
}
else
break;
}
}
/*
* 函数名称:方波
* 参数: 无
* 返回值: 无
*/
void Square_Wave(void)
{
while(1)
{
if(KeyValue3==1)
{
P0=0x00;
delay();
P0=0xff;
delay();
}
else
break;
}
}
/*
* 函数名称:正弦波
* 参数: 无
* 返回值: 无
*/
void Sine_Wave(void)
{
uint i=0;
while(1)
{
if(KeyValue4==1)
{
if(++i==128)
i=0;
P0=tab[i];
}
else break;
}
}
/*
* 函数名称:处理函数
* 参数: 无
* 返回值: 无
*/
void Handler(void)
{
if(KeyValue)
{
switch(KeyValue)
{
case 0x01:
Sawtooth_Wave();
break;
case 0x02:
Triangular_Wave();
break;
case 0x03:
Square_Wave();
break;
case 0x04:
Sine_Wave();
break;
}
}
}
/*
* 函数名称:主函数
* 参数: 无
* 返回值: 无
*/
int main(void)
{
EA=1;
EX0=1;
while(1)
{
Handler();
}
return 0;
}
/*
* 函数名称:中断函数
* 参数: 无
* 返回值: 无
*/
void Inter0(void)interrupt 0 using 0
{
if(Key_Saw==0)
{
KeyValue=0x01;
KeyValue1=1;
KeyValue2=0;
KeyValue3=0;
KeyValue4=0;
}
if(Key_Tran==0)
{
KeyValue=0x02;
KeyValue1=0;
KeyValue2=1;
KeyValue3=0;
KeyValue4=0;
}
if(Key_Square==0)
{
KeyValue=0x03;
KeyValue1=0;
KeyValue2=0;
KeyValue3=1;
KeyValue4=0;
}
if(Key_Sin==0)
{
KeyValue=0x04;
KeyValue1=0;
KeyValue2=0;
KeyValue3=0;
KeyValue4=1;
}
}
四,仿真效果图
1,产生锯齿波
2,产生方波
3,产生三角波
4,产生正弦波
注:黄色波形DAC输出,红色波形经过放大后的波形。