实验七DAC0832数模转换实验.docx
《实验七DAC0832数模转换实验.docx》由会员分享,可在线阅读,更多相关《实验七DAC0832数模转换实验.docx(12页珍藏版)》请在冰豆网上搜索。
![实验七DAC0832数模转换实验.docx](https://file1.bdocx.com/fileroot1/2022-12/12/835eeda6-1a31-4294-951b-6020c259e1bb/835eeda6-1a31-4294-951b-6020c259e1bb1.gif)
实验七DAC0832数模转换实验
实验七、DAC0832数模转换实验
一、实验目的
1、掌握DAC0832直通方式、单缓冲方式、双缓冲方式的编程方法
2、掌握DA转换程序的编程方法和调试方法。
二、实验说明
美国国家半导体公司产品,具有两个输入数据寄存器的8位DAC,能直接与MCS-51单片机相连。
主要特性如下:
分辨率为8位;
*电流输出,稳定时间为1s;
*可双缓冲输入、单缓冲输入或直接数字输入;
*单一电源供电(+5~+15V);
DAC0832的逻辑结构:
其引脚分布如图所示:
DAC0832各引脚说明:
DI0-DI7:
转换数据输入端;
CS:
片选信号输入端。
ILE:
数据锁存允许信号输入端,高电平有效。
WR1:
输入寄存器写选通控制端。
当CS*=0、ILE=1、WR1*=0时,数据信号被锁存在输入寄存器中。
Xfer:
数据传送控制信号输入端,低电平有效。
WR2:
DAC寄存器写选通控制端。
当XFER*=0,WR2*=0时,输入寄存器状态传入DAC寄存器中。
Iout1:
电流输出1端,当数据全为1时,电流输出最大;当数据全为0时,输出电流最小。
Iout2:
电流输出2端。
DAC0802具有Iout1+Iout2=常数的特性。
Rfb:
反馈电阻端。
Vref:
基准电压输入端,是外加的高精度电压源,它与芯片内的电阻网络相连接,该电压范围为-10V~10V;
VCC和GND:
芯片的电源和接地端。
DAC内部有两个寄存器,而这两个寄存器的控制信号有五个,输入寄存器有LIE、CS、WR1控制,DAC寄存器由WR2、Xref控制,用软件指令控制这五个控制端可以实现三种工作方式:
直通方式,单缓冲方式,双缓冲方式。
直通方式是将两个寄存器的五个控制端预先置为有效信号,两个寄存器都开通,只要有数字信号输入就立即进入DA转换。
单缓冲方式是使DAC0832的两个输入寄存器中由一个处于直通方式,另一个处于受控方式,可以将WR2和Xref相连接到地上,并把WR1接到80C51的WR上,LIE接高电平,CS接高位地址或地址译码的输出端上。
双缓冲方式把DAC0832的输入寄存器和DAC寄存器都接成受控方式,这种方式可以用于多路模拟量要求同时输出的情况下。
三种工作方式的区别是:
直通方式不需要选通,直接进行DA转换;单缓冲方式一次选通;双缓冲方式二次选通。
三、实验步骤
1、单片机最小应用系统1的P1口接DAC0832的DI0~DI7,单片机最小应用系统的P2.0、WR分别接DA转换的P2.0、WR,Vref接-5V,DA转换的out接示波器探头。
2、用串行数据线连接计算机与仿真器,把仿真器插到模块的锁紧插座中,主要仿真器的方向:
缺口朝上。
3、打开keiluvision2仿真软件,首先建立本实验的项目文件,接着添加DA转换程序。
4、进行软件设置,选择硬件仿真,选择串行口,设置波特率为38400.
5、打开模块电源和总电源,点击开始调试按钮,点击run按钮运行程序。
观察示波器测量输出波形的周期和幅度。
四、实验内容
1、在硬件不改动的情况下,请编程实现输出波形为锯齿波及三角波、正弦波。
参考程序:
1、矩形波参考程序:
#include"reg51.h"
#include"absacc.h"
#defineDACXBYTE[0xFEFF]
voiddeley(unsignedintk)
{
unsignedinti;
for(i=0;i}
voidmain()
{
unsignedintk;
unsignedintdout;
while
(1)
{DAC=0x00;
deley(10);
DAC=0xff;
deley(10);
}
}
2、三角波参考程序:
#include"reg51.h"
#include"absacc.h"
#defineDACXBYTE[0xFEFF]
voiddeley(unsignedintk)
{
unsignedinti;
for(i=0;i}
voidmain()
{
unsignedintk;
unsignedintdout;
while
(1)
{
for(k=0;k<0xff;k++)
{
DAC=k;
}
for(k=0xff;k>0;k--)
{
DAC=k;
}
}
}
3、锯齿波参考程序:
#include"reg51.h"
#include"absacc.h"
#defineDACXBYTE[0xFEFF]
voiddeley(unsignedintk)
{
unsignedinti;
for(i=0;i}
voidmain()
{
unsignedintk;
unsignedintdout;
while
(1)
{
for(k=0;k<0xff;k++)
DAC=k;
}
}
4、键盘控制波形产生程序:
#include"reg51.h"
#include"intrins.h"
#defineucharunsignedchar;
#defineuintunsignedint;
unsignedcharaa;
unsignedintcodesintab[]={
0x80,0x86,0x8C,0x92,0x98,0x9E,0xA5,0xAA,0xB0,0xB6,0xBC,0xC1,0xC6,0xCB,0xD0,0xD5,
0xDA,0xDE,0xE2,0xE6,0xEA,0xED,0xF0,0xF3,0xF5,0xF8,0xFA,0xFB,0xFD,0xFE,0xFE,0xFF,
0xFF,0xFF,0xFE,0xFE,0xFD,0xFB,0xFA,0xF8,0xF5,0xF3,0xF0,0xED,0xEA,0xE6,0xE2,0xDE,
0xDA,0xD5,0xD0,0xCB,0xC6,0xC1,0xBC,0xB6,0xB0,0xAA,0xA5,0x9E,0x98,0x92,0x8C,0x86,
0x7F,0x79,0x73,0x6D,0x67,0x61,0x5A,0x55,0x4F,0x49,0x43,0x3E,0x39,0x34,0x2F,0x2A,
0x25,0x21,0x1D,0x19,0x15,0x12,0x0F,0x0C,0x0A,0x07,0x05,0x04,0x02,0x01,0x01,0x00,
0x00,0x00,0x01,0x01,0x02,0x04,0x05,0x07,0x0A,0x0C,0x0F,0x12,0x15,0x19,0x1D,0x21,
0x25,0x2A,0x2F,0x34,0x39,0x3E,0x43,0x49,0x4F,0x55,0x5A,0x61,0x67,0x6D,0x73,0x79};
sbitP3_0=P3^0;
sbitP3_6=P3^6;
voiddeley(unsignedcharz);
voidju();
voidsan();
voidchi();
voidsin();
ucharkeyscan();
//*主函数*//
voidmain()
{
P3_0=0;
P3_6=0;
while
(1)
{
aa=keyscan();
if(aa==1)
ju();
if(aa==2)
san();
if(aa==3)
chi();
if(aa==4)
sin();
}
}
//*延时子程序*//
voiddeley(unsignedcharz)
{
unsignedintx,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
voidju()
{
P1=0x00;
deley(10);
P1=0xff;
deley(10);
}
//*三角波产生程序*//
voidsan()
{
unsignedintk;
for(k=0;k<0xff;k++)
{
P1=k;
}
for(k=0xff;k>0;k--)
{
P1=k;
}
}
//*锯齿波产生程序*//
voidchi()
{
P1=P1+1;
if(P1==0xff)
P1=0x00;
}
//*正弦波产生程序*//
voidsin()
{
unsignedintkk;
for(kk=0;kk<=127;kk++)
{
P1=sintab[kk];
}
}
//*键盘扫描程序*//
ucharnum,temp;
ucharkeyscan()
{
unsignedcharii;
for(ii=0;ii<4;ii++)
{
P2=_crol_(0xfe,ii);
temp=P2;
temp=temp&0xf0;
while(temp!
=0xf0)
{
deley(5);
temp=P2;
temp=temp&0xf0;
while(temp!
=0xf0)
{
temp=P2;
switch(temp)
{
case0xee:
num=1;break;
case0xde:
num=2;break;
case0xbe:
num=3;break;
case0x7e:
num=4;break;
case0xed:
num=5;break;
case0xdd:
num=6;break;
case0xbd:
num=7;break;
case0x7d:
num=8;break;
case0xeb:
num=9;break;
case0xdb:
num=10;break;
case0xbb:
num=11;break;
case0x7b:
num=12;break;
case0xe7:
num=13;break;
case0xd7:
num=14;break;
case0xb7:
num=15;break;
case0x77:
num=16;break;
}
while(temp!
=0xf0)
{
temp=P2;
temp=temp&0xf0;
}
}
}
}
returnnum;
}
汇编语言:
矩形波:
ORG0000H
AJMPSTART
ORG0030H
START:
MOVDPTR,#0FEFFH
LP:
MOVA,#0FFH
MOVX@DPTR,A
LCALLDELAY
MOVA,#00H
MOVX@DPTR,A
LCALLDELAY
SJMPLP
DELAY:
MOVR3,#11H
D1:
NOP
NOP
NOP
DJNZR3,D1
RET
END
三角波:
ORG0000H
AJMPSTART
ORG0030H
START:
MOVDPTR,#0FEFFH
LP0:
MOVA,#00H;
MOVR2,#0FFH;
LP1:
MOVX@DPTR,A
INCA;
DJNZR2,LP1
MOVA,#0FEH
MOVR2,#0FDH;
LP2:
MOVX@DPTR,A
DECA
DJNZR2,LP2;
LJMPLP0
END
锯齿波:
ORG0000H
AJMPSTART
ORG0030H
START:
MOVDPTR,#0FEFFH
LP0:
MOVA,#00H;
MOVR2,#0FFH;
LP1:
MOVX@DPTR,A
INCA;
DJNZR2,LP1
LJMPLP0
END
流程图:
六、电路图