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

📄 mega16_ad.s

📁 AVR16单片机集成10位AD程序
💻 S
字号:
	.module MEGA16_AD.C
	.area text(rom, con, rel)
	.dbfile C:/icc/include/AVR_PQ1A.h
	.dbfunc e Delayus _Delayus fV
;              i -> R20,R21
;             US -> R22,R23
	.even
_Delayus::
	xcall push_gset2
	movw R22,R16
	.dbline -1
	.dbline 28
; /*******************************************
;   文件:MEGA16_AD.C
;   环境:编译为ICC AVR6.25A,仿真为AVR Studio4.10 
;   硬件:ATMEGA16芯片
;   日期:2006年12月10日 
;   功能:驱动MEGA16片上自带的AD转换器
;   备注:参考《AVR系列单片机C语言编程与应用实例》(清华大学出版社)
; /******************************************/
; #include <iom16v.h>			//包含型号头文件
; #include <macros.h>			//包含"位"操作头文件
; #include <stdio.h>			//标准输入输出头文件
; #include <AVR_PQ1A.h>		//包含自定义常量头文件
; #include "SMG.C"		//包含数码管显示函数
; 
; /*******************************************
; 函数名称: Mega16_ad
; 功    能: 对指定的通道进行模数转换
; 参    数: chl--指定的通道(本开发板只用了通道0)
; 返回值  : addata--10位数据输出
; /********************************************/
; uint Mega16_ad(uchar chl)
; {
;  uint addata;  
;  DDRA&=~(BIT(PA0)|BIT(PA1));	 //转换口设置为输入、无上拉
;  PORTA&=~(BIT(PA0)|BIT(PA1));	
;  ADMUX=0;	 //采用外部参考电压,输出数据右对齐
;  ADMUX|=chl; //设置指定的通道
;  ADCSR=0x80; //采用单次转换,查询模式,2分频
	.dbline 30
;  ADCSR|=BIT(ADSC);	//启动转换
;  while(!(ADCSR&(BIT(ADIF)))); //等待转换结束
	ldi R16,5
	ldi R17,0
	movw R18,R22
	xcall empy16s
	movw R22,R16
	lsr R23
	ror R22
	lsr R23
	ror R22
	.dbline 31
	clr R20
	clr R21
	xjmp L5
L2:
	.dbline 31
L3:
	.dbline 31
	subi R20,255  ; offset = 1
	sbci R21,255
L5:
	.dbline 31
;  addata=ADCL;
	cp R20,R22
	cpc R21,R23
	brlo L2
	.dbline -2
	.dbline 32
;  addata+=ADCH*256;
L1:
	xcall pop_gset2
	.dbline 0 ; func end
	ret
	.dbsym r i 20 i
	.dbsym r US 22 i
	.dbend
	.dbfunc e Delayms _Delayms fV
;              i -> R20,R21
;              j -> R22,R23
;             MS -> R16,R17
	.even
_Delayms::
	xcall push_gset2
	.dbline -1
	.dbline 40
;  return addata;
; }
; /*******************************************
; 函数名称: Num_BCD
; 功    能: 将一个字节的整数转换成三位BCD码
; 参    数: num--需要转换的整数
; 返回值  : chr--三位BCD码数组指针
; /********************************************/
	.dbline 42
; uchar* Num_BCD(uchar num)
; {
	clr R20
	clr R21
	xjmp L10
L7:
	.dbline 43
	clr R22
	clr R23
	xjmp L14
L11:
	.dbline 43
L12:
	.dbline 43
	subi R22,255  ; offset = 1
	sbci R23,255
L14:
	.dbline 43
	cpi R22,117
	ldi R30,4
	cpc R23,R30
	brlo L11
L8:
	.dbline 42
	subi R20,255  ; offset = 1
	sbci R21,255
L10:
	.dbline 42
	cp R20,R16
	cpc R21,R17
	brlo L7
	.dbline -2
	.dbline 44
;  uchar i,chr[3];	  
;  uchar *rept;
L6:
	xcall pop_gset2
	.dbline 0 ; func end
	ret
	.dbsym r i 20 i
	.dbsym r j 22 i
	.dbsym r MS 16 i
	.dbend
	.dbfunc e Board_init _Board_init fV
	.even
_Board_init::
	.dbline -1
	.dbline 52
;  rept=&(chr[0]);	  //返回指针指向BCD码数组
;  for(i=0;i<3;i++)
;  {
;   chr[2-i]=num%10;	  //对10取余数(其实是求模,但是对于正数,取余与求模是相等的)
;   num/=10;			  //除以10,为取出下一位做准备
;  }
;  return rept;		  //返回指针
; }
	.dbline 53
; /*******************************************
	ldi R24,255
	out 0x1a,R24
	.dbline 54
; 函数名称: main
	out 0x17,R24
	.dbline 55
; 功    能: 驱动MEGA16的AD,并在数码管上显示采集值
	out 0x14,R24
	.dbline 56
; 参    数: 无
	out 0x11,R24
	.dbline 58
; 返回值  : 无
; /********************************************/
	clr R2
	out 0xd,R2
	.dbline 60
; void main(void)
; {	 
	sbi 0x1b,6
	.dbline 61
; 	 uchar *adpt;						//定义一个接受返回指针的指针变量
	cbi 0x15,6
	.dbline 62
; 	 uchar i,ad0[3];					  
	cbi 0x1b,1
	.dbline 63
; 	 Board_init( );	  					//初始化开发板
	out 0x18,R24
	.dbline 64
; 	 while(1)
	sbi 0x1b,2
	.dbline 65
; 	 {
	ldi R16,5
	ldi R17,0
	xcall _Delayus
	.dbline 66
; 	  adpt=Num_BCD(Mega16_ad(0)/4);		//启动AD转换通道0,同时将数值转换成BCD码
	cbi 0x1b,2
	.dbline 68
; 	  for(i=0;i<3;i++)					//将转换后的BCD码存入显示数组
; 	  {
	clr R2
	out 0x18,R2
	.dbline 69
; 	   ad0[i]=*(adpt+i);
	sbi 0x1b,3
	.dbline 70
; 	  }
	ldi R16,50
	ldi R17,0
	xcall _Delayus
	.dbline 71
; 	  for(i=0;i<3;i++)					//显示转换的数值
	cbi 0x1b,3
	.dbline 73
; 	  {
; 	   One_smg_display(ad0[i],i+1);
	ldi R24,255
	out 0x18,R24
	.dbline 74
; 	   Delayms(2);	      
	sbi 0x1b,4
	.dbline 75
; 	  }
	ldi R16,50
	ldi R17,0
	xcall _Delayus
	.dbline 76
; 	 }
	cbi 0x1b,4
	.dbline 78
; }
; }
	ldi R24,255
	out 0x12,R24
	.dbline 79
; }
	sbi 0x1b,7
	.dbline 80
; }
	ldi R16,50
	ldi R17,0
	xcall _Delayus
	.dbline 81
; }
	cbi 0x1b,7
	.dbline -2
	.dbline 84
; }
; }
; }
L15:
	.dbline 0 ; func end
	ret
	.dbend
	.area code(ram, con, rel)
	.dbfile C:/icc/include/AVR_PQ1A.h
	.area lit(rom, con, rel)
_SEGMENT::
	.word 63
	.word 6
	.word 91
	.word 79
	.word 102
	.word 109
	.word 125
	.word 7
	.word 127
	.word 111
	.word 119
	.word 124
	.word 57
	.word 94
	.word 121
	.word 113
	.dbfile C:\icc\examples.avr\AVR_PQ1A_DEMO\9_AD/SMG.C
	.dbsym e SEGMENT _SEGMENT A[32:16]I
	.area text(rom, con, rel)
	.dbfile C:\icc\examples.avr\AVR_PQ1A_DEMO\9_AD/SMG.C
	.dbfunc e One_smg_display _One_smg_display fV
;         number -> R20
;           data -> R22
	.even
_One_smg_display::
	xcall push_gset2
	mov R20,R18
	mov R22,R16
	.dbline -1
	.dbline 25
	.dbline 26
	in R24,0x18
	ori R24,63
	out 0x18,R24
	.dbline 27
	sbi 0x1b,4
	.dbline 28
	ldi R16,50
	ldi R17,0
	xcall _Delayus
	.dbline 29
	cbi 0x1b,4
	.dbline 31
	ldi R24,2
	mul R24,R22
	movw R30,R0
	ldi R24,<_SEGMENT
	ldi R25,>_SEGMENT
	add R30,R24
	adc R31,R25
	lpm R0,Z+
	lpm R1,Z
	movw R30,R0
	out 0x18,R30
	.dbline 32
	sbi 0x1b,3
	.dbline 33
	ldi R16,50
	ldi R17,0
	xcall _Delayus
	.dbline 34
	cbi 0x1b,3
	.dbline 36
	mov R17,R20
	subi R17,1
	ldi R16,1
	xcall lsl8
	mov R20,R16
	com R20
	.dbline 37
	out 0x18,R20
	.dbline 38
	sbi 0x1b,4
	.dbline 39
	ldi R16,50
	ldi R17,0
	xcall _Delayus
	.dbline 40
	cbi 0x1b,4
	.dbline -2
	.dbline 41
L16:
	xcall pop_gset2
	.dbline 0 ; func end
	ret
	.dbsym r number 20 c
	.dbsym r data 22 c
	.dbend
	.dbfunc e All_smg_display _All_smg_display fV
;              i -> R20
;          pdata -> R22,R23
	.even
_All_smg_display::
	xcall push_gset2
	movw R22,R16
	.dbline -1
	.dbline 49
	.dbline 51
	clr R20
	xjmp L21
L18:
	.dbline 52
	.dbline 53
	mov R18,R20
	subi R18,255    ; addi 1
	mov R30,R20
	clr R31
	add R30,R22
	adc R31,R23
	ldd R16,z+0
	xcall _One_smg_display
	.dbline 54
	ldi R16,1
	ldi R17,0
	xcall _Delayms
	.dbline 55
L19:
	.dbline 51
	inc R20
L21:
	.dbline 51
	cpi R20,6
	brlo L18
	.dbline -2
	.dbline 56
L17:
	xcall pop_gset2
	.dbline 0 ; func end
	ret
	.dbsym r i 20 c
	.dbsym r pdata 22 pc
	.dbend
	.dbfunc e Cycle_smg_display _Cycle_smg_display fV
;              i -> R20
;              j -> R10
;          pdata -> R22,R23
	.even
_Cycle_smg_display::
	xcall push_gset3
	movw R22,R16
	.dbline -1
	.dbline 64
	.dbline 66
	clr R20
	xjmp L26
L23:
	.dbline 67
	.dbline 68
	clr R10
	xjmp L30
L27:
	.dbline 69
	.dbline 70
	mov R18,R10
	subi R18,255    ; addi 1
	ldi R24,40
	ldi R25,0
	mov R16,R20
	clr R17
	push R18
	push R19
	movw R18,R24
	xcall div16s
	movw R2,R16
	pop R19
	pop R18
	mov R4,R10
	clr R5
	add R2,R4
	adc R3,R5
	ldi R24,6
	ldi R25,0
	push R18
	push R19
	movw R18,R24
	movw R16,R2
	xcall mod16s
	movw R30,R16
	pop R19
	pop R18
	add R30,R22
	adc R31,R23
	ldd R16,z+0
	xcall _One_smg_display
	.dbline 71
	ldi R16,2000
	ldi R17,7
	xcall _Delayus
	.dbline 72
L28:
	.dbline 68
	inc R10
L30:
	.dbline 68
	mov R24,R10
	cpi R24,6
	brlo L27
	.dbline 73
L24:
	.dbline 66
	inc R20
L26:
	.dbline 66
	cpi R20,240
	brlo L23
	.dbline -2
	.dbline 74
L22:
	xcall pop_gset3
	.dbline 0 ; func end
	ret
	.dbsym r i 20 c
	.dbsym r j 10 c
	.dbsym r pdata 22 pc
	.dbend
	.dbfile C:\icc\examples.avr\AVR_PQ1A_DEMO\9_AD\MEGA16_AD.C
	.dbfunc e Mega16_ad _Mega16_ad fi
;         addata -> R20,R21
;            chl -> R20
	.even
_Mega16_ad::
	xcall push_gset1
	mov R20,R16
	.dbline -1
	.dbline 22
	.dbline 24
	in R24,0x1a
	andi R24,252
	out 0x1a,R24
	.dbline 25
	in R24,0x1b
	andi R24,252
	out 0x1b,R24
	.dbline 26
	clr R2
	out 0x7,R2
	.dbline 27
	in R2,0x7
	or R2,R20
	out 0x7,R2
	.dbline 28
	ldi R24,128
	out 0x6,R24
	.dbline 29
	sbi 0x6,6
L32:
	.dbline 30
L33:
	.dbline 30
	sbis 0x6,4
	rjmp L32
	.dbline 31
	in R20,0x4
	clr R21
	.dbline 32
	in R18,0x5
	clr R19
	ldi R16,256
	ldi R17,1
	xcall empy16s
	add R20,R16
	adc R21,R17
	.dbline 33
	mov R16,R20
	mov R17,R21
	.dbline -2
L31:
	xcall pop_gset1
	.dbline 0 ; func end
	ret
	.dbsym r addata 20 i
	.dbsym r chl 20 c
	.dbend
	.dbfunc e Num_BCD _Num_BCD fpc
;           rept -> R20,R21
;            chr -> y+0
;              i -> R22
;            num -> R10
	.even
_Num_BCD::
	xcall push_gset3
	mov R10,R16
	sbiw R28,3
	.dbline -1
	.dbline 42
	.dbline 45
	movw R20,R28
	.dbline 46
	clr R22
	xjmp L39
L36:
	.dbline 47
	.dbline 48
	mov R2,R22
	clr R3
	ldi R30,2
	ldi R31,0
	sub R30,R2
	sbc R31,R3
	movw R24,R28
	add R30,R24
	adc R31,R25
	ldi R17,10
	mov R16,R10
	xcall mod8u
	std z+0,R16
	.dbline 49
	ldi R17,10
	mov R16,R10
	xcall div8u
	mov R10,R16
	.dbline 50
L37:
	.dbline 46
	inc R22
L39:
	.dbline 46
	cpi R22,3
	brlo L36
	.dbline 51
	mov R16,R20
	mov R17,R21
	.dbline -2
L35:
	adiw R28,3
	xcall pop_gset3
	.dbline 0 ; func end
	ret
	.dbsym r rept 20 pc
	.dbsym l chr 0 A[3:3]c
	.dbsym r i 22 c
	.dbsym r num 10 c
	.dbend
	.dbfunc e main _main fV
;           adpt -> R20,R21
;            ad0 -> y+0
;              i -> R22
	.even
_main::
	sbiw R28,3
	.dbline -1
	.dbline 60
	.dbline 63
	xcall _Board_init
	xjmp L42
L41:
	.dbline 65
	.dbline 66
	clr R16
	xcall _Mega16_ad
	lsr R17
	ror R16
	lsr R17
	ror R16
	xcall _Num_BCD
	movw R20,R16
	.dbline 67
	clr R22
	xjmp L47
L44:
	.dbline 68
	.dbline 69
	mov R30,R22
	clr R31
	add R30,R20
	adc R31,R21
	ldd R2,z+0
	movw R24,R28
	mov R30,R22
	clr R31
	add R30,R24
	adc R31,R25
	std z+0,R2
	.dbline 70
L45:
	.dbline 67
	inc R22
L47:
	.dbline 67
	cpi R22,3
	brlo L44
	.dbline 71
	clr R22
	xjmp L51
L48:
	.dbline 72
	.dbline 73
	mov R18,R22
	subi R18,255    ; addi 1
	movw R24,R28
	mov R30,R22
	clr R31
	add R30,R24
	adc R31,R25
	ldd R16,z+0
	xcall _One_smg_display
	.dbline 74
	ldi R16,2
	ldi R17,0
	xcall _Delayms
	.dbline 75
L49:
	.dbline 71
	inc R22
L51:
	.dbline 71
	cpi R22,3
	brlo L48
	.dbline 76
L42:
	.dbline 64
	xjmp L41
X0:
	.dbline -2
	.dbline 77
L40:
	adiw R28,3
	.dbline 0 ; func end
	ret
	.dbsym r adpt 20 pc
	.dbsym l ad0 0 A[3:3]c
	.dbsym r i 22 c
	.dbend

⌨️ 快捷键说明

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