基于51单片机的波形发生器(初版)

一,芯片介绍
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输出,红色波形经过放大后的波形。

发布了26 篇原创文章 · 获赞 23 · 访问量 5744

猜你喜欢

转载自blog.csdn.net/liuxianfei0810/article/details/105308260