uint mega16_ad()
{
uint addata;
DDRA=0X00;
PORTA=0X00;
cli();
ADMUX = 0x00;
ADCSRA=0x87;
ADCSRA|=BIT(ADSC);
ACSR= 0x80;
SFIOR |= 0x00;
while(!(ADCSRA&(BIT(ADIF))));
addata=ADCL;
addata=addata+ADCH*256;
ADCSRA|=BIT(ADIF);
ADCSRA=0X00;
sei();
return addata;
}
void port_init(void)
{
PORTA = 0x00;
DDRA = 0x00;
}
void init_devices(void)
{
port_init();
MCUCR = 0x00;
MCUCSR = 0x80;//禁止JTAG
sei();//开全局中断
}'
int main(void)
{
uint i;
uchar ad0[4]={0,0,0,86,86};//初始值
init_devices();
LCD_init(); //LCD初始化
LCD_clear();//清屏
DDRD =0xff;
while(1)
{
int xx=mega16_ad();
itoa(xx,ad0,10);// int to uchar
for(i=0;i<=4;i++) //显示转换的数值
{
LCD_write_char(i,0,ad0[i]);
_delay_ms(10);
};
_delay_ms(10);
LCD_write_str(0,1,"yes?+2");//第二行显示
PORTD =0xcd;//点亮LED
}
刚接触单片机不久,看着手册设定的各个寄存器,现在AD转换的结果在400~500之间狂调,用的外部参考电压5V也不至于这样吧?!
还有一点不理解的,ADCH+ADCL,应该显示在0-255之间,怎么会一直显示400~500呢?硬件环境是在X宝买的M16最小系统,看原理图AVCC aref连在一起的。求朋友们指点一下,不妥这处勿喷。 |