(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采集一次数据,并通过串口发送出去,程序如下:
#i nclude
#i nclude
#i nclude
#define uchar unsigned char
#define uint unsigned int
sbit TCL2543_CLK = P3^2;
sbit TCL2543_ADIN = P3^3;
sbit TCL2543_DOUT = P3^4;
sbit TCL2543_CS = P3^5;
sbit EOC = P1^6;
// 其中 port 为通道: 通道0:port = 0x01 通道1:port = 0x02 通道2:port = 0x04 ...
uint read2543(unsigned char port)
{
unsigned int i;
uint ad_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;
return ad_value;
}
void main(void)
{
unsigned int i = 0, a=0, result=0, j=0;
unsigned char tm_tm = 5;
float tmp;
tm_tm = 40;
SCON = 0x50; //串口方式1,允许接收
TMOD = 0x20; //定时器1 定时方式2
TCON = 0x40; //设定时器1 开始计数
TH1 = 0xFD; //11.0592MHz 9600 波特率
// 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 = 0x20 0x01;// T1 T0, 工作方式1
TR0 = 1; // START T0
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
#define uint unsigned int
#define uchar unsigned char
//**************************修改硬件时要修改的部分********************************
sbit clock = P0^0; //输入、输出时钟端
sbit input = P0^1; //数据输入端
sbit output = P0^2; //数据输出端
sbit CS = P0^3; //片选端,负电平有效
void delay(uchar N)
{
while(N--);
}
uint read2543(uchar CON_WORD) //CON_WORD为选择的通道,为0--10
{
uint ad=0;
uchar i;
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);
}
void init_serial() //初始化串口
{
TMOD=0x20; //定时器T1使用工作方式2
TH1=250; //设置初值
TH0=250;
TR1=1; //开始计时
PCON=0x80; //SMOD=1;
SCON=0x50; //工作方式1,波特率9600bit/s,允许接收
TI=1;
}
void main()
{
uint ad=0;
float fVoltage1;
uchar buf[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++;
}
}
}
}
上一篇:pt100测温程序-LCD1602
下一篇:51单片机的P1、P2、P3口的工作原理
推荐阅读最新更新时间:2024-03-16 15:08