12位A/D轉(zhuǎn)換器TLC2543
(1)12位分辨率A/D轉(zhuǎn)換器;
本文引用地址:http://m.butianyuan.cn/article/201611/316092.htm(2)在工作溫度范圍內(nèi)10μs轉(zhuǎn)換時間;
(3)11個模擬輸入通道;
(4)3路內(nèi)置自測試方式;
(5)采樣率為66kbps;
(6)線性誤差1LSB(max)
(7)有轉(zhuǎn)換結束(EOC)輸出;
(8)具有單、雙極性輸出;
(9)可編程的MSB或LSB前導;
(10)可編程的輸出數(shù)據(jù)長度。
二、引腳圖
TLC2543的引腳排列如圖所示。其中:
AIN0~AIN10:模擬輸入端;
CS:片選端;
DIN:串行數(shù)據(jù)輸入端;
DOUT:A/D轉(zhuǎn)換結果的三態(tài)串行輸出端;
EOC:轉(zhuǎn)換結束端;
CLK:I/O時鐘;
REF:正基準電壓端;
REF-:負基準電壓端;
VCC:電源;
GND:地。
三、程序
本程序使用C51編程,每隔250ms采集一次數(shù)據(jù),并通過串口發(fā)送出去,程序如下:
#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開始計數(shù)
TH1=0xFD;//11.0592MHz9600波特率
//TH1=0xF8;//30MHz,9600Bps=248=0xF8
TL1=0xE8;
TI=1;
TR1=1;//啟動定時器
//使用定時器。30MHz晶振,0.4us周期,預置50000=20ms,計數(shù)50次=1秒
//使用定時器0。11.0592MHz晶振,1.0us周期,預置50000=50ms,計數(shù)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.2fn",result,tmp);
}
TF0=0;
TH0=60;
TL0=176;
}
}
}
///////////////////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////////////////
#include
#defineuintunsignedint
#defineucharunsignedchar
//**************************修改硬件時要修改的部分********************************
sbitclock=P0^0;//輸入、輸出時鐘端
sbitinput=P0^1;//數(shù)據(jù)輸入端
sbitoutput=P0^2;//數(shù)據(jù)輸出端
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++;
}
}
}
}
評論