www.pudn.com > adc-disp.rar > adc-disp.c


/* 
	主程序  
	adc-disp.c 
	硬件:avr-51 
	时钟:内部4MHz 
	ATmega16 
	苏丹 2008-05-16 
	studio4.13+winavr071221 
*/ 
 
 
#include  
#include  
 
#define uchar unsigned char 
#define uint  unsigned int 
 
static uint g_aAdValue[8];	//A/D转换缓冲区 
 
void IoInit(void) 
{ 
   PORTA&=~_BV(PA0);        //初始化pa0 
   DDRC=0xff; 
   PORTC=0X00; 
   DDRA=0xf0; 
   PORTA=0xf0; 
} 
 
uint AdcConvert(void) 
{ 
	uchar i; 
	uint ret; 
	uchar max_id,min_id,max_value,min_value; 
	 
	ADMUX=0xc0;//内部2.56V参考电压,0通道 
	ADCSRA=_BV(ADEN);//使能ADC,单次转换模式 
	 
	//连续转换8次 
	for(i=0;i<8;i++) 
	{ 
		ADCSRA|=_BV(ADSC); 
		_delay_us(60); 
		while(ADCSRA&_BV(ADSC)) 
			_delay_us(60); 
		ret=ADCL; 
		ret|=(uint)(ADCH<<8); 
		g_aAdValue[i]=ret; 
	} 
	ret=0; 
	for(i=1;i<8;i++) 
		ret+=g_aAdValue[i]; 
	 
	//找到最大和最小值索引	 
	ret/=7; 
	max_id=min_id=1; 
	max_value=min_value=0; 
	for(i=1;i<8;i++) 
	{ 
		if(g_aAdValue[i]>ret) 
		{ 
			if(g_aAdValue[i]-ret>max_value) 
			{ 
				max_value=g_aAdValue[i]-ret; 
				max_id=i; 
			} 
		} 
		else 
		{ 
			if(ret-g_aAdValue[i]>min_value) 
			{ 
				min_value=ret-g_aAdValue[i]; 
				min_id=i; 
			} 
		} 
	} 
	 
	//去掉第一个和最大最小值后的平均值 
	ret=0; 
	for(i=1;i<8;i++) 
	{ 
		if((i!=min_id)&&(i!=max_id)) 
			ret+=g_aAdValue[i];      
	} 
	if(min_id!=max_id) 
		ret/=5; 
	else   
		ret/=6; 
 
	ADCSRA=0;//关闭ADC 
	 
	return ret; 
} 
 
int Led_disp(void) 
{ 
    uchar g_aDisplayBuf[16]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71}; 
    uint num,temp,a,b,c,d; 
	num=AdcConvert(); 
	a=num/1000; 
	a=g_aDisplayBuf[a]; 
	PORTC=a; 
	PORTA=~_BV(PA4)&0xf0; 
    _delay_us(1000); 
	PORTA=0xf0; 
    temp=num%1000; 
	b=temp/100; 
    b=g_aDisplayBuf[b]; 
    PORTC=b; 
    PORTA=~_BV(PA5)&0xf0; 
    _delay_us(1000); 
    PORTA=0xf0; 
	temp=temp%100; 
	c=temp/10; 
    c=g_aDisplayBuf[c]; 
    PORTC=c; 
    PORTA=~_BV(PA6)&0xf0; 
    _delay_us(1000); 
    PORTA=0xf0; 
	temp=temp%10; 
	d=temp; 
    d=g_aDisplayBuf[d]; 
    PORTC=d; 
	PORTA=~_BV(PA7)&0xf0; 
    _delay_us(1000); 
    PORTA=0xf0; 
return 0; 
} 
 
int main(void) 
{ 
    IoInit(); 
    while(1) 
	{	  
	   Led_disp(); 
    } 
}