标签:
单片机 AD模数转换
TLC0834是TI公司生产的八位逐次逼近模数转换器,具有输入可配置的多通道多路器和串行输入方式。文中以AT89C51 CPU为核心,采用LTC0834八位串行A/D转换器设计了一个可将模拟信号转换为数字信号的电路。

CH0~CH3为模拟输入端;
CS 为片选端;
DI为串行数据输入,该端仅在多路器寻址时(MUX Settling Time)才
被检测;
DO为A/D转换结果的三态串行输出端;
CLK为时钟;
SARS为转换状态输出端,该端为高电平时,表示转换正在进行,为低电平则表示转换
完成;REF为参考电压输入端;
VCC为电源;
DGTL GND为数字地,
ANGL GND为模拟地。

转换时序图
依照时序写程序如下:
#include<reg51.h>
#define uchar unsigned char
sbit cs="P1"^0; //0834片选信号,低电平开始一次转换,高电平结束转换
sbit clk="P1"^1; //0834时钟信号
sbit dat="P1"^2; //0834模拟输入端进行配置及输出转换所得的数据
/****************************************
TLC0834
*****************************************/
uchar tlc_read(bit SGL,bit ODD,bit Bit1)
{
uchar i,dig1,dig2;
clk=0; //发送输入配置端信号时为上升沿触发
cs=0;
dat=1; //发送start bit
clk=1;
clk=0;
dat=SGL; //发送SGL
clk=1;
clk=0;
dat=ODD; //发送ODD
clk=1;
clk=0;
dat=Bit1; //发送Bit 1
clk=1;
clk=0; //时钟交换变成下降沿触发
for(i=8;i>0;i--)
{
dig1=dig1|dat; //第一次输出数据是高位在前低位在后
dig1=dig1<<1;
clk=1; //输出数据为下降沿触发
dat=1; //先写1后再读,否则读出的数据不可预期 这一点很重要!!!
clk=0;
}
dig1=dig1|dat; //上面循环差最后一次赋值,同时这个值也是下一个循环的第一位数据!!!
for(i=8;i>0;i--)
{
dig2=dig2>>1; //第二次输出数据是低位在前高位在后
if(dat)
{
dig2=dig2|0x80;
}
clk=1;
dat=1; //先写1后再读,否则读出的数据不可预期 很重要的一点!!!
clk=0;
}
cs=1; //结束转换
if(dig1==dig2) //判断两次输出结果是否一致
return(dig1); //一致就输出
}
/************************************
主函数
*************************************/
void main(void)
{
while(1)
{
P2=tlc_read(1,0,0); //选择CH0端口输入模拟信号
}
}
资料、程序及仿真都在附件里,如果觉得可以别忘了顶一下,对了再提醒一次,在写数据前一定要先写入 1!(我也是开始写时也不知道,幸好在网上找到了)
系统分类:
单片机 | 用户分类:
实验 | 来源:
原创 | 【推荐给朋友】 | 【添加到收藏夹】