各位大侠们,我想用ATmega128的内部AD的,我选用的编译器是IAR AVR,程序如下:
#include <ioavr.h>
#include <intrinsics.h>
#define unchar unsigned char
#define unint unsigned int
unchar vol;
#define REFS1 7
#define REFS0 6
#define ADLAR 5
#define MUX4 4
#define MUX3 3
#define MUX2 2
#define MUX1 1
#define MUX0 0
#define ADEN 7
#define ADSC 6
#define ADFR 5
#define ADIF 4
#define ADIE 3
#define ADPS2 2
#define ADPS1 1
#define ADPS0 0
#define rs_L() (PORTD &= ~(1<<7))
#define rs_H() (PORTD |= (1<<7))
#define rw_L() (PORTD &= ~(1<<6))
#define rw_H() (PORTD |= (1<<6))
#define en_L() (PORTD &= ~(1<<5))
#define en_H() (PORTD |= (1<<5))
void delay_ms(unint x) //12M 1ms延时程序
{
unint y;
for(;x>0;x--)
for(y=0;y<120;y++);
}
void w_com(unchar com)
{
unint i;
PORTC=com;
rs_L();
rw_L();
en_L();
i=10;
while(i--);
en_H();
i=10;
while(i--);
}
void w_data(unchar dataa)
{
unint i;
PORTC=dataa;
rs_H();
rw_L();
en_L();
i=10;
while(i--);
en_H();
i=10;
while(i--);
}
void L1602_init()
{
w_com(0x01);
w_com(0x38);
w_com(0x0c);
w_com(0x06);
w_com(0xd0);
}
void L1602_char(unchar hang,unchar lie,char sign)
{
unchar a;
if(hang==1) a=0x80;
if(hang==2) a=0xc0;
a=a+lie-1;
w_com(a);
w_data(sign);
}
void L1602_string(unchar hang,unchar lie,unchar *p)
{
unchar a;
if(hang==1) a=0x80;
if(hang==2) a=0xc0;
a=a+lie-1;
w_com(a);
while(1)
{
if(*p=='\0') break;
w_data(*p);
p++;
}
}
unchar BIT(unchar x)
{
unchar temp;
temp = (0x01<<x);
return temp;
}
/*
*函数功能:ADC模块的初始化程序
*输入参数:无
*输出参数:无
*返 回 值:无
*/
void init_adc()
{
ADCSR=0X00; //设置ADC前,禁止ADC
ADMUX=BIT(REFS1)|BIT(REFS0); //设置ADC内置参考电压为2.56V的片内基准电源
ADMUX|=BIT(ADLAR); //ADC转换结果左对齐,直接取ADCH的8位数据
ADCSR=BIT(ADEN)|BIT(ADPS1)|BIT(ADPS0)|BIT(ADPS2); //ADC使能,128分频
}
unsigned char get_adcdata(void)
{
unsigned char volt;
// ADMUX=BIT(MUX0)|BIT(MUX1)|BIT(MUX2)|BIT(MUX3); //选择通道3,电池电压通道
ADMUX|=0;
ADCSR|=BIT(ADSC); //启动单次ADC转换
while (!(ADCSR&BIT(ADIF))); //等待转换结束
ADCSR&=~(BIT(ADIF)); //清楚ADIF位
volt=ADCH;
return volt;
}
void L1602_display1()
{
L1602_char(1,9,vol/100%10+48);
L1602_char(1,11,vol/10%10+48);
L1602_char(1,12,vol%10+48);
}
void main()
{
DDRC=0xff;
PORTC=0xff;
DDRD=0xff;
PORTD=0xff;
DDRF=0x00;
PORTF=0x00;
L1602_init();
L1602_string(1,1," IN0: 0.00V ");
L1602_string(2,1," IN1: 0.00V ");
init_adc();
while(1)
{
vol = get_adcdata();
vol=(vol/256)*500;
L1602_display1();
delay_ms(1000);
}
}
我用IAR模拟运行了一下,发现就是死在了 while (!(ADCSR&BIT(ADIF))); 这边,这说明AD一直都在转换,就是没转换好!这是为什么呢?劳烦各位大侠留步帮小弟解决下!有劳了各位了……
欢迎光临 (http://www.51hei.com/bbs/) | Powered by Discuz! X3.1 |