#include <reg51.h>
#include "TLC549.c"
code uchar seven_seg[] = {0xc0, 0xf9, 0xa4, 0xb0, 0x99, 0x92, 0x82, 0xf8, 0x80, 0x90}; //0--9
uchar cp, j;
uint dat_ad; //模拟信号
void timer0_init(void); //声明中断初始化函数
void timer0_isr(void); //声明中断服务函数
/**************************主函数***************************/
void main(void)
{
timer0_init(); // 中断初始化函数
tlc549_init(); //tlc549初始化函数
while(1); //循环
}
/**********************中断初始化函数***********************/
void timer0_isr(void) interrupt 1
{
TH0 = 0xf8;
TL0 = 0x2f;
cp++;
if(cp >= 250) // 0.5秒让ADC0832转换一次
{
cp = 0;
dat_ad = tlc549_ad() * 1.96; // ,模拟信号转化为数字信号
}
P0 = 0xff;
switch(j)
{
case 0: P0 = seven_seg[dat_ad % 10]; P2 = ~0x01; break; //模拟信号
case 1: P0 = seven_seg[dat_ad % 100 / 10]; P2 = ~0x02; break;
case 2: P0 = seven_seg[dat_ad / 100] & 0x7f; P2 = ~0x04; break; //模拟信号三位
case 3: P0 = seven_seg[tlc549_ad() % 10]; P2 = ~0x08; break; //数字信号
case 4: P0 = seven_seg[tlc549_ad() % 100 / 10]; P2 = ~0x10; break;
case 5: P0 = seven_seg[tlc549_ad() / 100]; P2 = ~0x20; break; //数字信号三位
}
j++;
if(j >= 6) //共六位
j = 0;
}
void timer0_init(void) //中断初始化函数
{
TMOD = 0x01; //方式一
TH0 = 0xf8;
TL0 = 0x2f; //对机器脉冲计数,2000个计满溢出引发中断
EA = 1; //总中断
ET0 = 1; //T0中断
TR0 = 1; //启动定时器T0
}
/****************************************************************************************/
/*************************************TLC549的驱动程序***********************************/
/*TLC549模数转换将连续变化的模拟信号转换为离散的数字信号V = 5 / 256 = 0.01953v = 19.53mv*/
/****************************************************************************************/
#define uchar unsigned char //宏定义用uchar 代替 unsigned char (0--255)
#define uint unsigned int //宏定义用uint 代替 unsigned int (0--65535)
sbit SCLK = P3^7; //I/O时钟
sbit CS = P3^4; //片选
sbit SDO = P3^5; //数据线
/***********************TLC549初始化**************************/
void tlc549_init(void)
{
CS = 1; //初始化,启动
SCLK = 0;
CS = 0;
}
/**********************TLC549数据转换*************************/
uchar tlc549_ad(void)
{
uchar i, dat_temp = 0;
tlc549_init();
for(i = 0; i < 8; i++) //读取采集数据,读取的是上一次采集的数据
{
SCLK = 1;
dat_temp <<= 1;
if(SDO)dat_temp |= 0x01;
SCLK = 0;
}
CS = 1;
return(dat_temp);
}
TLC549应用
(1) TLC的作用
TLC549是 TI公司生产的一种低价位、高性能的8位 A/D转换器,采用了CMOS工艺,它以8位开关电容逐次逼近的方法实现 A/D转换,其转换速度小于 17us,最大转换速率为 40000HZ,4MHZ典型内部系统时钟,电源为 3V至 6V。它能方便地采用三线串行接口方式与各种微处理器连接,构成各种廉价的测控应用系统。能够实现模拟信号到数字信号的转换。
(2) 对TLc549的认识
模拟信号到数字信号的转换。
(4)工作原理
当/CS变为低电平后, TLC549芯片被选中, 同时前次转换结果的最高有效位MSB (A7)自 DATA OUT 端输出,接着要求自 I/O CLOCK端输入8个外部时钟信号,前7个 I/OCLOCK信号的作用,是配合 TLC549 输出前次转换结果的 A6-A0 位,并为本次转换做准备:在第4个 I/O CLOCK 信号由高至低的跳变之后,片内采样/保持电路对输入模拟量采样开始,第8个 I/O CLOCK 信号的下降沿使片内采样/保持电路进入保持状态并启动 A/D开始转换。转换时间为 36 个系统时钟周期,最大为 17us。直到 A/D转换完成前的这段时间内,TLC549 的控制逻辑要求:或者/CS保持高电平,或者 I/O CLOCK 时钟端保持36个系统时钟周期的低电平。由此可见,在自 TLC549的 I/OCLOCK 端输入8个外部时钟信号期间需要完成以下工作:读入前次A/D转换结果;对本次转换的输入模拟信号采样并保持;启动本次 A/D转换开始。
(4)器件的作用
Pot-hg:产生0~5V的电压,作为模拟信号,传递给tlc549.
数码管:显示数字信号和模拟信号的数值
Respack_8:驱动,电流不够,加排阻增加电流,排阻一般有九个脚,一个脚接VCC,其他脚接单片机I/o口,比如说P0口,一般需要加排阻。
7404反相器:增大电流
Tlc549: 模拟信号到数字信号的转换。
每个人都会有一段异常艰难的时光 。
生活的压力 , 工作的失意 , 学业的压力。
爱的惶惶不可终日。
挺过来的 ,人生就会豁然开朗。
挺不过来的 ,时间也会教你 ,怎么与它们握手言和 ,所以不必害怕的。
——杨绛