关于采集IO口电压
下面是我以前用过的一个程序,不过是MEGA32的,我没用过mega16,楼主只要将以下用到的控制寄存器修改成mega16的即可:
基本思想是初始化程序中设定好自动连续转换,再在中断服务程序中读取结果(每中断一次获得一个通道的转换结果值)。
void adc_init(void)
{
ADCSR = 0x00; // disable adc
ADMUX = 0xC0; // 参考电压选择片内基准电压 2.56V,从PA0号通道开始
ACSR = 0x80; // 不用模拟比较器
ADCSR = 0x89; // 启动ADC,转换结果右对齐,分频因子 2
ADC_chn = 0x00; // 选择第一个通道(PA0)
}
void adc_isr(void)
{
UINT ADC_value;
ADCSR |= 0x10; // 清 AD 完成标志
ADC_value = ADCL; // 先读低八位数据
ADC_value |= (int)ADCH << 8;// 再读高二位数据并移至高字节
if ( ADC_chn == 0x00 )
{ input[0] = ADC_value;// 保存PA0的值
}
else if ( ADC_chn == 0x01 )
{ input[1] = ADC_value;// 保存PA1的值
}
else if ( ADC_chn == 0x02 )
{ input[2] = ADC_value;// 保存PA2的值
}
。。。。。。。。
else if ( ADC_chn == 0x07 )
{ input[7] = ADC_value;// 保存PA7的值
}
ADC_chn ++; // 通道号加 1
if ( ADC_chn > 0x07 ) ADC_chn = 0x00;
ADMUX = 0xC0 + ADC_chn; // 切换通道
}