📄 adc.s
字号:
.module ADC.c
.area text(rom, con, rel)
.dbfile C:\DOCUME~1\Administrator\桌面\精雅系列单片机实验开发板演示程序\ADC/delay.h
.dbfunc e DelayUS _DelayUS fV
; time -> R16,R17
.even
_DelayUS::
.dbline -1
.dbline 9
; //内部晶振 8M
; #include <ioM16v.h>
; #include <macros.h>
; #include"delay.h"
;
;
;
;
; /*------宏定义------*/
xjmp L3
L2:
.dbline 11
subi R16,1
sbci R17,0
L3:
.dbline 10
; #define uchar unsigned char
ldi R24,1
ldi R25,0
cp R24,R16
cpc R25,R17
brlo L2
.dbline -2
L1:
.dbline 0 ; func end
ret
.dbsym r time 16 i
.dbend
.dbfunc e DelayMS _DelayMS fV
; i -> R20,R21
; time -> R16,R17
.even
_DelayMS::
xcall push_gset1
.dbline -1
.dbline 20
; #define uint unsigned int
; uchar led_date[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90};//数码管段位
; uchar led_seg[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};//数码管片选
; uchar vol,vol1=0,vol2=0,i;
;
; //端口初始化
; void port_init(void)
; {
; PORTA = 0x00;//设置端口数据和方向
; DDRA = 0x00;
xjmp L7
L6:
.dbline 23
; PORTB = 0x00;
; DDRB = 0xFF;
; PORTC = 0x00;
.dbline 24
; DDRC = 0x00;
ldi R20,1
ldi R21,0
xjmp L12
L9:
.dbline 25
L10:
.dbline 24
subi R20,255 ; offset = 1
sbci R21,255
L12:
.dbline 24
cpi R20,118
ldi R30,4
cpc R21,R30
brlo L9
.dbline 26
L7:
.dbline 22
movw R2,R16
subi R16,1
sbci R17,0
tst R2
brne L6
tst R3
brne L6
X0:
.dbline -2
L5:
xcall pop_gset1
.dbline 0 ; func end
ret
.dbsym r i 20 i
.dbsym r time 16 i
.dbend
.area data(ram, con, rel)
.dbfile C:\DOCUME~1\Administrator\桌面\精雅系列单片机实验开发板演示程序\ADC/delay.h
_led_date::
.blkb 2
.area idata
.byte 192,249
.area data(ram, con, rel)
.dbfile C:\DOCUME~1\Administrator\桌面\精雅系列单片机实验开发板演示程序\ADC/delay.h
.blkb 2
.area idata
.byte 164,176
.area data(ram, con, rel)
.dbfile C:\DOCUME~1\Administrator\桌面\精雅系列单片机实验开发板演示程序\ADC/delay.h
.blkb 2
.area idata
.byte 153,146
.area data(ram, con, rel)
.dbfile C:\DOCUME~1\Administrator\桌面\精雅系列单片机实验开发板演示程序\ADC/delay.h
.blkb 2
.area idata
.byte 130,248
.area data(ram, con, rel)
.dbfile C:\DOCUME~1\Administrator\桌面\精雅系列单片机实验开发板演示程序\ADC/delay.h
.blkb 2
.area idata
.byte 128,144
.area data(ram, con, rel)
.dbfile C:\DOCUME~1\Administrator\桌面\精雅系列单片机实验开发板演示程序\ADC/delay.h
.dbfile C:\DOCUME~1\Administrator\桌面\精雅系列单片机实验开发板演示程序\ADC\ADC.c
.dbsym e led_date _led_date A[10:10]c
_led_seg::
.blkb 2
.area idata
.byte 254,253
.area data(ram, con, rel)
.dbfile C:\DOCUME~1\Administrator\桌面\精雅系列单片机实验开发板演示程序\ADC\ADC.c
.blkb 2
.area idata
.byte 251,247
.area data(ram, con, rel)
.dbfile C:\DOCUME~1\Administrator\桌面\精雅系列单片机实验开发板演示程序\ADC\ADC.c
.blkb 2
.area idata
.byte 239,223
.area data(ram, con, rel)
.dbfile C:\DOCUME~1\Administrator\桌面\精雅系列单片机实验开发板演示程序\ADC\ADC.c
.blkb 2
.area idata
.byte 191,127
.area data(ram, con, rel)
.dbfile C:\DOCUME~1\Administrator\桌面\精雅系列单片机实验开发板演示程序\ADC\ADC.c
.dbsym e led_seg _led_seg A[8:8]c
_vol1::
.blkb 1
.area idata
.byte 0
.area data(ram, con, rel)
.dbfile C:\DOCUME~1\Administrator\桌面\精雅系列单片机实验开发板演示程序\ADC\ADC.c
.dbsym e vol1 _vol1 c
_vol2::
.blkb 1
.area idata
.byte 0
.area data(ram, con, rel)
.dbfile C:\DOCUME~1\Administrator\桌面\精雅系列单片机实验开发板演示程序\ADC\ADC.c
.dbsym e vol2 _vol2 c
.area text(rom, con, rel)
.dbfile C:\DOCUME~1\Administrator\桌面\精雅系列单片机实验开发板演示程序\ADC\ADC.c
.dbfunc e port_init _port_init fV
.even
_port_init::
.dbline -1
.dbline 18
.dbline 19
clr R2
out 0x1b,R2
.dbline 20
out 0x1a,R2
.dbline 21
out 0x18,R2
.dbline 22
ldi R24,255
out 0x17,R24
.dbline 23
out 0x15,R2
.dbline 24
out 0x14,R2
.dbline 25
; PORTD = 0x00;
out 0x12,R2
.dbline 26
; DDRD = 0xFF;
out 0x11,R24
.dbline -2
L13:
.dbline 0 ; func end
ret
.dbend
.dbfunc e adc_init _adc_init fV
.even
_adc_init::
.dbline -1
.dbline 31
; }
;
;
; void adc_init(void)
; {
.dbline 33
; //adc转换初始化
; ADCSRA = 0x00; //禁止AD转换
clr R2
out 0x6,R2
.dbline 34
; ADMUX = 0xe0;//ADC0单端输入,2.56V片内基准电源,转换结果左对齐
ldi R24,224
out 0x7,R24
.dbline 35
; SFIOR |= 0x00;//自动触发源禁止
in R2,0x30
out 0x30,R2
.dbline 36
; ACSR = 0x80; //禁止模拟比较器
ldi R24,128
out 0x8,R24
.dbline 37
; ADCSRA = 0x8F;//ADC使能,中断使能,128分频
ldi R24,143
out 0x6,R24
.dbline -2
L14:
.dbline 0 ; func end
ret
.dbend
.dbfunc e adc_calc _adc_calc fi
; voltage -> R10,R11
; value -> y+0
.even
_adc_calc::
xcall push_gset3
sbiw R28,4
.dbline -1
.dbline 42
; }
;
;
; unsigned int adc_calc(void)
; {
.dbline 44
; //计算实际电压
; unsigned long value=0;
ldi R20,0
ldi R21,0
ldi R22,0
ldi R23,0
movw R30,R28
std z+0,R20
std z+1,R21
std z+2,R22
std z+3,R23
.dbline 45
; unsigned int voltage=0; //电压单位为(mV)
clr R10
clr R11
.dbline 46
; value=ADCL>>6; //首先读低位
ldi R18,6
ldi R19,0
in R16,0x4
clr R17
xcall asr16
movw R2,R16
clr R4
sbrc R3,7
com R4
clr R5
sbrc R4,7
com R5
movw R30,R28
std z+0,R2
std z+1,R3
std z+2,R4
std z+3,R5
.dbline 47
; value|=(int)ADCH << 2; //然后读高位
in R2,0x5
clr R3
lsl R2
rol R3
lsl R2
rol R3
clr R4
sbrc R3,7
com R4
clr R5
sbrc R4,7
com R5
movw R30,R28
ldd R6,z+0
ldd R7,z+1
ldd R8,z+2
ldd R9,z+3
or R6,R2
or R7,R3
or R8,R4
or R9,R5
movw R30,R28
std z+0,R6
std z+1,R7
std z+2,R8
std z+3,R9
.dbline 48
; voltage=(value*2560)>>10;
movw R30,R28
ldd R2,z+0
ldd R3,z+1
ldd R4,z+2
ldd R5,z+3
ldi R20,0
ldi R21,10
ldi R22,0
ldi R23,0
st -y,R5
st -y,R4
st -y,R3
st -y,R2
movw R16,R20
movw R18,R22
xcall empy32u
ldi R24,10
ldi R25,0
st -y,R24
xcall lsr32
movw R10,R16
.dbline 49
; return voltage;
.dbline -2
L15:
adiw R28,4
xcall pop_gset3
.dbline 0 ; func end
ret
.dbsym r voltage 10 i
.dbsym l value 0 l
.dbend
.area vector(rom, abs)
.org 56
jmp _adc_isr
.area text(rom, con, rel)
.dbfile C:\DOCUME~1\Administrator\桌面\精雅系列单片机实验开发板演示程序\ADC\ADC.c
.dbfunc e adc_isr _adc_isr fV
.even
_adc_isr::
xcall push_lset
.dbline -1
.dbline 55
; }
;
;
; #pragma interrupt_handler adc_isr:15
; void adc_isr(void)
; {
.dbline 56
; if(i==5)
lds R24,_i
cpi R24,5
brne L17
.dbline 57
; vol1=adc_calc();
xcall _adc_calc
sts _vol1,R16
L17:
.dbline 58
; if(i==10)
lds R24,_i
cpi R24,10
brne L19
.dbline 59
; vol2=adc_calc();
xcall _adc_calc
sts _vol2,R16
L19:
.dbline 60
; if(vol1==vol2)
lds R2,_vol2
lds R3,_vol1
cp R3,R2
brne L21
.dbline 61
; vol=vol1;
mov R2,R3
sts _vol,R2
L21:
.dbline 62
; i++;
lds R24,_i
subi R24,255 ; addi 1
sts _i,R24
.dbline 63
; if(i>10)
ldi R24,10
lds R2,_i
cp R24,R2
brsh L23
.dbline 64
; i=0;
clr R2
sts _i,R2
L23:
.dbline 65
; ADCSRA|=BIT(ADSC);//ADC开始转换
sbi 0x6,6
.dbline -2
L16:
xcall pop_lset
.dbline 0 ; func end
reti
.dbend
.dbfunc e init_devices _init_devices fV
.even
_init_devices::
.dbline -1
.dbline 71
;
; }
;
;
; void init_devices(void)
; {
.dbline 72
; CLI(); //禁止所有中断
cli
.dbline 73
; MCUCR = 0x00;//外部中断触发方式
clr R2
out 0x35,R2
.dbline 74
; MCUCSR = 0x80;//禁止JTAG
ldi R24,128
out 0x34,R24
.dbline 75
; GICR = 0x00;//外部中断使能
out 0x3b,R2
.dbline 76
; port_init();
xcall _port_init
.dbline 77
; adc_init();
xcall _adc_init
.dbline 78
; SEI();//开全局中断
sei
.dbline 79
; ADCSRA|=BIT(ADSC);//ADC开始转换
sbi 0x6,6
.dbline -2
L25:
.dbline 0 ; func end
ret
.dbend
.dbfunc e main _main fV
.even
_main::
.dbline -1
.dbline 83
; }
; //主函数
; void main(void)
; {
.dbline 84
; init_devices();
xcall _init_devices
xjmp L28
L27:
.dbline 87
.dbline 88
ldi R18,10
ldi R19,0
lds R16,_vol
clr R17
xcall mod16s
movw R30,R16
ldi R24,<_led_date
ldi R25,>_led_date
add R30,R24
adc R31,R25
ldd R2,z+0
out 0x18,R2
.dbline 89
ldi R24,247
out 0x12,R24
.dbline 90
ldi R16,500
ldi R17,1
xcall _DelayUS
.dbline 91
ldi R18,10
ldi R19,0
lds R16,_vol
clr R17
xcall div16s
ldi R18,10
ldi R19,0
xcall mod16s
movw R30,R16
ldi R24,<_led_date
ldi R25,>_led_date
add R30,R24
adc R31,R25
ldd R2,z+0
out 0x18,R2
.dbline 92
ldi R24,251
out 0x12,R24
.dbline 93
ldi R16,500
ldi R17,1
xcall _DelayUS
.dbline 94
ldi R18,100
ldi R19,0
lds R16,_vol
clr R17
xcall div16s
ldi R18,10
ldi R19,0
xcall mod16s
movw R30,R16
ldi R24,<_led_date
ldi R25,>_led_date
add R30,R24
adc R31,R25
ldd R2,z+0
out 0x18,R2
.dbline 95
ldi R24,253
out 0x12,R24
.dbline 96
ldi R16,500
ldi R17,1
xcall _DelayUS
.dbline 97
ldi R18,1000
ldi R19,3
lds R16,_vol
clr R17
xcall div16s
ldi R18,10
ldi R19,0
xcall mod16s
movw R30,R16
ldi R24,<_led_date
ldi R25,>_led_date
add R30,R24
adc R31,R25
ldd R2,z+0
out 0x18,R2
.dbline 98
ldi R24,254
out 0x12,R24
.dbline 99
ldi R16,500
ldi R17,1
xcall _DelayUS
.dbline 100
L28:
.dbline 86
xjmp L27
X1:
.dbline -2
L26:
.dbline 0 ; func end
ret
.dbend
.area bss(ram, con, rel)
.dbfile C:\DOCUME~1\Administrator\桌面\精雅系列单片机实验开发板演示程序\ADC\ADC.c
_i::
.blkb 1
.dbsym e i _i c
_vol::
.blkb 1
.dbsym e vol _vol c
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -