#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);为通道二的数据 |