各位大俠們,我想用ATmega128的內(nèi)部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; }
/* *函數(shù)功能:ADC模塊的初始化程序 *輸入?yún)?shù):無 *輸出參數(shù):無 *返 回 值:無 */ void init_adc() { ADCSR=0X00; //設(shè)置ADC前,禁止ADC ADMUX=BIT(REFS1)|BIT(REFS0); //設(shè)置ADC內(nèi)置參考電壓為2.56V的片內(nèi)基準電源 ADMUX|=BIT(ADLAR); //ADC轉(zhuǎn)換結(jié)果左對齊,直接取ADCH的8位數(shù)據(jù) 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轉(zhuǎn)換 while (!(ADCSR&BIT(ADIF))); //等待轉(zhuǎn)換結(jié)束 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模擬運行了一下,發(fā)現(xiàn)就是死在了 while (!(ADCSR&BIT(ADIF))); 這邊,這說明AD一直都在轉(zhuǎn)換,就是沒轉(zhuǎn)換好!這是為什么呢?勞煩各位大俠留步幫小弟解決下!有勞了各位了……
[此貼子已經(jīng)被作者于2011-8-15 19:14:36編輯過]
|