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

📄 ad.s

📁 AtMega169的ADC功能的测试C语言程序
💻 S
字号:
	.module AD.C
	.area text(rom, con, rel)
	.dbfile E:\WORK\WORK_DEMO\169P_demo\169ADC\AD.C
	.dbfunc e adc_init _adc_init fV
	.even
_adc_init::
	.dbline -1
	.dbline 22
; // **************************************************************
; // *** 		         广 州 天 河 双 龙 电 子 公 司 	          ***
; // ***                   http://www.sl.com.cn                 ***
; // ***                   实验:ADC转换		                   ***
; // ***                  作者:zxy@sl.com.cn                   ***
; // ***                       2006年3月28日                    ***
; // ***         目标MCU:MEGA169    晶振:内部(INT)8MHZ         ***
; // **************************************************************
; //用跳线短接J3的ADC2,调节可变电阻R7,LED显示将发生变化 
; #include <iom169v.h>
; #include <macros.h>
; #define Vref   3212//参考电压值,注意不同环境下的Vref不相同
; 
; 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转换结果
; 
; //ADC初始化
; void adc_init(void)
; {
	.dbline 23
;  ADCSRA = 0x00; //设置前,先关闭ADC
	clr R2
	sts 122,R2
	.dbline 24
;  ADMUX =(1<<REFS0)|(1<<MUX0);//选择内部AVCC为基准,单端输入口为ADC1
	ldi R24,65
	sts 124,R24
	.dbline 25
;  ACSR  =(1<<ACD);//关闭模拟比较器,禁止位P148
	ldi R24,128
	out 0x30,R24
	.dbline 26
;  ADCSRA=(1<<ADEN)|(1<<ADSC)|(1<<ADIE)|(1<<ADPS2)|(1<<ADPS1)|(1<<ADPS0);//ADC时钟64分频
	ldi R24,207
	sts 122,R24
	.dbline -2
L1:
	.dbline 0 ; func end
	ret
	.dbend
	.area vector(rom, abs)
	.org 76
	jmp _adc_isr
	.area text(rom, con, rel)
	.dbfile E:\WORK\WORK_DEMO\169P_demo\169ADC\AD.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 34
; }
; 
; //ADC完成中断
; #pragma interrupt_handler adc_isr:20 
; //AD 中断  
; 
; void adc_isr(void)
; { 
	.dbline 36
; 
;  adc_rel = ADC&0x3ff;
	lds R24,120
	lds R25,120+1
	andi R25,3
	sts _adc_rel+1,R25
	sts _adc_rel,R24
	.dbline 38
;  //ADMUX =(1<<REFS0)|(1<<MUX0);
;  ADCSRA|=(1<<ADSC);//启动AD转换
	lds R24,122
	ori R24,64
	sts 122,R24
	.dbline -2
L2:
	.dbline 0 ; func end
	ld R24,y+
	out 0x3f,R24
	ld R25,y+
	ld R24,y+
	reti
	.dbend
	.dbfunc e ADCtoBCD _ADCtoBCD fV
;              i -> R12
;           temp -> R10,R11
	.even
_ADCtoBCD::
	xcall push_xgsetF03C
	movw R10,R16
	.dbline -1
	.dbline 43
; }
; 
; //ADC结果转换成电压值
; void ADCtoBCD(unsigned int temp)
;  {
	.dbline 45
;   unsigned char i;
;   temp=(unsigned int)(((unsigned long)((unsigned long)temp*Vref))/1024);//ADC结果转换成电压值
	movw R2,R10
	clr R4
	clr R5
	ldi R20,140
	ldi R21,12
	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 46
;   for(i=0;i<4;i++)
	clr R12
	xjmp L7
L4:
	.dbline 47
;   {
	.dbline 48
;    led_buff[i]=seg_table[temp%10];//结果存入显示缓存
	ldi R18,10
	ldi R19,0
	movw R16,R10
	xcall mod16u
	movw R30,R16
	ldi R24,<_seg_table
	ldi R25,>_seg_table
	add R30,R24
	adc R31,R25
	lpm R2,Z
	ldi R24,<_led_buff
	ldi R25,>_led_buff
	mov R30,R12
	clr R31
	add R30,R24
	adc R31,R25
	std z+0,R2
	.dbline 49
;    temp=temp/10;
	ldi R18,10
	ldi R19,0
	movw R16,R10
	xcall div16u
	movw R10,R16
	.dbline 50
;    }
L5:
	.dbline 46
	inc R12
L7:
	.dbline 46
	mov R24,R12
	cpi R24,4
	brlo L4
X0:
	.dbline 51
;   led_buff[3]&=0x7f; 
	lds R24,_led_buff+3
	andi R24,127
	sts _led_buff+3,R24
	.dbline -2
L3:
	.dbline 0 ; func end
	xjmp pop_xgsetF03C
	.dbsym r i 12 c
	.dbsym r temp 10 i
	.dbend
	.dbfunc e main _main fV
;        adc_old -> R10,R11
	.even
_main::
	.dbline -1
	.dbline 55
;  }
; 
; void main(void)
; { 
	.dbline 57
;  unsigned int adc_old;
;     adc_init();//AD初始化
	xcall _adc_init
	.dbline 59
; 	  
; 	  DDRE=0xff;//E口初始化
	ldi R24,255
	out 0xd,R24
	.dbline 60
; 	  PORTE=0xff;//E口初始化
	out 0xe,R24
	.dbline 61
; 	  DDRB|=0xf0;//B口初始化
	in R24,0x4
	ori R24,240
	out 0x4,R24
	.dbline 62
; 	  PORTB|=0xf0;//B口初始化
	in R24,0x5
	ori R24,240
	out 0x5,R24
	.dbline 63
; 	  SEI();//使能全局中断
	sei
	xjmp L11
L10:
	.dbline 65
;     while(1)
;     { 
	.dbline 66
; 	   if(adc_old!=adc_rel)
	lds R2,_adc_rel
	lds R3,_adc_rel+1
	cp R10,R2
	cpc R11,R3
	breq L13
X1:
	.dbline 67
;             {
	.dbline 68
; 	            adc_old=adc_rel;  //AD转换结果
	movw R10,R2
	.dbline 69
; 	            ADCtoBCD(adc_old);//进制转换
	movw R16,R2
	xcall _ADCtoBCD
	.dbline 70
; 	          }	   	
L13:
	.dbline 71
; 	   display();	//显示函数
	xcall _display
	.dbline 73
; 	        			 
; 	}
L11:
	.dbline 64
	xjmp L10
X2:
	.dbline -2
L9:
	.dbline 0 ; func end
	ret
	.dbsym r adc_old 10 i
	.dbend
	.area bss(ram, con, rel)
	.dbfile E:\WORK\WORK_DEMO\169P_demo\169ADC\AD.C
_adc_rel::
	.blkb 2
	.dbsym e adc_rel _adc_rel i
; }				          
; 		
; 				
; 	           
;          
; 
;  
;  
;  
;  

⌨️ 快捷键说明

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