ADDA转换

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

A/D 转换电路
在工业控制和智能化仪器仪表中,需要控制或测量如温度、压力、流量、速度等模拟量,这些模拟量要先经传感器转换为与此对应的模拟电信号,计算机要处理这种信号,必须将模拟量转换成数字量,这一转换称模数转换(A /D )。

实现模数转换的电路称A /D 转换器或ADC 。

一、 A/D 转换芯片0809
(一)ADC0809主要特性
ADC0809为8路模拟量输入的芯片,转换电压为-5V ~+5V ,分辨率为8位,转换时间为 100us ,转换绝对误差为土 1LSB ,单一+5V 供电, 28脚DIP 结构封装,功耗15mw 。

(二)ADC0809的内部结构及管脚功能
ADC0809是采用逐次逼近法的8位A /D 转换芯片,其引脚和结构逻辑如图8—21所示,它内部除A /D 转换部分外,还带有锁存功能的八通道多路模拟开关和8位三态输出锁存器。

28个管脚功能如下:
(1)IN0~IN7:八个模拟量输入端,允许8路模拟量分时输入,共用一个A /D 转换器;
(2)ADDA 、ADDB 、ADDC :通道端口选择线,ADDC 为高位,地址编码关系如下:
图8—1 ADC0809的内部结构及管脚功能图
(3)ALE :地址锁存允许,当ALE 为上升沿时,可将地址选择信号C 、B 、A 锁入地址寄存器内。

(4)START :启动A/D 转换,当START 为上升沿时,开始A /D 转换。

(5)EOC :转换结束信号,当A /D 转换完毕之后,该端由低电平跳转为高电平, (6)OE :输出允许信号,高电平有效。

此信号用以打开三态输出锁存器,将A/D 转换后的8位数字量输出至单片机的数据总线上。

(7)CLOCK :定时时钟输入端,最高允许频率为640kHZ ,转换一次最短时间为100us 。

(8) D 7~D 0:数字量输出端。

(9)V REF (+)和V REF (-):参考电压端,一般V REF (+)= 5V , V
REF (-)=0V 。

(10) V CC 、GND :+5V 电源及地。

下图为ADC0809的工作时序图。

ADC 0809转换结果可依据下列公式计算:
D = 255 * V i / V REF
公式中,V i 为模拟输入量,D 为十进制数字量输出。

一、 ADC0809的应用
(一)任务
ADC0809的IN0通道接一电位器,提供模拟量输入,编制程序,将模拟量转换成二进制数字量,用8255A 的PA 口输出到发光二极管显示。

图8-2 ADC0809的时序图
(二)电路
图8-3
由上图芯片的CS端分析,ADC0809的地址8000H,8255A的地址9000H。

(三)程序
ORG 0000H
MAIN: MOV DPTR,#9003H
MOV A,#82H
MOVX @DPTR,A
MOV DPTR, #8000H
MOV A, #0
MOVX @DPTR, A ; 起动A/D
MOV A, #40H
DJNZ ACC, $ ; 延时> 100US
MOVX A, @DPTR ; 读入结果
MOV R7,#100
DLY: MOV DPTR,#9000H
MOVX @DPTR,A
DJNZ R7,DLY ;延时
LJMP MAIN
END
第九章 D/A 转换接口
计算机运算处理的结果(数字量)有时需要转换成为模拟量,以便操纵被控制对象,这一过程即为数模转换(D /A )。

实现数模转换的电路称为D /A 转换器或DAC 。

一、DAC0832芯片(8位)
1.DAC0832芯片的主要特性
每次输入数字为8位二进制数,转换时间为lus ;数据输入方式有直通、单缓冲、双缓冲;单一电源供电+ 5V ~+15V ;输出电流线性度可在满量程下调节;功耗为20mw 。

2.DAC0832的内部结构和引脚功能
DAC0832内部由1个8位输入寄存器、1个8位DAC 寄存器和一个8位D /A 转换器组成。

各引脚含义如下:
ILE :数据锁存允许信号,高电平有效;
CS
:输入寄存器选择信号,低电平有效;
1WR :输入寄存器的写选通信号,低电平有效,由控制逻辑可以看出,片内输入寄存器
的锁存信号输入锁存器状态随数据输入线状态变化,而1LE =0时,则锁存输入数据;
XFER :数据传送信号。

低电平有效;
2WR :DAC 寄存器的写选通信号,DAC 寄存器的锁存信号LE2=2WR ·
XFER 。

2
LE =1时,DAC 寄存器的输出随输入状态变化,而2
LE
=0时,则锁存输入状态;
D 0~D 7:数字量输入线;
图9-1 DAC0832的内部结构和引脚功能
V REF :基准电压输入线,可在土 10V 范围的调节;
R FB :反馈信号输入线,芯片内已有反馈电阻;
I out1和I out2:电流输出线,I out1与I out2的和为常数,I out1随DAC 寄存器的内容线性变化,在单极性输出时,I out2通常接地,在双极性输出时接运放,在8031应用时需外接运算放大器使之成为电压型输出;
V CC :工作电源线,一般为+5V ~+15V ; DGND :数字地; AGND :模拟信号地。

二、单片机控制直流电机
(一)电路
图9-2
图9-2中DAC0832的输出为双极性电路。

数字量DA TA 与输出电压V 0UT 的对应关系是:
V 0U T 国=(DA TA-128)*V ref/128
单片机输出的数字量DA TA 范围00H ~FFH ,DAC0832输出电压V 0U T 范围—8V ~
+8V 。

DA TA=00H ~7FH ,V 0UT = —8V ~
0V
CS1
DA TA=80H~FFH,V0UT = 0V~+8V
(二)程序
ORG 0000H
START: MOV DPTR, #9000H
MOV A, #0FFH
MOVX @DPTR, A
LCALL DELAY; 等待电机运转稳定
LCALL READ ; 读取时间
MOV DPTR, #9000H
MOV A, #0C0H
MOVX @DPTR, A
LCALL DELAY; 等待电机运转稳定
LCALL READ
MOV DPTR, #9000H
MOV A, #40H ; 电机反转
MOVX @DPTR, A
LCALL DELAY; 等待电机运转稳定
LCALL READ ; 读取时间
MOV DPTR, #9000H
MOV A, #00H ; 电机反转加速
MOVX @DPTR, A
LCALL DELAY; 等待电机运转稳定
LCALL READ
LJMP $
DELAY: MOV R5,#10
MOV R6,#0
MOV R7,#0
DDD: DJNZ R7,DDD
DJNZ R6,DDD
DJNZ R5,DDD
RET
READ: MOV TMOD, #01 ; 16位计时
CLR TR0
MOV TH0, #0
MOV TL0, #0
MOV DPTR, #8003H
MOV A,#82H
MOVX @DPTR,A;PB作输入口
MOV DPTR, #8001H
R_0: MOVX A,@DPTR
JNB ACC.0, R_0 ; 等待低电平完
R_1: MOVX A,@DPTR
JB ACC.1, R_1 ; 等待高电平完
SETB TR0
R_2: MOVX A,@DPTR
JNB ACC.2, R_2 ; 等待低电平完
R_3: MOVX A,@DPTR
JB ACC.3, R_3 ; 等待高电平完
CLR TR0
MOV 40H,TH0
MOV 41H,TL0 ;计算一个T周期的时间
RET
END
PB.0
4.4 ADC0804工作原理及其实现方法
集成A/D转换器品种繁多,选用时应综合考虑各种因素选取集成芯片。

一般逐次比较A/D转换器用的较多,ADC0804就是这单片集成A/D转换器。

它采用CMOS工艺20引脚集成芯片,分辩率为8位,转换时间为100µs,输入电压范围为0~5V。

芯片内具有三态输出数据锁存器,可直接接在数据总线上。

图4.4.4为ADC0804双列直插式封装引脚分布图.
图4.4.4
各引脚名称及作用如下:
V IN(+),V IN(-)——两模拟信号输入端,用以接收单极性、双极性和差模输入信号。

DB7~DB0——具有三态特性数字信号输出口。

AGND——模拟信号地。

DGND——数字信号地。

CLK——时钟信号输入端。

CLKR——内部时钟发生器的外接电阻端,与CLK端配合可由芯片自身产生时钟脉冲,其频率为1/(1.1RC)。

CS#---片选信号输入端,低电平有效,一旦CS#有效,表明A/D转换器被选中,可启动工作。

WR#---写信号输入,低电平启动A/D转换。

RD#---读信号输入,低电平输出端有效。

INTR#---A/D转换结束信号,低电平有效表示本次转换已完成。

V REF/2---参考电平输入,决定量化单位。

V CC---芯片电源5V输入。

我们打开ADC0804的芯片手册,看到它的典型应用接法如图4.4.4所示。

图4.4.4
TX-1C实验板上ADC0804外围电路及与单片机的转接是参照图4.4.4设计的,如图4.4.5所示。

图4.4.5
分析图4.4.5如下:
①ADC0804的片选端CS连接U2锁存哭的Q7输出端,我们可通过控制锁存器来控制CS,这样接的原因是TX-1C实验板扩展的外围太多,没有多余的I/O口独立控制ADC0804的CS端,所以选择U2。

②V IN(+)接电位器的中间滑动端,V IN(-)接地,因为这两端可以输入差分电压,即它可测量V IN(+)与V IN(-)之间的电压,当V IN(-)接地时,V IN(+)端的电压即为ADC0804的模拟输入电压。

V IN(+)与电位器之间串联一个10kΩ电阻,目的是限制流入V IN(+)端的电流,防止电流过大而烧坏A/D芯片,当用短路帽短接插针ADIN后,电位器的中间滑动端便通过电阻R12与V IN(+)连接,此时调节电位器的旋钮,其中间滑动端的电压便在0~V CC变化,进而ADC0804的数字输出端也在0x00~0xFF变化。

③CLKR,CLR,GND之间用电阻和电容组成RC振荡电路,用来给ADC0804提供工作所需的脉冲,其脉冲的频率为1/(1.1RC),按芯片手册上说明,R取10kΩ,C取150pF,TX-1C实验板上为了减少元件种类和焊接方便,C选用的是104磁片电容。

大家在设计自己的电路时,可选择150pF电容,否则会影响A/D的转换速率。

④V REF/2端用两个1kΩ的电阻分压得到V CC/2电压,即2.5V,将该电压作为A/D芯片工作时内部的参考电压。

⑤WR#、RD#分别接单片机的P3.6和P3.7引脚,数字输出端接单片机的P1口。

⑥将AGND和DGND同时连接到实验板的GND上。

我们在设计产品时,若用到A/D 和D/A,一般这些芯片都提供独立的模拟地(AGND)和数字地(DGND)引脚,为了达到精度高,稳定性好的目的,最好将所有器件的模拟地和数字地分别连接,最后将模拟地与数字地仅在一点连接。

⑦INTR#引脚未连接,TX-1C实验板上读取A/D数据未用中断法,因此可不接该引脚。

数字芯片在操作时首先要分析它的操作时序图,图4.4.6是ADC0804的启动转换时序图。

图4.4.6
分析图4.4.6可知,CS先为低电平,WR#随后置低,经过至少t W(WR#)L时间后,WR#拉高,随后A/D转换器被启动,并且在经过(1~8个A/D时钟周期+内部T C)时间后,模/数完成转换,转换结果存入数据锁存器,同时INTR自动变为低电平,通知单片机本次转换已结束。

关于几个时间的大小在芯片手册中都有说明。

我在写单片机程序启动A/D转换时就要遵循上面的时序,由于TX-1C实验板未用中断读取A/D数据,因此我们在启动A/D转换后,稍等一会儿时间,然后直接读取A/D的数字输出口即可。

读取结束启动一次A/D转换,如此循环下去。

力4.4.7是ADC0804读取数据时序图。

图4.4.7
分析图4.4.7可知,当INTR#变为低电平后,将CS#先置低,在RD#置低至少经过t ACC 时间后,数字输出口上的数据达到稳定状态,此时直接读取数字输出端口数据便可得的数字信号,读走数据后,马上将RD#拉高,然后再将CS#拉高,INTR#是自动变化的,当RD#置低t R1时间后,INTR#自动拉高,我们不必人为去干涉。

图4.4.6和图4.4.7是ADC0804启动转换和读取数据的时序图,这是启动一次和读取一次数据的时序图,当我们要连续转换并且连续读取数据时,有没有必要每次都把CS#置低再位高,因为CS#是片选信号,置低表示该芯片可被操作或处于能够正常工作状态,所以在写程序时,只要一开始将CS#置低,以后当要启动转换和读取数据时只需操作WR#和RD#即可。

下面我们亲自操作一下这个A/D芯片,在TX-1C实验板上实现如下描述。

【例4.4.1】用单片机控制ADC0804进行模数转换,当拧动实验板上A/D旁边的电位器Re2时,在数码管的前三位以十进制方式动态显示出A/D转换后的数字量(8位A/D转
换后数值在0~255变化)。

新建文件part2.3_1.c,程序代码如下:
#include<reg52.h> //52系列单片机头文件
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
sbit dula = P2^6 //申明U1锁存器的锁存端
sbit wela = P2^7 //申明U2锁存器的锁存端
sbit adwr = P3^6 //定义A/D的WR端口
sbit adrd = P3^7 //定义A/D的RD端口
uchar code table[] = { 0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71};
void delayms(uint xms) //i = xms 即延时约xms毫秒
{
uint i,j;
for(i = xms;i > 0;i --)
for(j = 110;j > 0;j --);
}
void display(uchar bai,uchar shi,uchar ge) //显示子函数
{
dula = 1; //送断选数据
P0 = table[bai];
dula = 0;
P0 = 0xff; //送位选数据前关闭所有显示,防止打开位选锁存时
wela = 1; //原来断选数据通过位选锁存器造成混乱
P0 = 0x7e; //送位选数据
wela = 0;
delayms(5); //延时
dula = 1;
P0 = table[shi];
dula = 0;
P0 = 0xff;
wela = 1;
P0 = 0x7d;
wela = 0;
delayms(5);
dula = 1;
P0 = table[ge];
dula = 0;
P0 = 0xff;
wela = 1;
P0 = 0x7b;
wela = 0;
delayms(5);
}
void main(void) //主程序
{
uchar a,A1,A2,A3,adval;
wela = 1;
P0 = 0x7f; //置CSAD为0,选通ADCS以后不必再管ADCS
wela = 0;
while (1)
{
adwr = 1;
_nop_();
adwr = 0; //启动A/D转换
_nop_();
adwr = 1;
for (a = 10; a > 0; a--) //TX-1C实验板A/D工作频率较低,所以启动{ //转换后要留点时间用来转换
//把显示部分放这里的原因也是为了延长转
display(A1,A2,A3); //换时间
}
P1 = 0xff; //读取P1口之前先给其写全1
adrd = 1; //选通ADCS
_nop_();
adrd = 0; //A/D读使能
_nop_();
adval = P1; //A/D数据读取赋给P1口
adrd = 1;
A1 = adval/100; //分出百、十和个位
A2 = adval%100/10;
A3 = adval%10;
}

TX-1C实验板上A/D外围电路如图4.3.8所示。

图4.4.8
图4.4.8中,A/D右边的电位器Re2就是用来给A/D输入模拟电压的,当做本实验时,
首先要将A/D左边的插针ADIN用短路帽短路,这样电位器才与A/D芯片连接上。

设计这
上插针的目的也是,考虑有用户可能会用A/D采集实验板外面的模拟信号,这时直接与该
插针连接就可以。

编译代码下载程序后,可看到数码管前三位显示一个十进制数字,当拧动
电位器时数字也跟着变化,变化范围为0~255。

分析如下:
①刚进入程序后,首先将U2锁存器的输出口的最高位置低电平,目的是将与
之相连的ADC0804的CS#片选端置低选中,因为本例程专门操作A/D芯片,所以一次选中,
以后再不用管它。

同时要注意,以后凡是操作U2锁存器的地方都不要再改变A/D的CS#
端,在数码管显示程序中,送出位选信号时,我们始终保持U2锁存器的最高位为低电平,
上例数码管显示部分程序中“P0 = 0x7e;P0 = 0x7d; P0 = 0x7b;”即是。

②进入while(1)大循环后,先启动A/D转换,其操作方法就是按照前面介绍的
启动时序图来完成的,其中用到“_nop_();”,它相当于一个机器周期的时延,关于“_nop_();”
请看下一个知识点。

③在启动A/D转换后,还未读取转换结果,就立即先送结果给数码管显示,这
样写的目的是为了给A/D转换留有一定时间,我们把数码管显示这部分作为A/D转换的时
间,这样写程序,首次显示时,数码管上必然显示的全是0。

我们编码下载程序后,首次上
电会看到显示全是0,但马上又出现了数字。

因为首次显示完后,接下来便读取到了A/D转
换后的结果,当程序再次循环回来时便显示了上次的数值,这样并不影响我们观察实验现象。

④有些用户可能会发现,拧动电位器时,数码管上动,只有复位一次,或重新
上电一次,数字才会刷新,这是因为转换时间不够的原因,遇到这种情况时,有两种解决办
法。

一是将实验板上C11电容换成150pF;二是再适当延长A/D转换的时间,即可增加数
码管显示的次数,可将上例中“for(a = 10;a > 0; a--)”中的a值增大。

知识点:_nop_()解释
打开C51帮助文件,在索引中查找到_nop_,原始英文描述如下:
Description:
The _nop_ routine inserts an 8051 NOP instruction into the program. This routine can be used to pause for 1 CPU cycle.This routine is implemented as an intrinsic function.The code required is included in-line rather than being called.
_nop_()这个函数是延时一个机器周期的意思,它包含在头文件intrins.h中,当程序中用到_nop_()时,需在最开始处包含头文件intrins.h。

【例4.4.2】_nop_()用法举例。

#include<intrins.h>
#include<reg52.h>
void main()
{
P1 = 0xFF;
_nop_(); //delay for hardware
_nop_();
_nop_();
P1 = 0x00;
while(1);
}
4.4 常用DAC0832操作实例
4.4.1 DAC0832工作原理及实现方法
DAC0832是使用非常普遍的8位D/A转换器,其转换时间为1µs,工作电压为+5V~+15V,基准电压为±10V。

它主要由两个8位寄存器和一个8位D/A转换器组成。

使用两个寄存器(输入寄存器和DAC寄存器)的好处是可以进行两级缓冲操作,使该操作有更大的灵活性,其转换原理与T型解码网络一样,由于其片内有输入数据寄存器,故可以直接与单片机接口。

DAC0832以电流形式输出,当输出需要转换为电压时,可外接运算放大器。

属于该系列的芯片还有DAC0830,DAC0831,它们可以相互代换。

DAC0832主要特性如下:
●8位分辩率;
●电流建立时间1µs;
●数据输入可采用双缓冲、单缓冲或直通方式;
●输出电流线性度可在满量程下调节;
●逻辑电平输入与TTL电平兼容;
●单一电源供电(+5V~+15V);
●低功耗,20mW。

DAC0832芯片为20脚双列直插式封装,其引脚分部如图4.4.1,实物如图4.4.2所示。

各引脚定义如下:
CS#——片选信号输入端,低电平有效。

WR1#——输入寄存器的写选通输入端,负脉冲有效(脉冲宽度应大于500ns)。

当CS 为0,ILE为1,WR1有效时DI0~DI7状态被锁存到输入寄存器。

DI0~DI7——数据输入端,TTL电平,有效时间应大于90ns。

V REF——基准电压输入端,电压范围为-10V~+10V。

图4.4.1 图4.4.2
R fb——反馈电阻端,芯片内部此端与I OUT1接有一个15kΩ的电阻。

I OUT1——电流输出端,当输入全为1时,其电流最大。

I OUT2——电流输出端,其值与I OUT1端电流之和为一常数。

XFER#——数据传输控制信号输入端,低电平有效。

WR2#——DAC寄存器的写选通输入端,负脉冲有效(脉冲宽度应大于500ns)。

XFER 为0且WR2有效时,输入寄存器的状态被传到DAC寄存器中。

ILE——数据锁存允许信号输入端,高电平有效。

VCC——电源电压端,电压范围为+5V~+15V。

GND——模拟地和数字地,模拟地为模拟信号与基准电源参考地;数字地为工作电源地与数字逻辑地(两地最好在基准电源处一点共地)。

我们打开ADC0804的芯片手册,看到它的典型应用接法如图4.4.3所示。

图4.4.3
由于DAC0832芯片数据输入可采用双缓冲、单缓冲和直通三种方式。

TX-1C实验板上将DAC0832接成直通方式,其外围电路及与单片机的连接如图4.4.5所示。

图4.4.5
当DAC0832芯片的片选信号、写信号及传送控制信号的引脚全部接地,允许输入锁存信号ILE引脚接+5V时,DAC0832芯片处于直通工作方式,数字量一旦输入,就直接进入D/C寄存器,进行D/A转换。

此时若让芯片连续转换的话,只需连续改变数字输入端的数字信号即可。

分析如下:
①控制端只有CSDA和WR信号与单片机连接,当CSDA置低后,该芯片被选中,此时对该芯片的操作才有效。

②V RE F接V CC,即5V电压,说明该D/A的参考电压为5V,其模拟信号输出一定在D*k*5(单位)内变化(D为数字输入量,k为一比值,与内部电路有关)。

③I OUT1为该D/A芯片电流输出端,I OUT2 +I OUT1=常数,该常数约为330µA,其电流非常小。

其中关于I OUT1和I OUT2的算法公式如下:
I out1=V ref/15K
④I OUT2可以不用它,直接接地即可。

⑤P5为D/A输出接口,为了方便用户外接运算放大电路,接口将D/A的R fb反馈电阻输入端引出。

若用短路帽将P5的2,3短路后,I OUT1直接与发光二极管D12相连,当我们定程序控制D/A输出电流变化时,通过发光二极管便可直观看到现象,由于I OUT1输出的电流非常小,因此该发光二极管的亮度也比较暗。

DAC0832芯片的操作时序如图4.4.6所示/
图4.4.6
从图4.4.6可以看出,当CS#为低电平后,数据总线上数据才开始保持有效,然后再将WR#置低,从I OUT线上可看出,在WR#置低t S后D/A转换结束,I OU T输出稳定。

若只控制完成一次转换的话,接下来将WR#和CS#拉高即可,若连续转换则只需要改变数字端输入数据。

下面我们亲自操作一下该D/A芯片,在TX-1C实验板上实现如下描述。

【例4.4.1】用单片机控制DAC0832芯片输出电流,让发光二极管D12由灭均匀变到最亮,再由最亮均匀熄灭。

在最亮和最暗时使用蜂鸣器分别警报一声,完成整个周期时间控制在5s左右,循环变化。

新建文件part2.3_2.c,程序代码如下:
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit dula = P2^6; //申明U1锁存器的锁存端
sbit wela = P2^7; //申明U2锁存器的锁存端
sbit dawr = P3^6; //定义DA的WR端口
sbit dacs = P3^2; //定义DA的CS端口
sbit beep = P2^3; //定义蜂鸣器端口
void delayms(uint xms)
{
uint i,j;
for(i = xms;i > 0;i--) //i = xms即延时约xms毫秒
for(j = 110;j > 0;j--);
}
void main()
{
uchar val,flag;
dula = 0;
wela = 0;
dacs = 0;
dawr = 0;
P0 = 0;
while(1)
{
if(flag == 0)
{
val+=5;
P0 = val;
if(val == 255)
{
flag = 1;
beep = 0;
delayms(100);
beep = 1;
}
delayms(50);
}
else
{
val-=5;
P0 = val;
if(val == 0)
{
flag = 0;
beep = 0;
delayms(100);
beep = 1;
}
delayms(50);
}
}
}
分析如下:
①程序一开始,使能D/A的片选,接着使能写入端,这时D/A就成了直通模式,只需变化数据输入端,D/A的模拟输出端便紧跟着变化,不过还是要注意变化数据的频率不要太高,不要超过D/A无烟煤转换最高频率,芯片手册上都会有说明,要等D/A的一次转换完成后再变化下帧数据方可得到正确的模拟输出。

②标志位的使用在程序中有非常大的用处,尤其以后编写较大的程序时,灵活运用标志位可使程序编写更加流畅易懂。

例4.4.1通过一个标志位falg判断单片机执行灯变亮程序还是变暗程序,请大家务必掌握这种用法。

③“val+=5”的意义与“val= val +5”相同,“val-=5”的意义与“val= val -5”相同,另外还有如“val*=5,val/=5”等。

④关于延时计算,255共有51个5,每次延时50ms,共计50×51=2551ms,忽略蜂鸣器响占用的100ms,约为2.5s。

另外,半周期同样约为2.5s,共计约5s。

当然,时间也是能做到更精确,比如用定时器可以精确到微秒,这人问题留给大家来练习解答。

4.4.2 DAC0832输出电流转换成电压的方法
通常我们在使用D/A时,用的较多的是控制电压的变化,而很少去控制电流的变化,有很多D/A芯片是直接输出电压的,而DAC0832是电流输出型的D/A。

图4.5.3是DAC0832芯片手册中的典型应用电路接法,在I OUT输出级后加了一级运算放大器,运放的输出为U OUT,即这个运算放大器实现了将DAC0832输出的电流信号转变成电压信号的功能。

下面讲解如何用简易的方法在TX-1C实验板上,使DAC0832输出的0~330µA电流信号转换为0~5V电压信号。

在将电流转换为电压时,运算放大器需要加正、负电压,而TX-1C实验板上只有+5V电源,因此需想办法得到正、负电压。

我们在前面讲过,单片机与计算机在通信时需要加电平转换芯片,计算机RS-232电平为±12V,TX-1C实验板上用MAX232芯片完成电平转换功能,因此从芯片上必定能够找到正、负电压,我们用万用表测量MAX232芯片的各个引脚,发现该芯片的第2,6引脚分别输出+10V和-10V左右的电压,所以此电压可以作为运放的电源电压。

具体电路接法如图4.3.1所示。

图4.3.1
运放选择常用的单运放就可以了,如常见的TL061,OP07等。

以OP07为例,运放的2脚与D/A的电流输出端I
相连;3脚接地;4,7分别接MAX232的2,6脚;6脚接D/A的
OUT1
端,同时也是运放的电压输出端;运放1,5,8脚悬空。

R
fb
通过写程序让D/A固定输出某个电流,然后用万用表测量运放的6脚,可看到固定的电压。

控制D/A的数字量变化时,运放的输出端电压也发生变化,具体变化的范围与运放的电源电压有关,请大家自己做试验测量观察。

实验十五串行A/D转换实验
一、实验目的
掌握串行A/D转换芯片TLC549的功能特点,与单片机的连接,A/D转换程序的设计与调试。

二、实验电路
实验电路见下图,同时将JP2短接,JP3、JP4断开,选择LED显示器。

三、实验内容
编写TLC549的A/D转换程序,读取模拟输入量的值,并将其显示在LED显示器上。

四、参考程序
#include <reg51.h>
#define uchar unsigned char
uchar code segtab[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,
0x83,0xc6,0xa1,0x86,0x8e,0x89,0x8c,0xff};
uchar dbuf[4]={0,0,0,0x12};//只显示低三位
sbit AD_CS=P1^4;
sbit AD_CLK=P1^2;
sbit AD_DAT=P1^3;
bdata uchar adin;
sbit adin0=adin^0;
void delay(void)
{ uchar i;
for(i=0;i<20;i++);
}
uchar getad(void) // A/D转换程序
{ uchar i;
AD_CS=0; //令CS为低选中TLC549
delay(); //延时
for(i=0;i<8;i++) //循环读取8位A/D转换结果
{ AD_CLK=0; //令CLK引脚为低
adin=adin<<1;//先读取高位,后读低位
adin0=AD_DAT;//读取数据线的一位数据
AD_CLK=1; //令CLK恢复为高
}
return adin;
}
void disp(void)
{ uchar i,n,bsel;
bsel=0xfe; //首先点亮最低位
for(n=0;n<4;n++)
{ P2=bsel; //位选口
P0=segtab[dbuf[n]];//将显示缓存的数据转换为字段码显示 bsel=(bsel<<1)+1; //准备显示下一位
for(i=1;i<200;i++);//延时
P0=0xff; //熄灭所有字段
}
}
void main(void)
{ uchar ad;
while(1)
{ ad=getad(); //读取A/D转换结果
dbuf[2]=ad/100;//将转换结果转换为三位BCD码送显示缓存 ad=ad%100;
dbuf[1]=ad/10;
dbuf[0]=ad%10;
disp();
}
}
《单片机应用技术》详案七题目:
简易波形发生器
目的:
1.熟悉D/A转换的基本知识;
2.掌握D/A转换器与AT89S51之间的连接方法;
3.理解单片机控制D/A的实例。

4.能正确应用单片机控制D/A输出需要的信号;
5.会利用单片机输出模拟量,以控制外围模拟设备。

重点:
能正确应用单片机控制D/A输出需要的信号;
难点:
会利用单片机输出模拟量,以控制外围模拟设备。

课时安排:
6个学时
教学方式:
讲授;演示;实验
教学内容:
任务描述
本课题的任务是利用单片机和D/A转换器件组成系统,通过程序的控制,实现简易波形发生器,能输出三角波和正弦波。

课题分析
要实现正弦波和三角波输出,就是随着时间变化不断输出模拟信号的指定电压值。

作为单片机来说,其输入和输出的都是数字信号(数字量)。

如果需要输出方波信号,可以通过对I/O引脚置1和清0的方式直接从单片机引脚上输出对应的脉冲,这在前面课题已有过介绍。

单片机系统要输出模拟量,需要一种特殊的电路,将数字信号变换为对应的模拟量。

在单片机外围接口电路中,常采用D/A转换电路来完成将数字量转换为模拟量。

本任务中选择8位D/A转换集成电路DAC0832作为系统的模数转换设备,输出任务所需要的波形。

在本课题中,由于没有较多的任务和外围设备,因而DAC0832与单片机连接方式采用直通方式,并用运放将DAC0832输出的模拟电流变换为对应的模拟电压。

在直通方式中,要求将DAC0832对应的控制端ILE接高电平,、、、都接地,同时将DAC0832的数据端口接在单片机AT89S51的P口上,就能用AT89S51通过程序控制DAC0832输出模拟信号。

在本任务中,选择P2端口作为数据输出端口与DAC0832相连,所以在程序中的输出的数据就只需要写在P2口就行了。

DAC0832需要使用运放将其电流输出转换为电压输出,本任务中没有规定输出的信号的幅度和频率,为了方便,将输出确定为正电压输出,幅度为Vcc(+5V),即将DAC0832的VREF接至Vcc。

为了实现系统的输出波形改变,在电路中增加两个按键,并规定按下S1时系统输出三角波,按下S2时系统输出正弦波,本课题对应的硬件电路原理图如图7-1所示。

为了便于对课题目标实现的理解,本课题分为两个任务,即输出指定的模拟电压和简易信号发生器。

任务一输出指定电压
重点:掌握DAC0832与单片机的连接
难点:根据输出电压公式得出对应的数字值
任务目标
采用DAC0832数模转换电路,输出2.5V的模拟电压。

程序设计分析
由于DAC0832采用了直通方式,所以只需要往其数据端口直接加上数值,就能从DAC0832后面的运放的输出端得到所需要的模拟电压。

由于其输出电压可能根据公式Vout=-VREF×Din/2n=5V×Din/256= Din×0.0195(V)
计算得来,因而在需要输出某个电压值时按该式求出对应的数字值,通过P2端口输出,就可以得到所需的模拟电压。

输出2.5V的模拟电压,则需要输出128的数值,具体的命令如下:
P2=128;。

相关文档
最新文档