一、特性
(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++;
}
}
}
}