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

📄 adc.lis

📁 单片机中的ADC模块
💻 LIS
字号:
                        .module adc.c
                        .area text(rom, con, rel)
 0000                   .dbfile F:\芯生光盘资料\范例代码\ADC\adc\adc.c
 0000                   .dbfunc e adc_init _adc_init fV
                        .even
 0000           _adc_init::
 0000                   .dbline -1
 0000                   .dbline 19
 0000           ; 
 0000           ; #include <iom128v.h>
 0000           ; #include <macros.h>
 0000           ; #include "stdtypes.h"
 0000           ; #include "adc.h"
 0000           ; 
 0000           ; 
 0000           ; #define ADC_END    ADCSRA&0x10
 0000           ; 
 0000           ; int adc0_value;
 0000           ; int adc1_value;
 0000           ; UNS8 channel;
 0000           ; UNS8 adc_couter;
 0000           ; UNS8 adc_flag;
 0000           ; 
 0000           ; //ADC initialize
 0000           ; // Conversion time: 416uS
 0000           ; void adc_init(void)
 0000           ; {
 0000                   .dbline 21
 0000           ; 
 0000           ;  ADCSRA = 0x00; //disable adc
 0000 2224              clr R2
 0002 26B8              out 0x6,R2
 0004                   .dbline 22
 0004           ;  ADMUX = 0x40; //select adc input 0
 0004 80E4              ldi R24,64
 0006 87B9              out 0x7,R24
 0008                   .dbline 23
 0008           ;  ACSR  = 0x80;
 0008 80E8              ldi R24,128
 000A 88B9              out 0x8,R24
 000C                   .dbline 24
 000C           ;  ADCSRA = 0x07;//00101111 分频128 不是连续转换 中断使能
 000C 87E0              ldi R24,7
 000E 86B9              out 0x6,R24
 0010                   .dbline 25
 0010           ;  adc0_value=0;
 0010 3324              clr R3
 0012 30920600          sts _adc0_value+1,R3
 0016 20920500          sts _adc0_value,R2
 001A                   .dbline 26
 001A           ;  adc1_value=0;
 001A 30920400          sts _adc1_value+1,R3
 001E 20920300          sts _adc1_value,R2
 0022                   .dbline 27
 0022           ;  channel=0;
 0022 20920200          sts _channel,R2
 0026                   .dbline 28
 0026           ;  adc_couter=0;
 0026 20920100          sts _adc_couter,R2
 002A                   .dbline 29
 002A           ;  adc_flag=0;
 002A 20920000          sts _adc_flag,R2
 002E                   .dbline -2
 002E           L1:
 002E                   .dbline 0 ; func end
 002E 0895              ret
 0030                   .dbend
 0030                   .dbfunc e read_adc_value _read_adc_value fI
 0030           ;          value -> R16,R17
                        .even
 0030           _read_adc_value::
 0030                   .dbline -1
 0030                   .dbline 34
 0030           ; }
 0030           ; 
 0030           ; 
 0030           ; int read_adc_value(void)
 0030           ; {  
 0030                   .dbline 37
 0030           ;    int value;
 0030           ;    //CLI();
 0030           ;    if(ADC_END)
 0030 349B              sbis 0x6,4
 0032 0BC0              rjmp L3
 0034                   .dbline 38
 0034           ;    {
 0034                   .dbline 40
 0034           ;  
 0034           ;    ADCSRA=ADCSRA&(1<<ADIF);
 0034 86B1              in R24,0x6
 0036 8071              andi R24,16
 0038 86B9              out 0x6,R24
 003A                   .dbline 41
 003A           ;    value=ADCL;            //Read 8 low bits first (important)
 003A 04B1              in R16,0x4
 003C 1127              clr R17
 003E                   .dbline 42
 003E           ;    value|=(int)ADCH << 8; //read 2 high bits and shift into top byte
 003E 25B0              in R2,0x5
 0040 3324              clr R3
 0042 322C              mov R3,R2
 0044 2224              clr R2
 0046 0229              or R16,R2
 0048 1329              or R17,R3
 004A                   .dbline 45
 004A           ;    
 004A           ;    //SEI(); //re-enable interrupts
 004A           ;    }
 004A           L3:
 004A                   .dbline 46
 004A           ;    return value;
 004A                   .dbline -2
 004A           L2:
 004A                   .dbline 0 ; func end
 004A 0895              ret
 004C                   .dbsym r value 16 I
 004C                   .dbend
 004C                   .dbfunc e system_protect _system_protect fV
                        .even
 004C           _system_protect::
 004C                   .dbline -1
 004C                   .dbline 50
 004C           ; }
 004C           ; 
 004C           ; void system_protect(void)
 004C           ; {
 004C                   .dbline 52
 004C           ;  /*改变采集通道*/ 
 004C           ; if(adc_couter==1)
 004C 80910100          lds R24,_adc_couter
 0050 8130              cpi R24,1
 0052 D1F4              brne L6
 0054                   .dbline 53
 0054           ; {
 0054                   .dbline 54
 0054           ;  if(ADC0==channel)
 0054 20900200          lds R2,_channel
 0058 2220              tst R2
 005A 31F4              brne L8
 005C                   .dbline 55
 005C           ;    {
 005C                   .dbline 56
 005C           ;    ADMUX=0x41;//select adc input 1 
 005C 81E4              ldi R24,65
 005E 87B9              out 0x7,R24
 0060                   .dbline 57
 0060           ;    channel=1;
 0060 81E0              ldi R24,1
 0062 80930200          sts _channel,R24
 0066                   .dbline 58
 0066           ;    }
 0066 09C0              xjmp L9
 0068           L8:
 0068                   .dbline 59
 0068           ;  else if (ADC1==channel)
 0068 80910200          lds R24,_channel
 006C 8130              cpi R24,1
 006E 29F4              brne L10
 0070                   .dbline 60
 0070           ;    {
 0070                   .dbline 61
 0070           ;    ADMUX = 0x40; //select adc input 0
 0070 80E4              ldi R24,64
 0072 87B9              out 0x7,R24
 0074                   .dbline 62
 0074           ;    channel=0;
 0074 2224              clr R2
 0076 20920200          sts _channel,R2
 007A                   .dbline 63
 007A           ;    }  
 007A           L10:
 007A           L9:
 007A                   .dbline 64
 007A           ;    adc_couter=0; 
 007A 2224              clr R2
 007C 20920100          sts _adc_couter,R2
 0080                   .dbline 65
 0080           ;    ADCSRA|=(1<<ADEN)|(1<<ADSC);//开始转换  
 0080 86B1              in R24,0x6
 0082 806C              ori R24,192
 0084 86B9              out 0x6,R24
 0086                   .dbline 66
 0086           ; }
 0086 18C0              xjmp L7
 0088           L6:
 0088                   .dbline 68
 0088           ; else
 0088           ; {
 0088                   .dbline 69
 0088           ;       adc_couter++;
 0088 80910100          lds R24,_adc_couter
 008C 8F5F              subi R24,255    ; addi 1
 008E 80930100          sts _adc_couter,R24
 0092                   .dbline 71
 0092           ;       
 0092           ;       if(ADC0==channel)
 0092 20900200          lds R2,_channel
 0096 2220              tst R2
 0098 31F4              brne L12
 009A                   .dbline 72
 009A           ;       {
 009A                   .dbline 73
 009A           ;         adc0_value=read_adc_value();
 009A CADF              xcall _read_adc_value
 009C 10930600          sts _adc0_value+1,R17
 00A0 00930500          sts _adc0_value,R16
 00A4                   .dbline 74
 00A4           ;         }
 00A4 09C0              xjmp L13
 00A6           L12:
 00A6                   .dbline 75
 00A6           ;       else if (ADC1==channel)
 00A6 80910200          lds R24,_channel
 00AA 8130              cpi R24,1
 00AC 29F4              brne L14
 00AE                   .dbline 76
 00AE           ;       {
 00AE                   .dbline 77
 00AE           ;         adc1_value=read_adc_value();
 00AE C0DF              xcall _read_adc_value
 00B0 10930400          sts _adc1_value+1,R17
 00B4 00930300          sts _adc1_value,R16
 00B8                   .dbline 78
 00B8           ;         }
 00B8           L14:
 00B8           L13:
 00B8                   .dbline 79
 00B8           L7:
 00B8                   .dbline -2
 00B8           L5:
 00B8                   .dbline 0 ; func end
 00B8 0895              ret
 00BA                   .dbend
                        .area bss(ram, con, rel)
 0000                   .dbfile F:\芯生光盘资料\范例代码\ADC\adc\adc.c
 0000           _adc_flag::
 0000                   .blkb 1
 0001                   .dbsym e adc_flag _adc_flag c
 0001           _adc_couter::
 0001                   .blkb 1
 0002                   .dbsym e adc_couter _adc_couter c
 0002           _channel::
 0002                   .blkb 1
 0003                   .dbsym e channel _channel c
 0003           _adc1_value::
 0003                   .blkb 2
 0005                   .dbsym e adc1_value _adc1_value I
 0005           _adc0_value::
 0005                   .blkb 2
 0007                   .dbsym e adc0_value _adc0_value I

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -