{
sbi(ADCSRA, ADEN); // enable ADC (turn on ADC power)
cbi(ADCSRA, ADIF); // default to single sample convert mode
sbi(SFIOR,ADTS1),sbi(SFIOR,ADTS0);//定时器/ 计数器0 比较匹配
a2dSetPrescaler(ADC_PRESCALE); // 设置分频
a2dSetReference(ADC_REFERENCE); // 设置参考电压
a2dSetChannel(ADC_CH_ADC0); //预先设置通道0
sbi(ADMUX, ADLAR); // set to left-adjusted result 左对齐,只要8位精度仅需读ADCH
sbi(ADCSRA, ADIE); // enable ADC interrupts
sbi(ADCSRA,ADATE); //自动触发使能
//a2dCompleteFlag = FALSE; // clear conversion complete flag
sei(); // turn on interrupts (if not already on)
}
// turn off a2d converter
void a2dOff(void)
{
cbi(ADCSRA, ADIE); // disable ADC interrupts
cbi(ADCSRA, ADEN); // disable ADC (turn off ADC power)
}
// configure A2D converter clock division (prescaling)
void a2dSetPrescaler(unsigned char prescale)
{
outb(ADCSRA, ((inb(ADCSRA) & ~ADC_PRESCALE_MASK) | prescale));
}
// configure A2D converter voltage reference
void a2dSetReference(unsigned char ref)
{
outb(ADMUX, ((inb(ADMUX) & ~ADC_REFERENCE_MASK) | (ref<<6)));
}
// sets the a2d input channel
void a2dSetChannel(unsigned char ch)
{
//关闭内部上拉电阻,设置端口为输入
cbi(PORTA,ch);
cbi(DDRA,ch);
outb(ADMUX, (inb(ADMUX) & ~ADC_MUX_MASK) | (ch & ADC_MUX_MASK)); // set channel
}
uint8_t a2dConvert8bit(void)
{
sbi(ADCSRA, ADIF); // clear hardware "conversion complete" flag
sbi(ADCSRA, ADSC); // start conversion
while(!(ADCSRA&(1<
return (i); // 因初始化时已设置结果左对齐,只读ADCH即可
}