📄 adc.s
字号:
.module ADC.C
.area text(rom, con, rel)
.dbfile D:\学习\AVRpro\Mega8程序\TestADC\ADC.C
.dbfunc e ADC_Init _ADC_Init fV
.even
_ADC_Init::
.dbline -1
.dbline 21
; //*********************************************
; //ADC转换
; //MCU:AVR_MEGA8L ,晶振频率:8.0 MHz
; //ADC通道:ADC3,PA3,采用软件方式
; //制作人:平顶山工学院计算机系,郭猛
; //**********************************************
;
; #include "iom8v.h"
; #include "macros.h"
; #include "LCDFun.h"
;
; #define Vref 5 //参考电压为3.3V
; #define VolMax 945 //电池电量满,4.15V-1.1V=3.05V,对应ADC结果为0x3ff*(3.05/3.3)=945
; #define VolMin 728 //电池电量空,3.45V-1.1V=2.35V,对应ADC结果为0x3ff*(2.35/3.3)=728
; #define ADC_MUX 0x03 //ADC_PC3通道
;
; unsigned char Bak_DDRC,Bak_PORTC; //记录端口C的原先状态
;
; //ADC初始化函数
; void ADC_Init(void)
; {
.dbline 22
; Bak_DDRC=DDRC;
in R2,0x14
sts _Bak_DDRC,R2
.dbline 23
; Bak_PORTC=PORTC; //保存原来的端口A状态
in R2,0x15
sts _Bak_PORTC,R2
.dbline 24
; DDRC&=~BIT(3); //端口C设置为高阻态
cbi 0x14,3
.dbline 25
; PORTC&=~BIT(3);
cbi 0x15,3
.dbline 28
; //DDRC=0;PORTC=0;
;
; ADCSRA=0x00;
clr R2
out 0x6,R2
.dbline 29
; ADMUX=BIT(REFS0)|(3&0x0f); //选择外部ARef为基准,ADC数据左对齐
ldi R24,67
out 0x7,R24
.dbline 30
; ACSR=BIT(ACD); //关闭模拟比较器
ldi R24,128
out 0x8,R24
.dbline 31
; ADCSRA=BIT(ADEN)|BIT(ADPS2)|BIT(ADPS1); //CLK64分频,不产生ADC中断
ldi R24,134
out 0x6,R24
.dbline -2
L1:
.dbline 0 ; func end
ret
.dbend
.dbfunc e ADC_Convert _ADC_Convert fc
; i -> <dead>
; rslt -> R10
; adc_reslt -> R20,R21
.even
_ADC_Convert::
rcall push_xgset300C
sbiw R28,2
.dbline -1
.dbline 36
; }
;
; //ADC转换处理函数:
; unsigned char ADC_Convert(void)
; {
.dbline 37
; unsigned int adc_reslt=0; //AD转换结果
clr R20
clr R21
.dbline 39
; unsigned char rslt,i;
; ADCSRA|=BIT(ADSC); //启动AD转换
sbi 0x6,6
L3:
.dbline 40
; while(!(ADCSRA & BIT(ADIF))) ; //等待AD转换完毕
L4:
.dbline 40
sbis 0x6,4
rjmp L3
X0:
.dbline 41
; adc_reslt=ADC&0x03FF; //保存ADC结果
in R20,0x4
in R21,0x5
andi R21,3
.dbline 43
; //测试使用,显示adc_reslt:
; DisplayNumChar(3,3,adc_reslt);
std y+1,R21
std y+0,R20
ldi R18,3
ldi R16,3
rcall _DisplayNumChar
.dbline 44
; Delay(500);
ldi R16,500
ldi R17,1
rcall _Delay
.dbline 47
;
; //ADMUX=ADC_MUX; //选择外部ARef为基准
; ADCSRA|=BIT(ADIF); //ADIF位写入1,清零
sbi 0x6,4
.dbline 48
; ADCSRA&=~BIT(ADEN); //禁止ADC
cbi 0x6,7
.dbline 53
; //恢复原来的端口C状态:
; //DDRC=Bak_DDRC;
; //PORTC=Bak_PORTC;
;
; return rslt;
mov R16,R10
.dbline -2
L2:
.dbline 0 ; func end
adiw R28,2
rjmp pop_xgset300C
.dbsym l i 3 c
.dbsym r rslt 10 c
.dbsym r adc_reslt 20 i
.dbend
.area bss(ram, con, rel)
.dbfile D:\学习\AVRpro\Mega8程序\TestADC\ADC.C
_Bak_PORTC::
.blkb 1
.dbsym e Bak_PORTC _Bak_PORTC c
_Bak_DDRC::
.blkb 1
.dbsym e Bak_DDRC _Bak_DDRC c
; }
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -