各位大侠们,我想用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一直都在转换,就是没转换好!这是为什么呢?劳烦各位大侠留步帮小弟解决下!有劳了各位了……
[此贴子已经被作者于2011-8-15 19:14:36编辑过]
|