#include<avr/io.h> 
#include<avr/interrupt.h> 
#include <util/delay.h>       //GCC中的延时函数头文件 
#define uchar unsigned char 
unsigned char js,temp; 
unsigned int ad1,ad2,ad3,ad[3],value; 
unsigned char  table[]={0x3F,0x6,0x5B,0x4F,0x66,0x6D,0x7D,0x7,0x7F,0x6F,}; 
void ad_init(void); 
void init(void); 
void Delayus(unsigned int lus); 
void Delayms(unsigned int lms); 
void display(uchar temp); 
int main(void) 
{ 
        init(); 
        ad_init(); 
        while(1) 
        { 
                ; 
        } 
        return 0; 
} 
void init(void) 
{ 
        DDRA=0XFC; 
        PORTA=0XFF; 
        DDRB=0XFF; 
        PORTB=0X0; 
        DDRD=0XFF; 
        DDRC=0XFF; 
        PORTD=0XFF; 
        PORTC=0XFF; 
} 
void Delayus(unsigned int lus) 
{ 
        while(lus--) 
        { 
                _delay_loop_2(2);      //_delay_loop_2(1)是延时4个时钟周期,参数为2则延时8 
                                      //个时钟周期,本实验用8M晶体,则8个时钟周期为8/8=1us 
    } 
} 
void Delayms(unsigned int lms) 
{ 
        while(lms--) 
        { 
                Delayus(1000);        //延时1ms 
    } 
} 
void display(uchar temp) 
{ 
        uchar shi,ge; 
        shi=temp/10; 
        ge=temp%10; 
        PORTD=0XFd; 
        PORTC=table[shi]; 
        //PORTB=0xfc; 
        Delayms(1); 
        PORTD=0xFe; 
        PORTC=table[ge]; 
        //PORTB=0XFC; 
        Delayms(1); 
} 
void ad_init(void) 
{ 
 
        ADCSRA=0X0;//关闭adc转换; 
        cli();//清楚全局中断 
        ADMUX|=(1<<REFS0)|(1<<REFS1)|(1<<ADLAR);//内部基准电压,模拟通道1 
        //ADMUX|=(0<<REFS0)|(0<<REFS1)|(1<<ADLAR)|(1<<MUX0);//内部基准电压,模拟通道1 
        //ADMUX|=(1<<REFS0)|(1<<REFS1)|(1<<ADLAR);//内部基准电压,模拟通道1 
        ACSR|=(1<<ACD);//关闭模拟比较通道; 
        ADCSRA|=(1<<ADEN)|(1<<ADPS2)|(1<<ADPS1);//使能ad转换,设置分频系数为64分频 
        sei();//打开全局中断 
        ADCSRA|=(1<<ADSC)|(1<<ADIE);//启动adc转换,并且转换结束之后进入中断 
        /* 
                此时进入的ad转换为第一通道为ad0, 
        */ 
         
} 
ISR(ADC_vect) 
{ 
        //PORTB=0X08; 
        //value=ADCL; 
        //value=(unsigned long)ADCH<<8;//获得转换后的数值 
        value=(int)((long)(ADCH) * 5010/1024); 
        ad[js]=value; 
        js++; 
        if(js==3)//存放在数组之中 
        { 
          js=0; 
          //PORTB=0X08; 
          ad1=ad[0]; 
          ad2=ad[1]; 
          ad3=ad[2]; 
        } 
        display(ad1); 
        Delayms(1); 
        //display(ad2); 
        //Delayms(10); 
         
        switch(js)//通道的转换 
        { 
                case 0: 
                       ADCSRA|=(1<<ADEN)|(1<<ADPS2)|(1<<ADPS1)|(0<<ADIE)|(0<<ADSC);//关中断跟adc的转换 
                           ADMUX|=(1<<REFS0)|(1<<REFS1);//选择ad转换的通道0 
                           ADCSRA|=(1<<ADEN)|(1<<ADPS2)|(1<<ADPS1)|(1<<ADIE)|(0<<ADSC);//开中断 
 
                           break; 
                case 1: 
                       ADCSRA|=(1<<ADEN)|(1<<ADPS2)|(1<<ADPS1)|(0<<ADIE)|(0<<ADSC); 
                           ADMUX|=(1<<REFS0)|(1<<REFS1)|(1<<MUX0); 
                           ADCSRA|=(1<<ADEN)|(1<<ADPS2)|(1<<ADPS1)|(1<<ADIE)|(0<<ADSC); 
                           break; 
 
      /* case 2: 
                       ADCSRA|=(1<<ADEN)|(1<<ADPS2)|(1<<ADPS1)|(0<<ADIE)|(0<<ADSC); 
                           ADMUX|=(1<<REFS0)|(1<<REFS1)|(1<<MUX1)|(0<<MUX0); 
                           ADCSRA|=(1<<ADEN)|(1<<ADPS2)|(1<<ADPS1)|(1<<ADIE)|(0<<ADSC); 
                          // PORTB=0X02; 
                           break;*/ 
 
        } 
 
         ADCSRA|=(1<<ADEN)|(1<<ADPS2)|(1<<ADPS1)|(1<<ADIE)|(1<<ADSC);//启动adc转换          
         
} 
采集到得数据一直都是通道二的数据,通道一一直采集不到,不知道为什么, 
 
        display(ad1); 
        Delayms(1); 
为通道一得数据, 
 
//display(ad2); 
        //Delayms(10);为通道二的数据 |   
     
  
 |