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

📄 adc.lis

📁 AVR-MEGA8单片机中使用AD转换的一个例子
💻 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 + -