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

📄 adc.s

📁 AVR MEGA8 ADC 应用 程序源代码
💻 S
字号:
	.module ADC.c
	.area text(rom, con, rel)
	.dbfile C:\调试程序\mega48\ADC\ADC.c
	.dbfunc e adc_init _adc_init fV
	.even
_adc_init::
	.dbline -1
	.dbline 15
; //使用内部RC振荡,PB6-G,PB7-DP短路块连接
; //使用INT0/INT1按键切换ADC通道
; #include <iom48v.h>
; #include <macros.h>
; #define osccal 0x9A//内部RC校正常数
; #define Vref   500//参考电压值
; extern const unsigned char seg_table[16];
; extern unsigned char led_buff[4];
; extern void delay_ms(unsigned int time);
; extern void display(void);
; unsigned int adc_rel;//AD转换结果
; unsigned char adc_mux;//AD通道
; //ADC初始化
; void adc_init(void)
; {
	.dbline 16
;  DDRC=0x00;
	clr R2
	out 0x7,R2
	.dbline 17
;  PORTC=0x00;
	out 0x8,R2
	.dbline 18
;  ADCSRA = 0x00; //设置前,先关闭ADC
	sts 122,R2
	.dbline 19
;  ADMUX =(1<<REFS0)|(adc_mux&0x0f);//选择内部AVCC为基准,单端输入口为ADC0
	lds R24,_adc_mux
	andi R24,15
	ori R24,64
	sts 124,R24
	.dbline 20
;  ACSR  =(1<<ACD);//关闭模拟比较器,禁止位P148
	ldi R24,128
	out 0x30,R24
	.dbline 21
;  ADCSRA=(1<<ADEN)|(1<<ADSC)|(1<<ADIE)|(1<<ADPS2)|(1<<ADPS1) ;//ADC时钟64分频
	ldi R24,206
	sts 122,R24
	.dbline -2
L1:
	.dbline 0 ; func end
	ret
	.dbend
	.area vector(rom, abs)
	.org 42
	rjmp _adc_isr
	.area text(rom, con, rel)
	.dbfile C:\调试程序\mega48\ADC\ADC.c
	.dbfunc e adc_isr _adc_isr fV
	.even
_adc_isr::
	st -y,R24
	st -y,R25
	in R24,0x3f
	st -y,R24
	.dbline -1
	.dbline 26
; }
; //ADC完成中断
; #pragma interrupt_handler adc_isr:22     
; void adc_isr(void)
; {
	.dbline 27
;  adc_rel=ADC&0x3ff;
	lds R24,120
	lds R25,120+1
	andi R25,3
	sts _adc_rel+1,R25
	sts _adc_rel,R24
	.dbline 28
;  ADMUX=(1<<REFS0)|(adc_mux&0x0f);//选择内部AVCC为基准
	lds R24,_adc_mux
	andi R24,15
	ori R24,64
	sts 124,R24
	.dbline 29
;  ADCSRA|=(1<<ADSC);//启动AD转换
	lds R24,122
	ori R24,64
	sts 122,R24
	.dbline -2
L2:
	ld R24,y+
	out 0x3f,R24
	ld R25,y+
	ld R24,y+
	.dbline 0 ; func end
	reti
	.dbend
	.dbfunc e ADCtoBCD _ADCtoBCD fV
;              i -> R10
;           temp -> R12,R13
	.even
_ADCtoBCD::
	rcall push_gset4
	movw R12,R16
	.dbline -1
	.dbline 33
; }
; //ADC结果转换成电压值
; void ADCtoBCD(unsigned int temp)
;  {
	.dbline 35
;   unsigned char i;
;   temp=(unsigned int)(((unsigned long)((unsigned long)temp*Vref))/0x3ff);
	movw R2,R12
	clr R4
	clr R5
	ldi R20,244
	ldi R21,1
	ldi R22,0
	ldi R23,0
	st -y,R5
	st -y,R4
	st -y,R3
	st -y,R2
	movw R16,R20
	movw R18,R22
	rcall empy32u
	ldi R20,255
	ldi R21,3
	ldi R22,0
	ldi R23,0
	st -y,R23
	st -y,R22
	st -y,R21
	st -y,R20
	rcall div32u
	movw R12,R16
	.dbline 36
;   for(i=0;i<4;i++)
	clr R10
	rjmp L7
L4:
	.dbline 37
	.dbline 38
	ldi R18,10
	ldi R19,0
	movw R16,R12
	rcall mod16u
	movw R30,R16
	ldi R24,<_seg_table
	ldi R25,>_seg_table
	add R30,R24
	adc R31,R25
	lpm R30,Z
	ldi R24,<_led_buff
	ldi R25,>_led_buff
	mov R26,R10
	clr R27
	add R26,R24
	adc R27,R25
	st x,R30
	.dbline 39
	ldi R18,10
	ldi R19,0
	movw R16,R12
	rcall div16u
	movw R12,R16
	.dbline 40
L5:
	.dbline 36
	inc R10
L7:
	.dbline 36
	mov R24,R10
	cpi R24,4
	brlo L4
	.dbline 41
;   {
;    led_buff[i]=seg_table[temp%10];
;    temp=temp/10;
;    }
;   led_buff[2]&=0x7f; 
	lds R24,_led_buff+2
	andi R24,127
	sts _led_buff+2,R24
	.dbline -2
L3:
	rcall pop_gset4
	.dbline 0 ; func end
	ret
	.dbsym r i 10 c
	.dbsym r temp 12 i
	.dbend
	.dbfunc e main _main fV
;        adc_old -> R22,R23
;              i -> R20
	.even
_main::
	.dbline -1
	.dbline 45
;  }
; //MAIN程序
; void main(void)
; {
	.dbline 48
;  unsigned char i;
;  unsigned int adc_old;
;  DDRD=0xf0;
	ldi R24,240
	out 0xa,R24
	.dbline 49
;  PORTD=0xff;
	ldi R24,255
	out 0xb,R24
	.dbline 50
;  OSCCAL=osccal;//校正振荡频率
	ldi R24,154
	sts 102,R24
	.dbline 51
;  adc_mux=0;
	clr R2
	sts _adc_mux,R2
	.dbline 52
;  adc_init();
	rcall _adc_init
	.dbline 53
;  SEI();//使能全局中断
	sei
	.dbline 55
;  
;  for(i=0;i<4;i++)
	clr R20
	rjmp L13
L10:
	.dbline 56
	.dbline 57
	ldi R24,<_led_buff
	ldi R25,>_led_buff
	mov R30,R20
	clr R31
	add R30,R24
	adc R31,R25
	ldi R26,<_seg_table+8
	ldi R27,>_seg_table+8
	st -y,R31
	st -y,R30
	movw R30,R26
	lpm R26,Z
	ld R30,y+
	ld R31,y+
	std z+0,R26
	.dbline 58
L11:
	.dbline 55
	inc R20
L13:
	.dbline 55
	cpi R20,4
	brlo L10
	.dbline 59
;   { 
;    led_buff[i]=seg_table[8];
;   }
;  for(i=0;i<100;i++)
	clr R20
	rjmp L18
L15:
	.dbline 60
	rcall _display
L16:
	.dbline 59
	inc R20
L18:
	.dbline 59
	cpi R20,100
	brlo L15
	.dbline 62
;    display();
; 
;  adc_old=0;
	clr R22
	clr R23
	.dbline 63
;  adc_rel=0; 
	clr R2
	clr R3
	sts _adc_rel+1,R3
	sts _adc_rel,R2
	rjmp L20
L19:
	.dbline 65
;  while(1)
;   {   
	.dbline 66
;    if(adc_old!=adc_rel)
	lds R2,_adc_rel
	lds R3,_adc_rel+1
	cp R22,R2
	cpc R23,R3
	breq L22
	.dbline 67
;      {
	.dbline 68
; 	  adc_old=adc_rel;
	movw R22,R2
	.dbline 69
; 	  ADCtoBCD(adc_old);
	movw R16,R2
	rcall _ADCtoBCD
	.dbline 70
; 	 }
L22:
	.dbline 71
;    display();
	rcall _display
	.dbline 73
; 
;    i=PIND&0x0c;//判断按键
	in R20,0x9
	andi R20,12
	.dbline 74
;    if(i!=0x0c)
	cpi R20,12
	brne X1
	rjmp L24
X1:
	.dbline 75
;      {
	.dbline 76
; 	  display();//按键消抖
	rcall _display
	.dbline 77
; 	  if(i==(PIND&0x0c))
	in R24,0x9
	andi R24,12
	cp R20,R24
	breq X2
	rjmp L26
X2:
	.dbline 78
; 	    {
	.dbline 79
; 		 CLI();
	cli
	.dbline 80
; 		 adc_rel=0;
	clr R2
	clr R3
	sts _adc_rel+1,R3
	sts _adc_rel,R2
	.dbline 81
; 		 adc_old=0;
	clr R22
	clr R23
	.dbline 82
; 		 if (i==0x08)//INT0键按下
	cpi R20,8
	brne L28
	.dbline 83
; 		    {
	.dbline 84
; 			 if(adc_mux<3)
	lds R24,_adc_mux
	cpi R24,3
	brsh L30
	.dbline 85
; 			    adc_mux++;//递增
	subi R24,255    ; addi 1
	sts _adc_mux,R24
	rjmp L31
L30:
	.dbline 87
; 		     else
; 			    adc_mux=0;		
	clr R2
	sts _adc_mux,R2
L31:
	.dbline 88
; 			}
L28:
	.dbline 89
; 		 if (i==0x04)//INT1键按下
	cpi R20,4
	brne L32
	.dbline 90
; 		    {
	.dbline 91
; 			 if(adc_mux>0)
	clr R2
	lds R3,_adc_mux
	cp R2,R3
	brsh L34
	.dbline 92
; 			    adc_mux--;//递减
	mov R24,R3
	subi R24,1
	sts _adc_mux,R24
	rjmp L35
L34:
	.dbline 94
; 			 else
; 			    adc_mux=3;	
	ldi R24,3
	sts _adc_mux,R24
L35:
	.dbline 95
; 			}
L32:
	.dbline 96
; 	     led_buff[0]=seg_table[adc_mux];
	ldi R24,<_seg_table
	ldi R25,>_seg_table
	lds R30,_adc_mux
	clr R31
	add R30,R24
	adc R31,R25
	lpm R30,Z
	sts _led_buff,R30
	.dbline 97
; 		 led_buff[1]=0xbf;//-
	ldi R24,191
	sts _led_buff+1,R24
	.dbline 98
; 		 led_buff[2]=0b10001001;//h
	ldi R24,137
	sts _led_buff+2,R24
	.dbline 99
; 		 led_buff[3]=0b11000110;//C		
	ldi R24,198
	sts _led_buff+3,R24
	rjmp L40
L39:
	.dbline 101
	rcall _display
L40:
	.dbline 100
; 	     while((PIND&0x0c)!=0x0c)//检查按键释放
	in R24,0x9
	andi R24,12
	cpi R24,12
	brne L39
	.dbline 102
; 		    display(); 		
; 	     SEI();		 
	sei
	.dbline 103
; 		}
L26:
	.dbline 104
; 	 }
L24:
	.dbline 107
L20:
	.dbline 64
	rjmp L19
X0:
	.dbline -2
L9:
	.dbline 0 ; func end
	ret
	.dbsym r adc_old 22 i
	.dbsym r i 20 c
	.dbend
	.area bss(ram, con, rel)
	.dbfile C:\调试程序\mega48\ADC\ADC.c
_adc_mux::
	.blkb 1
	.dbsym e adc_mux _adc_mux c
_adc_rel::
	.blkb 2
	.dbsym e adc_rel _adc_rel i

⌨️ 快捷键说明

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