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(); } }