四极管:AD/DA AVR 之 549和5615

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

转载请注明出处。作者:四极管。广西师范大学 电子工程学院大学生科技创新基地 邮箱: [email protected]

你可能感兴趣的:(c,工作,input,output,delay)