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

📄 adc.lis

📁 AVR MEGA8 ADC 应用 程序源代码
💻 LIS
📖 第 1 页 / 共 2 页
字号:
                        .module ADC.c
                        .area text(rom, con, rel)
 0000                   .dbfile C:\调试程序\mega48\ADC\ADC.c
 0000                   .dbfunc e adc_init _adc_init fV
                        .even
 0000           _adc_init::
 0000                   .dbline -1
 0000                   .dbline 15
 0000           ; //使用内部RC振荡,PB6-G,PB7-DP短路块连接
 0000           ; //使用INT0/INT1按键切换ADC通道
 0000           ; #include <iom48v.h>
 0000           ; #include <macros.h>
 0000           ; #define osccal 0x9A//内部RC校正常数
 0000           ; #define Vref   500//参考电压值
 0000           ; extern const unsigned char seg_table[16];
 0000           ; extern unsigned char led_buff[4];
 0000           ; extern void delay_ms(unsigned int time);
 0000           ; extern void display(void);
 0000           ; unsigned int adc_rel;//AD转换结果
 0000           ; unsigned char adc_mux;//AD通道
 0000           ; //ADC初始化
 0000           ; void adc_init(void)
 0000           ; {
 0000                   .dbline 16
 0000           ;  DDRC=0x00;
 0000 2224              clr R2
 0002 27B8              out 0x7,R2
 0004                   .dbline 17
 0004           ;  PORTC=0x00;
 0004 28B8              out 0x8,R2
 0006                   .dbline 18
 0006           ;  ADCSRA = 0x00; //设置前,先关闭ADC
 0006 20927A00          sts 122,R2
 000A                   .dbline 19
 000A           ;  ADMUX =(1<<REFS0)|(adc_mux&0x0f);//选择内部AVCC为基准,单端输入口为ADC0
 000A 80910000          lds R24,_adc_mux
 000E 8F70              andi R24,15
 0010 8064              ori R24,64
 0012 80937C00          sts 124,R24
 0016                   .dbline 20
 0016           ;  ACSR  =(1<<ACD);//关闭模拟比较器,禁止位P148
 0016 80E8              ldi R24,128
 0018 80BF              out 0x30,R24
 001A                   .dbline 21
 001A           ;  ADCSRA=(1<<ADEN)|(1<<ADSC)|(1<<ADIE)|(1<<ADPS2)|(1<<ADPS1) ;//ADC时钟64分频
 001A 8EEC              ldi R24,206
 001C 80937A00          sts 122,R24
 0020                   .dbline -2
 0020           L1:
 0020                   .dbline 0 ; func end
 0020 0895              ret
 0022                   .dbend
                        .area vector(rom, abs)
                        .org 42
 002A 11C0              rjmp _adc_isr
                        .area text(rom, con, rel)
 0022                   .dbfile C:\调试程序\mega48\ADC\ADC.c
 0022                   .dbfunc e adc_isr _adc_isr fV
                        .even
 0022           _adc_isr::
 0022 8A93              st -y,R24
 0024 9A93              st -y,R25
 0026 8FB7              in R24,0x3f
 0028 8A93              st -y,R24
 002A                   .dbline -1
 002A                   .dbline 26
 002A           ; }
 002A           ; //ADC完成中断
 002A           ; #pragma interrupt_handler adc_isr:22     
 002A           ; void adc_isr(void)
 002A           ; {
 002A                   .dbline 27
 002A           ;  adc_rel=ADC&0x3ff;
 002A 80917800          lds R24,120
 002E 90917900          lds R25,120+1
 0032 9370              andi R25,3
 0034 90930200          sts _adc_rel+1,R25
 0038 80930100          sts _adc_rel,R24
 003C                   .dbline 28
 003C           ;  ADMUX=(1<<REFS0)|(adc_mux&0x0f);//选择内部AVCC为基准
 003C 80910000          lds R24,_adc_mux
 0040 8F70              andi R24,15
 0042 8064              ori R24,64
 0044 80937C00          sts 124,R24
 0048                   .dbline 29
 0048           ;  ADCSRA|=(1<<ADSC);//启动AD转换
 0048 80917A00          lds R24,122
 004C 8064              ori R24,64
 004E 80937A00          sts 122,R24
 0052                   .dbline -2
 0052           L2:
 0052 8991              ld R24,y+
 0054 8FBF              out 0x3f,R24
 0056 9991              ld R25,y+
 0058 8991              ld R24,y+
 005A                   .dbline 0 ; func end
 005A 1895              reti
 005C                   .dbend
 005C                   .dbfunc e ADCtoBCD _ADCtoBCD fV
 005C           ;              i -> R10
 005C           ;           temp -> R12,R13
                        .even
 005C           _ADCtoBCD::
 005C 00D0              rcall push_gset4
 005E 6801              movw R12,R16
 0060                   .dbline -1
 0060                   .dbline 33
 0060           ; }
 0060           ; //ADC结果转换成电压值
 0060           ; void ADCtoBCD(unsigned int temp)
 0060           ;  {
 0060                   .dbline 35
 0060           ;   unsigned char i;
 0060           ;   temp=(unsigned int)(((unsigned long)((unsigned long)temp*Vref))/0x3ff);
 0060 1601              movw R2,R12
 0062 4424              clr R4
 0064 5524              clr R5
 0066 44EF              ldi R20,244
 0068 51E0              ldi R21,1
 006A 60E0              ldi R22,0
 006C 70E0              ldi R23,0
 006E 5A92              st -y,R5
 0070 4A92              st -y,R4
 0072 3A92              st -y,R3
 0074 2A92              st -y,R2
 0076 8A01              movw R16,R20
 0078 9B01              movw R18,R22
 007A 00D0              rcall empy32u
 007C 4FEF              ldi R20,255
 007E 53E0              ldi R21,3
 0080 60E0              ldi R22,0
 0082 70E0              ldi R23,0
 0084 7A93              st -y,R23
 0086 6A93              st -y,R22
 0088 5A93              st -y,R21
 008A 4A93              st -y,R20
 008C 00D0              rcall div32u
 008E 6801              movw R12,R16
 0090                   .dbline 36
 0090           ;   for(i=0;i<4;i++)
 0090 AA24              clr R10
 0092 17C0              rjmp L7
 0094           L4:
 0094                   .dbline 37
 0094                   .dbline 38
 0094 2AE0              ldi R18,10
 0096 30E0              ldi R19,0
 0098 8601              movw R16,R12
 009A 00D0              rcall mod16u
 009C F801              movw R30,R16
 009E 80E0              ldi R24,<_seg_table
 00A0 90E0              ldi R25,>_seg_table
 00A2 E80F              add R30,R24
 00A4 F91F              adc R31,R25
 00A6 E491              lpm R30,Z
 00A8 80E0              ldi R24,<_led_buff
 00AA 90E0              ldi R25,>_led_buff
 00AC AA2D              mov R26,R10
 00AE BB27              clr R27
 00B0 A80F              add R26,R24
 00B2 B91F              adc R27,R25
 00B4 EC93              st x,R30
 00B6                   .dbline 39
 00B6 2AE0              ldi R18,10
 00B8 30E0              ldi R19,0
 00BA 8601              movw R16,R12
 00BC 00D0              rcall div16u
 00BE 6801              movw R12,R16
 00C0                   .dbline 40
 00C0           L5:
 00C0                   .dbline 36
 00C0 A394              inc R10
 00C2           L7:
 00C2                   .dbline 36
 00C2 8A2D              mov R24,R10
 00C4 8430              cpi R24,4
 00C6 30F3              brlo L4
 00C8                   .dbline 41
 00C8           ;   {
 00C8           ;    led_buff[i]=seg_table[temp%10];
 00C8           ;    temp=temp/10;
 00C8           ;    }
 00C8           ;   led_buff[2]&=0x7f; 
 00C8 80910200          lds R24,_led_buff+2
 00CC 8F77              andi R24,127
 00CE 80930200          sts _led_buff+2,R24
 00D2                   .dbline -2
 00D2           L3:
 00D2 00D0              rcall pop_gset4
 00D4                   .dbline 0 ; func end
 00D4 0895              ret
 00D6                   .dbsym r i 10 c
 00D6                   .dbsym r temp 12 i
 00D6                   .dbend
 00D6                   .dbfunc e main _main fV
 00D6           ;        adc_old -> R22,R23
 00D6           ;              i -> R20
                        .even
 00D6           _main::
 00D6                   .dbline -1
 00D6                   .dbline 45
 00D6           ;  }
 00D6           ; //MAIN程序
 00D6           ; void main(void)
 00D6           ; {
 00D6                   .dbline 48
 00D6           ;  unsigned char i;
 00D6           ;  unsigned int adc_old;
 00D6           ;  DDRD=0xf0;
 00D6 80EF              ldi R24,240
 00D8 8AB9              out 0xa,R24
 00DA                   .dbline 49
 00DA           ;  PORTD=0xff;
 00DA 8FEF              ldi R24,255
 00DC 8BB9              out 0xb,R24
 00DE                   .dbline 50
 00DE           ;  OSCCAL=osccal;//校正振荡频率
 00DE 8AE9              ldi R24,154
 00E0 80936600          sts 102,R24
 00E4                   .dbline 51
 00E4           ;  adc_mux=0;
 00E4 2224              clr R2
 00E6 20920000          sts _adc_mux,R2
 00EA                   .dbline 52
 00EA           ;  adc_init();
 00EA 8ADF              rcall _adc_init
 00EC                   .dbline 53
 00EC           ;  SEI();//使能全局中断
 00EC 7894              sei
 00EE                   .dbline 55
 00EE           ;  
 00EE           ;  for(i=0;i<4;i++)
 00EE 4427              clr R20
 00F0 10C0              rjmp L13
 00F2           L10:
 00F2                   .dbline 56
 00F2                   .dbline 57

⌨️ 快捷键说明

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