TLC2543芯片AD转换例子

/*
    TLC2543芯片AD转换例子,采集第2通道AIN2的电压数据,并通过串口发送转换结果
    发送格式为:“转换结果,毫伏数值”。每隔150ms闪亮LED灯。
*/

#include 
< mega8535.h >
#include 
< delay.h >
#include 
< stdio.h >

#define  uchar unsigned char
#define  uint unsigned int

#define  _LED          PORTD.6
#define   TXEN         3

#define  TCL2543_EOC     PINB.4       //  EOC输出信号   
#define  TCL2543_CLK     PORTB.3      //  时钟信号
#define  TCL2543_ADIN    PORTB.2      //  数据输入端
#define  TCL2543_DOUT    PINB.1       //  数据输出端
#define  TCL2543_CS      PORTB.0      //  片选信号
#define  TCL2543_DDR     0x0D         //  0000 1101

uchar ct
= 0 ;
void  Init( void )
{
    DDRD 
= 0xFF;
    PORTD 
= 0xFF;
    DDRB 
= TCL2543_DDR;
    PORTB 
= 0xFF;
    
    
// T = 1024*108/11.0592 = 10000us = 10ms
    TCCR0 = 0x05;       // 1024分频, 11.0592M, 10ms定时
    TCNT0 = 148;        // 初值。计数=256-148 = 108
    TIMSK |= 0x01;      // T/C0 溢出中断使能 
    
    UBRRH 
= 0;
    UBRRL 
= 71;            // 9600bps, 11.0592MHz
    UCSRB = (1<<TXEN);  // 发送器使能
    
    SREG.
7 = 1;         // 全局中断使能

    TCL2543_CS 
= 0;     //初始化TLC2543 
    TCL2543_CS = 1;
    TCL2543_CLK 
= 0;
}
   

void  delay(uchar   n)   
{   
    uchar i;   
    
for(i=0; i<n; i++)   
        #asm(
"nop");   
}
   

//     功能:TLC2543驱动模块   
//     输入参数:port通道号   
//     输出参数:ad转换值   
uint  read2543(uchar port)   
{   
    
uint ad=0, i;
    
if(TCL2543_EOC == 0return 0;    // 转换没有结束或不允许转换
    TCL2543_CLK=0;   
    TCL2543_CS
=0;   
    port
<<=4;

    
for(i=0;i<12;i++)   
    
{   
        
if(TCL2543_DOUT)   ad |= 0x01;   
        
        
if(port&0x80)  TCL2543_ADIN = 1;
        
else    TCL2543_ADIN = 0;
        
        TCL2543_CLK
=1;   
        delay(
3);   
        TCL2543_CLK
=0;   
        delay(
3);   
        port
<<=1;   
        ad
<<=1;   
    }
   
    TCL2543_CS
=1;   
    ad
>>=1;   
    
return(ad);   
}
   

void  main( void )
{      
    
uint t;
    
float p;
    Init();
        
    
while(1)
    
{
        delay_ms(
250);
        t 
= read2543(2);// 得到转换结果
        
        p 
= (float)t; 
        p 
= p/4096.0;
        p 
= 5000.0*p;   // 转换为毫伏数值,参考电压为5000mV

        printf(
"%d,", t);
        t 
= (uint)p;
        printf(
"%d ", t);        
    }
  
}


//  10ms定时
interrupt [TIM0_OVF]  void  Timer0( void
{
    TCNT0 
= 148;
    
if(++ct == 15)  // 150ms
    {
        ct 
= 0;
        _LED 
= ~_LED;
    }

}

 

你可能感兴趣的:(AVR单片机)