波形发生器 -- 输出正弦波,三角波,矩形波,锯齿波,梯形波 -- DAC0832

波形发生器 – 输出正弦波,三角波,矩形波,锯齿波,梯形波 – DAC0832

使用MSC-51单片机系统和相关电子器件,如:D/A,A/D转换器,数码管或液晶显示器,运算放大器,示波器等,设计电路使其能产生正弦波,三角波,矩形波,锯齿波,梯形波,并使用按键实现五者之间的转换,且要求在产生相应波形时用LED显示对应的波形编号。调试用C语言编写MSC-51单片机代码,用PROTEUS和KEIL编程软件联合调试

DAC0832工作方式

DAC0832三种工作方式
(1)单缓冲方式:若应用系统中只有一路D/A转换或虽然有夺路转换,但并不要求各路信号同步输出时,则采用单缓冲的方式来接口。方法是:使锁存器和DAC寄存器同时接收数据。
(2)双缓冲方式:当多路D/A信号要求同步输出时,则采用双缓冲方式。方法是:分别使其输入锁存器接收数据;同时传送数据到其DAC寄存器,以实现多路转换同步输出。
(3)直通方式:所有控制信号均有效,适宜连续控制时。

D/A转换

D/A芯片DAC0832的应用:DAC0832是8位 D/A芯片,片内带数据锁存器,电流输出。该系列产品包括DAC0830——32,它们可以完全相互代换。它由8位输入锁存器、8位DAC寄存器、8位D/A转换电路及转换控制电路组成
ADC0808引脚如图,各引脚功能如下:
※DI0-DI7:数据输入线,TLL电瓶。
※ILE:数据锁存允许控制信号输入线,高电平有效。
※CS:片选信号输入线,低电平有效。
※WR1:为输入寄存器的写选通信号。
※XFER:数据传送控制信号输入线,低电平有效。
※WR2:为DAC寄存器写选通输入线。
※Iout1:电流输出线。当输入全为1时Iout1最大。
※Iout2:电流输出线。其值与Iout1之和为常数。
※Rfb:反馈信号输入线,芯片内部有反馈电阻。
※Vcc:电源输入线(+5v~+15v)
※Vref:基准电压输入线(-10v~+10v)
※AGND:模拟地,模拟信号和基准信号参考地。
※DGND:数字地,两种地线在基准电源处共地比较好。
引脚图

仿真图 仿真图

效果

正弦波:
正弦波
方波:
方波
锯齿波:
锯齿波
三角波:
三角波
梯形波:
梯形波

代码

点击源文件下载

#include "reg52.h"
#include <math.h>
#define ADC_PORT P2 //如图,ADC0832连接端口
//5种波
#define W_SINE 0
#define W_SQU 1
#define W_TRI 2
#define W_TRA 3
#define W_SAW 4
#define PI 3.1415926f //圆周率

//简化类型符写法
typedef unsigned char u8;
typedef unsigned int u16;
typedef unsigned long u32;

sbit ADC_CS_WR=P3^0; //如图,ADC0832使能口
//5个LED,接P0口
sbit LED0=P0^0;
sbit LED1=P0^1;
sbit LED2=P0^2;
sbit LED3=P0^3;
sbit LED4=P0^4;
//5个按键
sbit KEY0=P1^0;
sbit KEY1=P1^1;
sbit KEY2=P1^2;
sbit KEY3=P1^3;
sbit KEY4=P1^4;
//全局变量
u8 mode;//模式:正弦波……
u16 freq;//频率
u8 time;//计次参数
u8 AM;//调幅


void Timer0Init(void);
void scanKey(void);
void sys_init(void);

void sine_wave(u8 location);//正弦波
void squ_wave(u8 location);//方……
void tri_wave(u8 location);//三……
void tra_wave(u8 location);//梯……
void saw_wave(u8 location);//锯……

void Timer0Init(void)		//100微秒@12.000MHz
{
	TMOD &= 0xF0;		//设置定时器模式
	TMOD |= 0x02;		//设置定时器模式
	TL0 = 0x9C;		//设置定时初值
	TH0 = 0x9C;		//设置定时重载值
	TF0 = 0;		//清除TF0标志
	TR0 = 1;		//定时器0开始计时
	EA = 1;         //开总中断
	ET0 = 1;        //开定时器0中断
}

void scanKey(void)//按键扫描
{
	if(KEY0==0)
	{
		mode=0;
		P0=0xFF;//灭所有灯
		LED0=0;
	}
	
	if(KEY1==0)
	{
		mode=1;
		P0=0xFF;//灭所有灯
		LED1=0;
	}
	
	if(KEY2==0)
	{
		mode=2;
		P0=0xFF;//灭所有灯
		LED2=0;
	}
	
	if(KEY3==0)
	{
		mode=3;
		P0=0xFF;//灭所有灯
		LED3=0;
	}
	
	if(KEY4==0)
	{
		mode=4;
		P0=0xFF;//灭所有灯
		LED4=0;
	}
}

void sys_init(void)//系统初始化
{
	time=0;
	ADC_CS_WR=0;
	ADC_PORT=0;
	mode=0;//默认输出正弦波
	freq=100;//默认频率100Hz
	AM=255;//最大幅度
}
void sine_wave(u8 location)//输出正弦波
{
	double x=(double)location/50*PI;//把0-100放缩到0-2派(pai,没有那个符号,好难受(╯﹏╰))
	u8 y=(sin(x)*(AM/2)+(AM/2));//算出y,并放缩到0-254(因为ADC范围0-AM,感觉这个芯片好落后)
	ADC_PORT=y;
}

void squ_wave(u8 location)//方……
{
	if(location<50)
		ADC_PORT=AM;
	else
		ADC_PORT=0x00;
}

void tri_wave(u8 location)//三……
{
	//为了简化,在单周期输出V字形
	u8 y;
	if(location<50)
		y=(50-location)*AM/50;
	else
		y=(location-50)*AM/50;
	ADC_PORT=y;
}
void tra_wave(u8 location)//梯……
{
	u8 y;
	if(location<25)
		y=0xFF;
	else if(location<50)
		y=(50-location)*AM/25;
	else if(location<75)
		y=0;
	else
		y=(location-75)*AM/25;
	ADC_PORT=y;
}
void saw_wave(u8 location)//锯……
{
	ADC_PORT=location*AM/100;
	//用(100-location)也以变成反向锯齿
}

void Timer0Work() interrupt 1 //中断服务函数
{
	switch(mode)
	{
		case W_SINE:sine_wave((u8)(time*freq/100)%100);break;//计算出波的位置
		case W_SQU:squ_wave((u8)((time*freq/100)%100));break;
		case W_TRI:tri_wave((u8)((time*freq/100)%100));break;
		case W_TRA:tra_wave((u8)((time*freq/100)%100));break;
		case W_SAW:saw_wave((u8)((time*freq/100)%100));break;
	}
	time++;
	if(time>=100)//计数100次
		time=0;
}

int main(void)
{
	sys_init();
	Timer0Init();
	while(1)
	{
		scanKey();
	}
}

本人亲测 真实好用 资源共享 原创文章
源文件下载地址:点击源文件下载

  • 66
    点赞
  • 615
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 17
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 17
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一个小小白 - 呀吼

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值