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

📄 adc.s

📁 单片机中的ADC模块
💻 S
字号:
	.module adc.c
	.area text(rom, con, rel)
	.dbfile F:\芯生光盘资料\范例代码\ADC\adc\adc.c
	.dbfunc e adc_init _adc_init fV
	.even
_adc_init::
	.dbline -1
	.dbline 19
; 
; #include <iom128v.h>
; #include <macros.h>
; #include "stdtypes.h"
; #include "adc.h"
; 
; 
; #define ADC_END    ADCSRA&0x10
; 
; int adc0_value;
; int adc1_value;
; UNS8 channel;
; UNS8 adc_couter;
; UNS8 adc_flag;
; 
; //ADC initialize
; // Conversion time: 416uS
; void adc_init(void)
; {
	.dbline 21
; 
;  ADCSRA = 0x00; //disable adc
	clr R2
	out 0x6,R2
	.dbline 22
;  ADMUX = 0x40; //select adc input 0
	ldi R24,64
	out 0x7,R24
	.dbline 23
;  ACSR  = 0x80;
	ldi R24,128
	out 0x8,R24
	.dbline 24
;  ADCSRA = 0x07;//00101111 分频128 不是连续转换 中断使能
	ldi R24,7
	out 0x6,R24
	.dbline 25
;  adc0_value=0;
	clr R3
	sts _adc0_value+1,R3
	sts _adc0_value,R2
	.dbline 26
;  adc1_value=0;
	sts _adc1_value+1,R3
	sts _adc1_value,R2
	.dbline 27
;  channel=0;
	sts _channel,R2
	.dbline 28
;  adc_couter=0;
	sts _adc_couter,R2
	.dbline 29
;  adc_flag=0;
	sts _adc_flag,R2
	.dbline -2
L1:
	.dbline 0 ; func end
	ret
	.dbend
	.dbfunc e read_adc_value _read_adc_value fI
;          value -> R16,R17
	.even
_read_adc_value::
	.dbline -1
	.dbline 34
; }
; 
; 
; int read_adc_value(void)
; {  
	.dbline 37
;    int value;
;    //CLI();
;    if(ADC_END)
	sbis 0x6,4
	rjmp L3
	.dbline 38
;    {
	.dbline 40
;  
;    ADCSRA=ADCSRA&(1<<ADIF);
	in R24,0x6
	andi R24,16
	out 0x6,R24
	.dbline 41
;    value=ADCL;            //Read 8 low bits first (important)
	in R16,0x4
	clr R17
	.dbline 42
;    value|=(int)ADCH << 8; //read 2 high bits and shift into top byte
	in R2,0x5
	clr R3
	mov R3,R2
	clr R2
	or R16,R2
	or R17,R3
	.dbline 45
;    
;    //SEI(); //re-enable interrupts
;    }
L3:
	.dbline 46
;    return value;
	.dbline -2
L2:
	.dbline 0 ; func end
	ret
	.dbsym r value 16 I
	.dbend
	.dbfunc e system_protect _system_protect fV
	.even
_system_protect::
	.dbline -1
	.dbline 50
; }
; 
; void system_protect(void)
; {
	.dbline 52
;  /*改变采集通道*/ 
; if(adc_couter==1)
	lds R24,_adc_couter
	cpi R24,1
	brne L6
	.dbline 53
; {
	.dbline 54
;  if(ADC0==channel)
	lds R2,_channel
	tst R2
	brne L8
	.dbline 55
;    {
	.dbline 56
;    ADMUX=0x41;//select adc input 1 
	ldi R24,65
	out 0x7,R24
	.dbline 57
;    channel=1;
	ldi R24,1
	sts _channel,R24
	.dbline 58
;    }
	xjmp L9
L8:
	.dbline 59
;  else if (ADC1==channel)
	lds R24,_channel
	cpi R24,1
	brne L10
	.dbline 60
;    {
	.dbline 61
;    ADMUX = 0x40; //select adc input 0
	ldi R24,64
	out 0x7,R24
	.dbline 62
;    channel=0;
	clr R2
	sts _channel,R2
	.dbline 63
;    }  
L10:
L9:
	.dbline 64
;    adc_couter=0; 
	clr R2
	sts _adc_couter,R2
	.dbline 65
;    ADCSRA|=(1<<ADEN)|(1<<ADSC);//开始转换  
	in R24,0x6
	ori R24,192
	out 0x6,R24
	.dbline 66
; }
	xjmp L7
L6:
	.dbline 68
; else
; {
	.dbline 69
;       adc_couter++;
	lds R24,_adc_couter
	subi R24,255    ; addi 1
	sts _adc_couter,R24
	.dbline 71
;       
; 	if(ADC0==channel)
	lds R2,_channel
	tst R2
	brne L12
	.dbline 72
;       {
	.dbline 73
; 	  adc0_value=read_adc_value();
	xcall _read_adc_value
	sts _adc0_value+1,R17
	sts _adc0_value,R16
	.dbline 74
; 	  }
	xjmp L13
L12:
	.dbline 75
; 	else if (ADC1==channel)
	lds R24,_channel
	cpi R24,1
	brne L14
	.dbline 76
;       {
	.dbline 77
; 	  adc1_value=read_adc_value();
	xcall _read_adc_value
	sts _adc1_value+1,R17
	sts _adc1_value,R16
	.dbline 78
; 	  }
L14:
L13:
	.dbline 79
L7:
	.dbline -2
L5:
	.dbline 0 ; func end
	ret
	.dbend
	.area bss(ram, con, rel)
	.dbfile F:\芯生光盘资料\范例代码\ADC\adc\adc.c
_adc_flag::
	.blkb 1
	.dbsym e adc_flag _adc_flag c
_adc_couter::
	.blkb 1
	.dbsym e adc_couter _adc_couter c
_channel::
	.blkb 1
	.dbsym e channel _channel c
_adc1_value::
	.blkb 2
	.dbsym e adc1_value _adc1_value I
_adc0_value::
	.blkb 2
	.dbsym e adc0_value _adc0_value I

⌨️ 快捷键说明

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