⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 adc.lis

📁 采用Mega16+VS1011B+SD卡制作的Mp3
💻 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 + -