马老师,请教一个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();
}
}
参考我讲义的第10章
页:
[1]