FK1174 发表于 2013-6-11 22:53:51

为什么我写的ad转换在电压小于2.56v时精确......

为什么我写的ad转换在电压小于2.56v时精确但是大于2.56v时就显示不对了呢,貌似是实际值减去2.56v

代码:(cvavr)

#include <mega16.h>

#include <delay.h>

#define uchar unsigned char
#define uint unsigned int

uint adc_data;

void port_init()
{
PORTB=0x00;
DDRB=0xFF;
PORTC=0x00;
DDRC=0xFF;
}

void display(uint dat)
{
   uchar i=0;
   
   i=dat%10;
   PORTB=0x07;
   PORTC=i;
   
   delay_ms(1);
   
   i=(dat%100)/10;
   PORTB=0x0b;
   PORTC=i;
   delay_ms(1);   
         
   i=(dat%1000)/100;
   PORTB=0x1d;       //添加一位小数点在第二位
   PORTC=i;
   delay_ms(1);
         
   i=(dat/1000);
   PORTB=0x0e;
   PORTC=i;
   
   delay_ms(1);   
}

void adc_init()
{
    ADCSR=0x00;
    ADMUX=0x40;
    ACSR=0x80;
    ADCSRA=0xEB;
}
interrupt void adc_isr(void)
{
adc_data=ADCL;                           //先把低八位放入adc_data的低八位
// Read the 8 most significant bits
// of the AD conversion result
adc_data|=(int)ADCH<<8;               //再把高两位移入adc_data的9,10位 ,因为ADCH为8位,所以若不强制转换为16位则ADCH<<8的值为0;
// Place your code here

}
void main()
{   
    uint dat=0;
    SREG^=0x80;
    port_init();
    adc_init();
    SREG|=0x80;
    while(1)
    {   
      dat=(adc_data*125)>>8;      
      display(dat);
    }
   
}

cshm0101 发表于 2013-6-11 23:13:45

ADC 你是用了片内的基准,最高是2.56V

FK1174 发表于 2013-6-12 11:21:08

cshm0101 发表于 2013-6-11 23:13 static/image/common/back.gif
ADC 你是用了片内的基准,最高是2.56V

但是我的ADMUX=0x40,选择的是AREF啊

lcw_swust 发表于 2013-6-14 13:55:38

adc_data*125可能会溢出,建议将adc_data定义成ulong
页: [1]
查看完整版本: 为什么我写的ad转换在电压小于2.56v时精确......