📄 adc.lis
字号:
.module ADC.C
.area text(rom, con, rel)
0000 .dbfile D:\学习\AVRpro\Mega16程序\TestLCD\ADC.C
0000 .dbfunc e MCUMode _MCUMode fV
0000 ; iMode -> R16
.even
0000 _MCUMode::
0000 .dbline -1
0000 .dbline 22
0000 ; //*********************************************
0000 ; //ADC转换
0000 ; //MCU:AVR_MEGA16L ,晶振频率:8.0 MHz
0000 ; //ADC通道:ADC3,PA3,采用软件方式
0000 ; //制作人:平顶山工学院计算机系,郭猛
0000 ; //**********************************************
0000 ;
0000 ; #include "iom16v.h"
0000 ; #include "macros.h"
0000 ; #include "LCDFun.h"
0000 ; #include "VS1011B.h"
0000 ; #include "mmc.h"
0000 ;
0000 ; #define Vref 330 //参考电压为3.3V
0000 ; #define VolMax 651 //电池电量满,4.2V/2=2.1,对应ADC结果为0x3ff*(2.1/3.3)=651
0000 ; #define VolMin 520 //电池电量空,3.3V/2=1.65V,对应ADC结果为0x3ff*(1.65/3.3)=512
0000 ; #define ADC_MUX 0x03 //ADC通道(注意将下面的ADC_MUX改为3)
0000 ;
0000 ; extern void DisplayLong(unsigned long ll,unsigned char line);
0000 ;
0000 ; void MCUMode(uchar iMode) //设置CPU的休眠模式
0000 ; {
0000 .dbline 24
0000 ; //关闭看门狗:
0000 ; WDTCR=BIT(WDTOE)|BIT(WDE);
0000 88E1 ldi R24,24
0002 81BD out 0x21,R24
0004 .dbline 25
0004 ; WDTCR=0;
0004 2224 clr R2
0006 21BC out 0x21,R2
0008 .dbline 26
0008 ; if (iMode<=6)
0008 86E0 ldi R24,6
000A 8017 cp R24,R16
000C 48F0 brlo L2
000E X0:
000E .dbline 27
000E ; {
000E .dbline 29
000E ; //设置CPU的休眠模式
000E ; MCUCR|=(iMode&0x70);
000E 802F mov R24,R16
0010 8077 andi R24,112
0012 25B6 in R2,0x35
0014 282A or R2,R24
0016 25BE out 0x35,R2
0018 .dbline 31
0018 ; //CPU的休眠
0018 ; MCUCR|=BIT(SE);
0018 85B7 in R24,0x35
001A 8064 ori R24,64
001C 85BF out 0x35,R24
001E .dbline 32
001E ; asm("sleep");
001E 8895 sleep
0020 .dbline 33
0020 ; ;;
0020 .dbline 33
0020 .dbline 34
0020 ; }
0020 L2:
0020 .dbline -2
0020 L1:
0020 .dbline 0 ; func end
0020 0895 ret
0022 .dbsym r iMode 16 c
0022 .dbend
0022 .dbfunc e ADC_Init _ADC_Init fV
.even
0022 _ADC_Init::
0022 .dbline -1
0022 .dbline 39
0022 ; }
0022 ;
0022 ; //ADC初始化函数
0022 ; void ADC_Init(void)
0022 ; {
0022 .dbline 40
0022 ; DDRA&=~BIT(3); //端口A设置为高阻态
0022 D398 cbi 0x1a,3
0024 .dbline 41
0024 ; PORTA&=~BIT(3);
0024 DB98 cbi 0x1b,3
0026 .dbline 43
0026 ;
0026 ; ADCSRA=0x00;
0026 2224 clr R2
0028 26B8 out 0x6,R2
002A .dbline 44
002A ; ADMUX=BIT(REFS0)|(3&0x0f); //选择内部AVcc为基准,ADC数据左对齐
002A 83E4 ldi R24,67
002C 87B9 out 0x7,R24
002E .dbline 45
002E ; ACSR=BIT(ACD); //关闭模拟比较器
002E 80E8 ldi R24,128
0030 88B9 out 0x8,R24
0032 .dbline 46
0032 ; ADCSRA=BIT(ADEN)|BIT(ADPS2)|BIT(ADPS1); //CLK64分频,不产生ADC中断
0032 86E8 ldi R24,134
0034 86B9 out 0x6,R24
0036 .dbline -2
0036 L4:
0036 .dbline 0 ; func end
0036 0895 ret
0038 .dbend
0038 .dbfunc e ADC_Convert _ADC_Convert fc
0038 ; i -> <dead>
0038 ; rslt -> R20
0038 ; adc_reslt -> R22,R23
.even
0038 _ADC_Convert::
0038 0E940000 xcall push_xgsetF000
003C .dbline -1
003C .dbline 51
003C ; }
003C ;
003C ; //ADC转换处理函数:
003C ; unsigned char ADC_Convert(void)
003C ; {
003C .dbline 52
003C ; unsigned int adc_reslt=0; //AD转换结果
003C 6627 clr R22
003E 7727 clr R23
0040 .dbline 54
0040 ; unsigned char rslt,i;
0040 ; ADCSRA|=BIT(ADSC); //启动AD转换
0040 369A sbi 0x6,6
0042 L6:
0042 .dbline 55
0042 ; while(!(ADCSRA & BIT(ADIF))) ; //等待AD转换完毕
0042 L7:
0042 .dbline 55
0042 349B sbis 0x6,4
0044 FECF rjmp L6
0046 X1:
0046 .dbline 56
0046 ; adc_reslt=ADC&0x03FF; //保存ADC结果
0046 64B1 in R22,0x4
0048 75B1 in R23,0x5
004A 7370 andi R23,3
004C .dbline 61
004C ; //测试使用,显示adc_reslt:
004C ; //DisplayLong(adc_reslt,5);
004C ; //Delay(500);
004C ; //对ADC结果进行处理
004C ; if (adc_reslt<=VolMin) //电量为空/不足
004C 88E0 ldi R24,520
004E 92E0 ldi R25,2
0050 8617 cp R24,R22
0052 9707 cpc R25,R23
0054 10F0 brlo L9
0056 X2:
0056 .dbline 62
0056 ; rslt=0;
0056 4427 clr R20
0058 12C0 xjmp L10
005A L9:
005A .dbline 63
005A ; else if (adc_reslt>=VolMax) //电量为满
005A 6B38 cpi R22,139
005C E2E0 ldi R30,2
005E 7E07 cpc R23,R30
0060 10F0 brlo L11
0062 X3:
0062 .dbline 64
0062 ; rslt=14;
0062 4EE0 ldi R20,14
0064 0CC0 xjmp L12
0066 L11:
0066 .dbline 66
0066 ; else //[其它介于0~13的情况]
0066 ; rslt=(((adc_reslt-VolMin)*14)/(VolMax-VolMin));
0066 9B01 movw R18,R22
0068 2850 subi R18,8
006A 3240 sbci R19,2
006C 0EE0 ldi R16,14
006E 10E0 ldi R17,0
0070 0E940000 xcall empy16s
0074 23E8 ldi R18,131
0076 30E0 ldi R19,0
0078 0E940000 xcall div16u
007C 402F mov R20,R16
007E L12:
007E L10:
007E .dbline 67
007E ; ADCSRA|=BIT(ADIF); //ADIF位写入1,清零
007E 349A sbi 0x6,4
0080 .dbline 68
0080 ; ADCSRA&=~BIT(ADEN); //禁止ADC
0080 3798 cbi 0x6,7
0082 .dbline 69
0082 ; return rslt;
0082 042F mov R16,R20
0084 .dbline -2
0084 L5:
0084 .dbline 0 ; func end
0084 0C940000 xjmp pop_xgsetF000
0088 .dbsym l i 1 c
0088 .dbsym r rslt 20 c
0088 .dbsym r adc_reslt 22 i
0088 .dbend
0088 ; }
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -