?? adc.s
字號(hào):
.module ADC.C
.area text(rom, con, rel)
.dbfile D:\學(xué)習(xí)\AVRpro\Mega16程序\TestLCD\ADC.C
.dbfunc e MCUMode _MCUMode fV
; iMode -> R16
.even
_MCUMode::
.dbline -1
.dbline 22
; //*********************************************
; //ADC轉(zhuǎn)換
; //MCU:AVR_MEGA16L ,晶振頻率:8.0 MHz
; //ADC通道:ADC3,PA3,采用軟件方式
; //制作人:平頂山工學(xué)院計(jì)算機(jī)系,郭猛
; //**********************************************
;
; #include "iom16v.h"
; #include "macros.h"
; #include "LCDFun.h"
; #include "VS1011B.h"
; #include "mmc.h"
;
; #define Vref 330 //參考電壓為3.3V
; #define VolMax 651 //電池電量滿,4.2V/2=2.1,對(duì)應(yīng)ADC結(jié)果為0x3ff*(2.1/3.3)=651
; #define VolMin 520 //電池電量空,3.3V/2=1.65V,對(duì)應(yīng)ADC結(jié)果為0x3ff*(1.65/3.3)=512
; #define ADC_MUX 0x03 //ADC通道(注意將下面的ADC_MUX改為3)
;
; extern void DisplayLong(unsigned long ll,unsigned char line);
;
; void MCUMode(uchar iMode) //設(shè)置CPU的休眠模式
; {
.dbline 24
; //關(guān)閉看門狗:
; WDTCR=BIT(WDTOE)|BIT(WDE);
ldi R24,24
out 0x21,R24
.dbline 25
; WDTCR=0;
clr R2
out 0x21,R2
.dbline 26
; if (iMode<=6)
ldi R24,6
cp R24,R16
brlo L2
X0:
.dbline 27
; {
.dbline 29
; //設(shè)置CPU的休眠模式
; MCUCR|=(iMode&0x70);
mov R24,R16
andi R24,112
in R2,0x35
or R2,R24
out 0x35,R2
.dbline 31
; //CPU的休眠
; MCUCR|=BIT(SE);
in R24,0x35
ori R24,64
out 0x35,R24
.dbline 32
; asm("sleep");
sleep
.dbline 33
; ;;
.dbline 33
.dbline 34
; }
L2:
.dbline -2
L1:
.dbline 0 ; func end
ret
.dbsym r iMode 16 c
.dbend
.dbfunc e ADC_Init _ADC_Init fV
.even
_ADC_Init::
.dbline -1
.dbline 39
; }
;
; //ADC初始化函數(shù)
; void ADC_Init(void)
; {
.dbline 40
; DDRA&=~BIT(3); //端口A設(shè)置為高阻態(tài)
cbi 0x1a,3
.dbline 41
; PORTA&=~BIT(3);
cbi 0x1b,3
.dbline 43
;
; ADCSRA=0x00;
clr R2
out 0x6,R2
.dbline 44
; ADMUX=BIT(REFS0)|(3&0x0f); //選擇內(nèi)部AVcc為基準(zhǔn),ADC數(shù)據(jù)左對(duì)齊
ldi R24,67
out 0x7,R24
.dbline 45
; ACSR=BIT(ACD); //關(guān)閉模擬比較器
ldi R24,128
out 0x8,R24
.dbline 46
; ADCSRA=BIT(ADEN)|BIT(ADPS2)|BIT(ADPS1); //CLK64分頻,不產(chǎn)生ADC中斷
ldi R24,134
out 0x6,R24
.dbline -2
L4:
.dbline 0 ; func end
ret
.dbend
.dbfunc e ADC_Convert _ADC_Convert fc
; i -> <dead>
; rslt -> R20
; adc_reslt -> R22,R23
.even
_ADC_Convert::
xcall push_xgsetF000
.dbline -1
.dbline 51
; }
;
; //ADC轉(zhuǎn)換處理函數(shù):
; unsigned char ADC_Convert(void)
; {
.dbline 52
; unsigned int adc_reslt=0; //AD轉(zhuǎn)換結(jié)果
clr R22
clr R23
.dbline 54
; unsigned char rslt,i;
; ADCSRA|=BIT(ADSC); //啟動(dòng)AD轉(zhuǎn)換
sbi 0x6,6
L6:
.dbline 55
; while(!(ADCSRA & BIT(ADIF))) ; //等待AD轉(zhuǎn)換完畢
L7:
.dbline 55
sbis 0x6,4
rjmp L6
X1:
.dbline 56
; adc_reslt=ADC&0x03FF; //保存ADC結(jié)果
in R22,0x4
in R23,0x5
andi R23,3
.dbline 61
; //測試使用,顯示adc_reslt:
; //DisplayLong(adc_reslt,5);
; //Delay(500);
; //對(duì)ADC結(jié)果進(jìn)行處理
; if (adc_reslt<=VolMin) //電量為空/不足
ldi R24,520
ldi R25,2
cp R24,R22
cpc R25,R23
brlo L9
X2:
.dbline 62
; rslt=0;
clr R20
xjmp L10
L9:
.dbline 63
; else if (adc_reslt>=VolMax) //電量為滿
cpi R22,139
ldi R30,2
cpc R23,R30
brlo L11
X3:
.dbline 64
; rslt=14;
ldi R20,14
xjmp L12
L11:
.dbline 66
; else //[其它介于0~13的情況]
; rslt=(((adc_reslt-VolMin)*14)/(VolMax-VolMin));
movw R18,R22
subi R18,8
sbci R19,2
ldi R16,14
ldi R17,0
xcall empy16s
ldi R18,131
ldi R19,0
xcall div16u
mov R20,R16
L12:
L10:
.dbline 67
; ADCSRA|=BIT(ADIF); //ADIF位寫入1,清零
sbi 0x6,4
.dbline 68
; ADCSRA&=~BIT(ADEN); //禁止ADC
cbi 0x6,7
.dbline 69
; return rslt;
mov R16,R20
.dbline -2
L5:
.dbline 0 ; func end
xjmp pop_xgsetF000
.dbsym l i 1 c
.dbsym r rslt 20 c
.dbsym r adc_reslt 22 i
.dbend
; }
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -