×
嵌入式 > 嵌入式开发 > 详情

12位A/D转换器TLC2543

发布时间:2020-07-21 发布时间:
|
一、特性

(1)12位分辨率A/D转换器

(2)在工作温度范围内10μs转换时间;

(3)11个模拟输入通道;

(4)3路内置自测试方式;

(5)采样率为66kbps;

(6)线性误差1LSB(max)

(7)有转换结束(EOC)输出;

(8)具有单、双极性输出;

(9)可编程的MSB或LSB前导;

(10)可编程的输出数据长度。

二、引脚图

TLC2543的引脚排列如图所示。其中:

AIN0~AIN10:模拟输入端;

CS:片选端;

DIN:串行数据输入端;

DOUT:A/D转换结果的三态串行输出端;

EOC:转换结束端;

CLK:I/O时钟;

REF:正基准电压端;

REF-:负基准电压端;

VCC:电源

GND:地。

三、程序

本程序使用C51编程,每隔250ms采集一次数据,并通过串口发送出去,程序如下:

#include

#include

#include

#defineucharunsignedchar

#defineuintunsignedint

sbitTCL2543_CLK=P3^2;

sbitTCL2543_ADIN=P3^3;

sbitTCL2543_DOUT=P3^4;

sbitTCL2543_CS=P3^5;

sbitEOC=P1^6;

//其中port为通道:通道0:port=0x01通道1:port=0x02通道2:port=0x04...

uintread2543(unsignedcharport)

{

unsignedinti;

uintad_value=0;

TCL2543_CLK=0;

TCL2543_CS=0;

EOC=1;

port<<=4;

for(i=0;i<12;i)

{

if(TCL2543_DOUT)ad_value|=0x01;

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

TCL2543_CLK=1;

_nop_();

_nop_();

_nop_();

TCL2543_CLK=0;

_nop_();

_nop_();

_nop_();

port=port<<1;

ad_value=ad_value<<1;

}

TCL2543_CS=1;

ad_value=ad_value>>1;

returnad_value;

}

voidmain(void)

{

unsignedinti=0,a=0,result=0,j=0;

unsignedchartm_tm=5;

floattmp;

tm_tm=40;

SCON=0x50;//串口方式1,允许接收

TMOD=0x20;//定时器1定时方式2

TCON=0x40;//设定时器1开始计数

TH1=0xFD;//11.0592MHz9600波特率

//TH1=0xF8;//30MHz,9600Bps=248=0xF8

TL1=0xE8;

TI=1;

TR1=1;//启动定时器

//使用定时器。30MHz晶振,0.4us周期,预置50000=20ms,计数50次=1秒

//使用定时器0。11.0592MHz晶振,1.0us周期,预置50000=50ms,计数20次=1秒

TH0=60;//(65536-50000)/256;

TL0=176;//(65536-50000)%256;

TMOD=0x200x01;//T1T0,工作方式1

TR0=1;//STARTT0

while(1)

{

if(TF0==1)

{

a;

if(a==tm_tm)//250ms

{

a=0;

result=read2543(1);

tmp=(result*60.0/4096.0);

printf("%d,%4.2f\n",result,tmp);

}

TF0=0;

TH0=60;

TL0=176;

}

}

}


///////////////////////////////////////////////////////////////////////////////////////////

///////////////////////////////////////////////////////////////////////////////////////////////////////

////////////////////////////////////////////////////////////////////////////////////////////////////////

#include

#defineuintunsignedint
#defineucharunsignedchar

//**************************修改硬件时要修改的部分********************************

sbitclock=P0^0;//输入、输出时钟端
sbitinput=P0^1;//数据输入端
sbitoutput=P0^2;//数据输出端
sbitCS=P0^3;//片选端,负电平有效

voiddelay(ucharN)
{
while(N--);
}

uintread2543(ucharCON_WORD)//CON_WORD为选择的通道,为0--10
{
uintad=0;
uchari;
CON_WORD<<=4;
clock=0;
CS=0;
for(i=0;i<12;i++)
{
if(output==1)//读取DATAOUT
ad=ad|0x01;
if(CON_WORD&0x80)//读取控制字到INPUT
input=1;
else
input=0;
clock=1;
delay(10);
clock=0;
delay(10);
CON_WORD<<=1;
ad<<=1;
}
CS=1;
ad>>=1;
return(ad);
}

voidinit_serial()//初始化串口
{
TMOD=0x20;//定时器T1使用工作方式2
TH1=250;//设置初值
TH0=250;
TR1=1;//开始计时
PCON=0x80;//SMOD=1;
SCON=0x50;//工作方式1,波特率9600bit/s,允许接收
TI=1;
}

voidmain()
{
uintad=0;
floatfVoltage1;
ucharbuf[5],i;
init_serial();
IE=0;//屏蔽中断
while(1)
{
ad=read2543(0);
fVoltage1=(float)ad/0x0fff*5;
buf[0]=(uchar)fVoltage1;
buf[0]=buf[0]+0x30;
buf[1]=.
buf[2]=(uchar)(fVoltage1*10)%10;
buf[2]=buf[2]+0x30;
buf[3]=(uchar)(fVoltage1*100-buf[0]*100)%10;
buf[3]=buf[3]+0x30;
buf[4]=(uchar)((fVoltage1*1000)-buf[0]*1000-buf[1]*100)%10;
buf[4]=buf[4]+0x30;
i=0;
while(i<5)
{
if(TI==1)
{
SBUF=buf[i];
TI=0;
i++;
}
}
}
}



『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
CC-Link现场总线及应用实例