单片机实验(AD转换)

单片机实验(AD转换)
单片机实验(AD转换)

实验三 A/D、D/A转换实验

一、实验目的

1.熟悉DAC0832并行接口数模转换器和TLC2543串行接口模数转换器的基本原理和编程方

法。

2.进一步熟悉单片机应用系统开发步骤和方法。

二、实验电路

实验所用元件清单如下表所示:

1. 串行A/D转换器TLC2543

2.并行D/A转换器DA0832

三、相关知识

(一)串行A/D转换器TLC2543

1. TLC2543的特性与引脚

TLC2543是TI公司的TLC2543 12位串行A/D转换器,使用开关电容逐次逼近技术完成A/D转换过程。由于是串行输入结构,能够节省80C51系列单片机的I/O资源,而且价格适中。

主要特点如下:

●12位分辨率A/D转换器。

●在工作温度范围内10 s转换时间。

●11个模拟输入通道。

●3路内置自测试方式。

●采样率为66kbps。

●线性误差+1LSB(max)。

●有转换结束(EOC)输出。

●具有单、双极性输出。

●可编程的MSB或LSB前导。

●可编程的输出数据长度。

2. TLC2543的工作过程

TLC2543的工作过程分为两个周期:I/O 周期和实际转换周期。

1)I/O周期

I/O周期由外部提供的I/O CLOCK定义,延续8、12或16个时钟周期,决定于选定的输出数据长度。器件进入I/O周期后同时进行两种操作。

(1)在I/O CLOCK的前8个脉冲的上升沿,以MSB前导方式从DA TA INPUT端输入8位数据流到输入寄存器。其中前4位为模拟通道地址,控制14通道模拟多路器从11个模拟输入和3个内部自测电压中,选通一路送到采样保持电路,该电路从第4个I/O CLOCK脉冲的下降沿开始,对所选信号进行采样,直到最后一个I/O CLOCK脉冲的下降沿。I/O周期的时钟脉冲个数与输出数据长度(位数)有关,输出数据长度由输入数据的D3、D2选择为8、12或16位。当工作于12或16位时,在前8个时钟脉冲之后,DATA INPUT无效。

(2)在DATA OUT端串行输出8、12或16位数据。当CS保持为低时,第一个数据出现在EOC的上升沿;若转换由CS控制,则第一个输出数据发生在CS的下降沿。这个数据串是前一次转换的结果,在第一个输出数据位之后的每个后续位均由后续的I/O CLOCK脉冲下降沿输出。

2)转换周期

在I/O周期的最后一个I/O CLOCK脉冲下降沿之后,EOC变低,采样值保持不变,转换周期开始,片内转换器对采样值进行逐次逼近式A/D转换,其工作由与I/O CLOCK同步的内部时钟控制。转换完成后EOC变高,转换结果锁存在输出数据寄存器中,待下一个I/O周期输出。I/O周期和转换周期交替进行,从而可以减小外部的数字噪声对转换精度的影响。

TLC2543的工作时序如图7.41所示。

3. TLC2543与89C52的接口电路

下图是89C52与TLC2543的接口电路,TLC2543的5条接口线可接到单片机的任何通用双向I/O 口上。

(二)并行D/A转换器DAC0832

1.D/A转换是把数字量转换成模拟量的变换,实验台上D/A电路输出的是模拟电压信号。要实现实验要求,比较简单的方法是产生三个波形的表格,然后通过查表来实现波形显示。

2、产生锯齿波和三角波的表格只需由数字量的增减来控制,同时要注意三角波要分段来产生。要产生正弦波,较简单的方法是造一张正弦数字量表。即查函数表得到的值转换成十六进制数填表。D/A转换取值范围为一个周期,采样点越多,精度越高些。本例采用的采样点为256点/周期。

3、8位D/A转换器的输入数据与输出电压的关系为

U(0∽-5V)=Uref/256×N

U(-5V∽+5V)=2·Uref/256×N-5V (这里 Uref为+5V)

4、DAC0832与89C52的接口电路

四、实验内容

1.按照上图设计仿真电路原理图。

2.编写程序实现采集AI0~AI11十二个输入通道模拟输入,并转换结果从串口送到模拟终端显

示。

3.编写程序实现产生方波、三角波和梯形波的程序,并在虚拟示波器上显示波形。

五、参考程序

1、A/D转换接口实验

COMMON.c程序

#include /* special function register declarations */

#include

/*********************************************************

* 函数说明:延时5us,晶振改变时只用改变这一个函数!

1、对于11.0592M晶振而言,需要2个_nop_();

2、对于22.1184M晶振而言,需要4个_nop_();

* 入口参数:无

* 返回:无

*********************************************************/

void delay_5us(void)//延时5us,晶振改变时只用改变这一个函数!

{

_nop_();

_nop_();

//_nop_();

//_nop_();

}

/************ delay_50us ***************/

void delay_50us(void)//延时50us

{

unsigned char i;

for(i=0;i<4;i++)

{

delay_5us();

}

}

/******** 延时100us ******************/

void delay_100us(void)//延时100us

{

delay_50us();

delay_50us();

}

/*********** 延时单位:ms *******************/

void time(unsigned int ucMs)//延时单位:ms

{

unsigned char j;

while(ucMs>0){

for(j=0;j<10;j++) delay_100us();

ucMs--;

}

}

/********** 初始化串口波特率 ************/

void initUart(void)/*初始化串口波特率,使用定时器2*/

{

/* Setup the serial port for 9600 baud at 11.0592MHz */

SCON = 0x50; //串口工作在方式1

RCAP2H=(65536-(3456/96))>>8;

RCAP2L=(65536-(3456/96))%256;

T2CON=0x34;

TI = 1; /* 置位TI*/

}

common.h程序

#include /* special function register declarations */ #include /* prototype declarations for I/O functions */ #include

#include

#include

#include

#define byte unsigned char

#define uchar unsigned char

#define word unsigned int

#define uint unsigned int

#define ulong unsigned long

#define BYTE unsigned char

#define WORD unsigned int

#define TRUE 1

#define FALSE 0

extern void initUart(void);/*初始化串口*/

extern void time(unsigned int ucMs);//延时单位:ms

Main.c程序

#include "common.h"

extern void CollectADmodule(uint *ad_result);

/******** main 函数 *********/

void main (void) {

uint idata TLC2543[11];

uchar i;

initUart(); /* 初始化串口 */

do{

CollectADmodule(TLC2543);//调用11通道AD转换

for(i=0;i<11;i++){

printf("TLC2543[%bd]=%u\n",i,TLC2543[i]);//打印输出结果}

printf("\n\n");//回车2次

time(1000);

}while(TRUE);

}

Tlc2543.c程序

#include

#include

#include

#include

#include

#define byte unsigned char

#define uchar unsigned char

#define word unsigned int

#define uint unsigned int

#define ulong unsigned long

#define BYTE unsigned char

#define WORD unsigned int

uint read2543(uchar port);

void CollectADmodule(uint *ad_result);

extern void time(unsigned int ucMs);//延时单位:ms

/**************************************

2543控制引脚宏定义

*************************************/

sbit AD_EOC = P1^0; /* TLC2543转换完成指示引脚EOC */ sbit CLOCK = P1^2; /*2543时钟*/

sbit AD_CS = P1^3; /*2543片选*/

sbit D_IN = P1^4; /*2543输入*/

sbit D_OUT = P1^5; /*2543输出*/

/**************************************

TLC2543驱动程序

*************************************/

/**************************************

名称:read2543

功能:TLC2543驱动模块

输入参数:port通道号

输出参数:ad转换值

*************************************/

uint read2543(uchar port)

{

uint ad=0;

uchar i;

P1=0xeb;

CLOCK = 0;

AD_CS = 0;

port<<=4;

for(i=0;i<8;i++) //读高8位

{

if(D_OUT) ad|=0x01;

D_IN=(bit)(port&0x80);

CLOCK=1;

CLOCK=0;

port<<=1;

ad<<=1;

}

for(i=8;i<12;i++) //读低4位

{

if(D_OUT) ad|=0x01;

CLOCK=1;

CLOCK=0;

ad<<=1;

}

AD_CS=1;

ad>>=1;

return(ad);

}

/**************************************************

* 函数说明:采集实际端口的数据

* 入口参数:

*ad_result 存各模拟通道的结果

**************************************************/

void CollectADmodule(uint *ad_result)

{

uchar i;

AD_EOC=1;

read2543(0); //启动0通道转换,第一次转换结果不准确,丢弃

while(!AD_EOC){} //等待转换完成

time(3);

read2543(0);

while(!AD_EOC){} //等待转换完成

for(i=0;i<11;i++){

ad_result[i]= read2543(i+1); //读转换结果,并启动下次转换

while(!AD_EOC){} //等待转换完成

time(3);

read2543(i+1); //读转换结果,并启动下次转换

while(!AD_EOC){} //等待转换完成

}

}

2.D/A转换接口实验

锯齿波程序:

ORG 0000H

LJMP START

ORG 0100H

START: MOV R0,#0FEH

MOVX @R0,A

INC A

LCALL DELAY

SJMP START

DELAY: MOV R1,#2H

LP: MOV R2,#20H

DJNZ R2,$

DJNZ R1,LP

RET

END

六、实验要求

写出实验报告,内容包括:

(1)实验目的。

(2)实验电路组成及各单元描述

(3)软件组成及主要模块流程图

(4)写出详细的调试步骤,记录实验现象。可通过μVision3 IDE提供的单步、断点、连续等调

试功能查看实验电路和内部寄存器、存储器的变化情况。

七、思考与讨论

串行接口A/D转换器与并行接口A/D转换器比较有什么优点?

相关主题
相关文档
最新文档