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

📄 adc.s

📁 AVR之ATMega16
💻 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 + -