#include <reg51.h>
#include "TLC5615.c"
code uchar seven_seg[] = {0xc0, 0xf9, 0xa4, 0xb0, 0x99, 0x92, 0x82, 0xf8, 0x80, 0x90}; //数码管显示
uchar cp,j; // 、、定义 变量
uint Data, imitate; /*模拟电压V = 5 / 1024 = 0.00488 */
void timer0_init(void); /*声明中断初始化函数*/
void timer0_isr(void); /*声明中断服务函数 */
/*********************************主函数********************************/
void main()
{
timer0_init(); //中断初始化函数
while(1); //循环
}
/*******************************中断服务函数****************************/
/*当TLC5615接收10位数据全为1时,理论上,OUT端输出电压5V,但实际应用时最高
输出电压4.7V。即TLC5615输入数据超过961时,输出电压将不再增加。**********/
void timer0_isr(void) interrupt 1
{
TH0 = 0xf8;
TL0 = 0x2f;
cp++;
if(cp >= 250) /*半秒时间*/
{
cp = 0;
tlc5615(Data);
if(Data >= 962) // TLC5615输入数据超过961时,输出电压将不再增加。
Data = 0; //归零
imitate = Data * 0.489; //数组数据转换为模拟数据
Data = Data + 10; //变换数据
}
P0 = 0xff; //清屏
switch(j)
{
case 0 : P0 = seven_seg[imitate % 10]; P2 = ~0x01; break; //模拟电压
case 1 : P0 = seven_seg[imitate % 100 / 10]; P2 = ~0x02; break;
case 2 : P0 = seven_seg[imitate / 100] & 0x7f; P2 = ~0x04; break;
case 3 : P0 = seven_seg[Data % 10]; P2 = ~0x08; break; //数字信号
case 4 : P0 = seven_seg[Data % 100 / 10]; P2 = ~0x10; break;
case 5 : P0 = seven_seg[Data / 100]; P2 = ~0x20; break;
}
j++;
if(j >= 6) //六位显示
j = 0;
}
/*****************************中断初始化函数****************************/
void timer0_init(void)
{
TMOD = 0x01; //工作方式1
TH0 = 0xf8;
TL0 = 0x2f;
EA = 1;
ET0 = 1;
TR0 = 1;
}
/*****************************************************************************************/
/*************************************TLC5615的驱动程序***********************************/
/*TLC5615模数转换将离散的数字信号转换为连续变化的模拟信号V = 5 / 256 = 0.01953v = 19.53mv*/
/*****************************************************************************************/
#define uchar unsigned char //宏定义 用uchar 代替 unsigned char
#define uint unsigned int //宏定义 用uint 代替 unsigned int
sbit DIN = P3^6;
sbit SCLK = P3^7;
sbit CS = P3^4;
/************************TLC5615的初始化**************************/
void tlc5615_init(void)
{
CS = 1;
SCLK = 0;
CS = 0;
}
/************************TLC5615的初始化**************************/
/**********由于TLC5615是十位转换位,定义一个16位的变量************/
void tlc5615(uint Data)
{
uchar i;
Data <<= 6; //两个字节有16位,去掉高六位剩下十位有效位
tlc5615_init(); //初始化函数
for(i = 0; i < 12; i++) //根据PDF文档可知,要送的只有十位数但是后面要跟着多加两位零才能将一个数据送出去
{
DIN = (bit)(Data & 0x8000); //当dat与0x8000相与然后强制转换后有一位,这时只就只可以直接送给DA端进行发送
SCLK = 1; //前面一句亦可用DA=CY来代替,但后面的顺序要调换才行
Data <<= 1;
SCLK = 0;
}
CS = 1;
SCLK = 0;
}
TLC5615应用
(1) TLC5615的作用
DIN: 串行数据输入端;TLC5615引脚图
SCLK: 串行时钟输入端;
CS: 芯片选用通端,低电平有效;
DOUT: 用于级联时的串行数据输出端;
AGND: 模拟地;
REFIN:基准电压输入端, 2V~ (VDD - 2);
OUT: DAC 模拟电压输出端;
VDD: 正电源端,4.5~5.5V ,通常取 5V。
将数字信号转化为模拟信号
(2) 对TLC5615的认识
TLC5615 为美国德州仪器公司 1999 年推出的产品,是具有串行接口的数模转换器,其输出为电压型,最大输出电压是基准电压值的两倍。带有上电复位功能,即把 DAC 寄存器复位至全零。性能比早期电流型输出的 DAC 要好。只需要通过 3 根串行总线就可以完成 10 位数据的串行输入, 易于和工业标准的微处理器或微控接口, 适用于电池供电的测试仪表、移动电话,也适用于数字失调与增益调整以及工业控制场合。
(3) 工作原理
只有当片选 CS 为低电平时, 串行输入数据才能被移入 16位移位寄存器。当 CS 为低电平时,在每一个 SCLK 时钟的上升沿将 DIN 的一位数据移入 16 位移寄存器。注意, 二进制最高有效位被导前移入。接着,CS 的上升沿将 16 位移位寄存器的 10 位有效数据锁存于 10 位 DAC 寄存器, 供 DAC 电路进行转换; 当片选 CS 为高电平时,串行输入数据不能被移入 16 位移位寄存器。注意, CS 的上升和下降都必须发生在 SCL K 为低电平期间。
(4) 仿真器件作用
respack_8:驱动,电流不够,加排阻增加电流,排阻一般有九个脚,
个脚接VCC,其他脚接单片机I/o口,比如说P0口,一般需要加排阻。
7404反相器:增大电流
TLC5615:数字信号转化为模拟信号
数码管:实现信号的显示
每个人都会有一段异常艰难的时光 。
生活的压力 , 工作的失意 , 学业的压力。
爱的惶惶不可终日。
挺过来的 ,人生就会豁然开朗。
挺不过来的 ,时间也会教你 ,怎么与它们握手言和 ,所以不必害怕的。
——杨绛