wuxinyangwei 发表于 2007-7-21 09:16:21

马老师,请教一个AD转换与显示的问题

马老师,我的这个程序,烧进去之后就显示6个0,没有变化。本意就是从AD0转换来的8位数据显示出来,从PC1,2,3输出经74LS138译码输出片选信号LED,经PD3,4,6,7输出BCD码经74LS47 译码输出数据到LED。显示部分应该没问题了,我在LED[]里面初始化什么就显示什么。我怀疑是AD转换的问题,可能ADCH里面根本没有数据,不然不会全显示0的。请问我改怎么改呢?谢谢



//ICC-AVR application builder : 2007-7-17 16:07:21

// Target : M8

// Crystal: 8.0000Mhz

#include <iom8v.h>

#include <macros.h>



unsigned char i;

unsigned char led={0,0,0,0,0,0};

unsigned intn;

void xs_zh(unsigned char b)

{

PORTD = (PIND & 0x27) | (0xc0 & led<<4) | (0x18 & led<<3);

}

   

void port_init(void)

{

PORTB = 0x00;

DDRB= 0x00;

PORTC = 0x00; //m103 output only

DDRC= 0x0E;

PORTD = 0x00;

DDRD= 0xD8;

}





//TIMER0 initialize - prescale:64

// desired value: 2mSec

// actual value: 2.000mSec (0.0%)

void timer0_init(void)

{

TCCR0 = 0x00; //stop

TCNT0 = 0x06; //set count

TCCR0 = 0x01; //start timer

}





#pragma interrupt_handler timer0_ovf_isr:10

void timer0_ovf_isr(void)

{

TCNT0 = 0x06; //reload counter value

PORTC |= 0x0E;//先关闭显示

xs_zh(i);             //送显示数据

PORTC = (PINC & 0xf1) | (0x0e &i<<1);   //开显示

i++;               //准备显示下一位

if(i>=6)i=0;

}



//ADC initialize

// Conversion time: 13uS

void adc_init(void)

{

ADCSR = 0x00; //disable adc

ADMUX = 0x60; //select adc input 0

ACSR = 0x80;

ADCSR = 0xE3;

}



//call this routine to initialize all peripherals

void init_devices(void)

{

//stop errant interrupts until set up

CLI(); //disable all interrupts

port_init();

timer0_init();

adc_init();



MCUCR = 0x00;

GICR= 0x00;

TIMSK = 0x01; //timer interrupt sources

SEI(); //re-enable interrupts

//all peripherals are now initialized

}

/*——————————————————————————————————————————————*/

unsigned int read_adc(unsigned char adc_input)//查询方式读取ADC单端通道

   {

      ADMUX=(0x60|adc_input); //adc_input:单端通道 0x00~0x07,0x1E,0x1F

      //0xc0:选择内部5V参考电压,左对齐

      ADCSRA|=(1<<ADSC); //启动AD转换

   

   while ((ADCSRA&(1<<ADIF))==0); //写法2 这种写法优化不好

   

      ADCSRA|=(1<<ADIF); //写1清除标志位

      return ADCH; //ADC=ADCH:ADCL

   }



void pocess(void)

{

n=n/256*5;

led=n/100;

n%=100;

led=n/10;

n%=10;

led=n;

led=0;

led=0;

led=0;

}



void main(void)

{

init_devices();

while(1)

{

n=read_adc(0);

pocess();

}

}

 

machao 发表于 2007-8-10 16:42:24

参考我讲义的第10章
页: [1]
查看完整版本: 马老师,请教一个AD转换与显示的问题