549:
四极管:AD549(TLC_549.C)
#ifndef TLC549_C
#define TLC549_C
/***********************************
函数功能:八位AD转换
使用环境: 硬件: MCU: ATmega32L
F_CPU = 16000000
外部:16000000
编译环境:WinAVR-20080610
作者:杨琦
日期:2009年8月20日
修改者: (日期: )
***************************************/
#define CS_549_1() {DDRD|=(1<<0);PORTD|=(1<<0);}
#define CS_549_0() {DDRD|=(1<<0);PORTD&=~(1<<0);}
#define SCL_549_1() {DDRD|=(1<<1);PORTD|=(1<<1);}
#define SCL_549_0() {DDRD|=(1<<1);PORTD&=~(1<<1);}
#define DAT_549 PIND&(1<<2)
#include <util/delay.h>
uint8_t Read_Tlc_549(void)
{
uint8_t counter = 0;
uint16_t dat = 0;
CS_549_0();
_delay_us(2);
for( ; counter<8 ; counter++ )
{
DDRD&=~(1<<2);
dat <<= 1;
SCL_549_1();
_delay_us(1);
if(DAT_549)
{
dat |=0x01;
}
SCL_549_0();
_delay_us(1);
}
CS_549_1();
return dat ;
}
#endif
5615:
四极管:DA(TLC5615.C)
#ifndef TLC5615_C
#define TLC5615_C
/***********************************
函数功能:八位DA转换
使用环境: 硬件: MCU: ATmega32L
F_CPU = 16000000
外部:16000000
编译环境:WinAVR-20080610
作者:杨琦
日期:2009年8月20日
修改者: (日期: )
***************************************/
//16位移位寄存器分为4位虚拟位、低两位填充位以及10位有效位,在单片机
//TLC5615工作时,只需要向16位移位寄存器按先后输入10位有效位和低两位填充位
//两位填充位数据任意
/***********************************
// INPUT OUTPUT(VOLTAGE) VREFIN="2".510v时实测输出
// 1111 1111 11(00)=0X0FFC 2(VREFIN)1023/1024 4.950v
// 1000 0000 01(00)=0X804 2(VREFIN) 513/1024 2.513v
// 1000 0000 00(00)=0X800 2(VREFIN) 512/1024 =VREFIN 2.510v
// 0100 0000 00(00)=0X400 2(VREFIN) 256/1024 1.256v
// 0011 1111 11(00)=0X3FC 2(VREFIN) 255/1024 1.250v
// 0000 0000 11(00)=0X0C 2(VREFIN) 3/1024 1.162v
// 0000 0000 10(00)=0X08 2(VREFIN) 2/1024 0.112v
// 0000 0000 01(00)=0X04 2(VREFIN) 1/1024 0.008v 增值约为5mV/1
// 0000 0000 00(00)=0 0 V (不用DAC转换时将其置此值以减少功耗)
**************************************/
#include <util/delay.h>
#define Din_5615_0() {DDRD|=(1<<0);PORTD&=~(1<<0);}
#define Din_5615_1() {DDRD|=(1<<0);PORTD|=(1<<0);}
#define Scl_5615_0() {DDRD|=(1<<1);PORTD&=~(1<<1);}
#define Scl_5615_1() {DDRD|=(1<<1);PORTD|=(1<<1);}
#define Cs_5615_0() {DDRD|=(1<<2);PORTD&=~(1<<2);}
#define Cs_5615_1() {DDRD|=(1<<2);PORTD|=(1<<2);}
//#define REFERANCE5615 5000 //5v //外部基准电压
#define REFERANCE5615 2510 //2.48v
/****************************************
** 函数名:uint16_t TLC_5615(uint16_t dat)
** 功 能:10位 DA转换
** 参 数:无
** 返回值:无
****************************************/
uint16_t TLC_5615(uint16_t dat)
{
uint32_t datat = dat ;
uint8_t i;
Cs_5615_0(); //拉低片选,移入串行输入数据
for ( i = 0; i<12; i++) //串行送数据,数据的上升沿送数据
{
Scl_5615_0();
if(dat&0x800) //如果最高位为1
{
Din_5615_1(); //数据线拉高
}
else
{
Din_5615_0(); //数据线拉低
}
Scl_5615_1(); //拉高时钟线
_delay_us(1);
dat<<=1; //数据左移一位
Cs_5615_0();
}
Scl_5615_0(); //拉低TLC5615的时钟,等待上升沿送数据,同时
//片选的拉高和拉低都要在SCLK的低电平
Cs_5615_1();
datat = ((datat*(REFERANCE5615))>>11); //datat=((datat*(REFERANCE5615)*2)/1024);
return datat;
}
#endif
转载请注明出处。作者:四极管。广西师范大学 电子工程学院大学生科技创新基地 邮箱: yangxingbo-0311@163.com。