📄 adc.lis
字号:
.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 + -