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