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

📄 ad.s

📁 嵌入式单片机控制温度传感的无线收发方案!
💻 S
📖 第 1 页 / 共 2 页
字号:
	.module ad.c
	.area text(rom, con, rel)
	.dbfile E:\公司用\atmega8l\final\nrf905_send1\ad.c
	.dbfunc e AdcConvertStd _AdcConvertStd fi
;      min_value -> R14
;      max_value -> R20
;         min_id -> R12
;         max_id -> R10
;            ret -> y+0
;              i -> R22
	.even
_AdcConvertStd::
	rcall push_gset5
	sbiw R28,2
	.dbline -1
	.dbline 19
; 
; /********************************
;   ATMega8 查询方式 A/D转换测试程序
;   文件名:main.c
;   编译:WinAVR-20070122
; 
;             外部4MHz晶振
; *******************************/
; 
; #include "confg.h"
; 
; #define _BV(n) (1<<n)
; 
; static unsigned int g_aAdValue[8];  //A/D转换缓冲区
; 
; 
; //AD转换8次去掉最高和最低后取平均值返回
; unsigned int AdcConvertStd(void)
; {
	.dbline 24
;   char i;
;   unsigned int  ret;
;   char max_id,min_id,max_value,min_value;
;   
;   ADMUX=0X45;//参考电压VCC
	ldi R24,69
	out 0x7,R24
	.dbline 25
;   ADCSRA=_BV(ADEN);//使能ADC,单次转换模式
	ldi R24,128
	out 0x6,R24
	.dbline 27
;   //连续转换8次
;   for(i=0;i<8;i++)
	clr R22
	rjmp L5
L2:
	.dbline 28
;   {
	.dbline 29
;     ADCSRA|=_BV(ADSC);
	sbi 0x6,6
	.dbline 30
;     delay_us(30);
	ldi R16,30
	ldi R17,0
	rcall _delay_us
	rjmp L7
L6:
	.dbline 32
	ldi R16,30
	ldi R17,0
	rcall _delay_us
L7:
	.dbline 31
	sbic 0x6,6
	rjmp L6
	.dbline 33
	in R2,0x4
	clr R3
	std y+1,R3
	std y+0,R2
	.dbline 34
	in R2,0x5
	clr R3
	mov R3,R2
	clr R2
	ldd R0,y+0
	ldd R1,y+1
	or R0,R2
	or R1,R3
	std y+1,R1
	std y+0,R0
	.dbline 35
	ldi R24,2
	mul R24,R22
	movw R30,R0
	ldi R24,<_g_aAdValue
	ldi R25,>_g_aAdValue
	add R30,R24
	adc R31,R25
	ldd R0,y+0
	ldd R1,y+1
	std z+1,R1
	std z+0,R0
	.dbline 36
L3:
	.dbline 27
	inc R22
L5:
	.dbline 27
	cpi R22,8
	brlo L2
	.dbline 37
;     while(ADCSRA&_BV(ADSC))
;     delay_us(30);
;     ret=ADCL;
;     ret|=(unsigned int)(ADCH<<8);
;     g_aAdValue[i]=ret;
;   }
;   ret=0;
	clr R0
	clr R1
	std y+1,R1
	std y+0,R0
	.dbline 38
;   for(i=1;i<8;i++)
	ldi R22,1
	rjmp L12
L9:
	.dbline 39
	ldi R24,2
	mul R24,R22
	movw R30,R0
	ldi R24,<_g_aAdValue
	ldi R25,>_g_aAdValue
	add R30,R24
	adc R31,R25
	ldd R2,z+0
	ldd R3,z+1
	ldd R0,y+0
	ldd R1,y+1
	add R0,R2
	adc R1,R3
	std y+1,R1
	std y+0,R0
L10:
	.dbline 38
	inc R22
L12:
	.dbline 38
	cpi R22,8
	brlo L9
	.dbline 42
;     ret+=g_aAdValue[i];
;   
;   //找到最大和最小值索引  
;   ret/=7;
	ldi R18,7
	ldi R19,0
	ldd R16,y+0
	ldd R17,y+1
	rcall div16u
	std y+1,R17
	std y+0,R16
	.dbline 43
;   max_id=min_id=1;
	clr R12
	inc R12
	clr R10
	inc R10
	.dbline 44
;   max_value=min_value=0;
	clr R14
	clr R20
	.dbline 45
;   for(i=1;i<8;i++)
	ldi R22,1
	rjmp L16
L13:
	.dbline 46
;   {
	.dbline 47
;     if(g_aAdValue[i]>ret)
	ldi R24,2
	mul R24,R22
	movw R30,R0
	ldi R24,<_g_aAdValue
	ldi R25,>_g_aAdValue
	add R30,R24
	adc R31,R25
	ldd R2,z+0
	ldd R3,z+1
	ldd R0,y+0
	ldd R1,y+1
	cp R0,R2
	cpc R1,R3
	brsh L17
	.dbline 48
;     {
	.dbline 49
;       if(g_aAdValue[i]-ret>max_value)
	ldi R24,2
	mul R24,R22
	movw R30,R0
	ldi R24,<_g_aAdValue
	ldi R25,>_g_aAdValue
	add R30,R24
	adc R31,R25
	ldd R2,z+0
	ldd R3,z+1
	ldd R0,y+0
	ldd R1,y+1
	sub R2,R0
	sbc R3,R1
	mov R4,R20
	clr R5
	cp R4,R2
	cpc R5,R3
	brsh L18
	.dbline 50
;       {
	.dbline 51
;         max_value=g_aAdValue[i]-ret;
	ldi R24,2
	mul R24,R22
	movw R30,R0
	ldi R24,<_g_aAdValue
	ldi R25,>_g_aAdValue
	add R30,R24
	adc R31,R25
	ldd R20,z+0
	ldd R0,y+0
	ldd R1,y+1
	sub R20,R0
	sbc R21,R1
	.dbline 52
;         max_id=i;
	mov R10,R22
	.dbline 53
;       }
	.dbline 54
;     }
	rjmp L18
L17:
	.dbline 56
;     else
;     {
	.dbline 57
;       if(ret-g_aAdValue[i]>min_value)
	ldi R24,2
	mul R24,R22
	movw R30,R0
	ldi R24,<_g_aAdValue
	ldi R25,>_g_aAdValue
	add R30,R24
	adc R31,R25
	ldd R2,z+0
	ldd R3,z+1
	ldd R4,y+0
	ldd R5,y+1
	sub R4,R2
	sbc R5,R3
	mov R2,R14
	clr R3
	cp R2,R4
	cpc R3,R5
	brsh L21
	.dbline 58
;       {
	.dbline 59
;         min_value=ret-g_aAdValue[i];
	ldi R24,2
	mul R24,R22
	movw R30,R0
	ldi R24,<_g_aAdValue
	ldi R25,>_g_aAdValue
	add R30,R24
	adc R31,R25
	ldd R2,z+0
	ldd R3,z+1
	ldd R14,y+0
	ldd R15,y+1
	sub R14,R2
	sbc R15,R3
	.dbline 60
;         min_id=i;
	mov R12,R22
	.dbline 61
;       }
L21:
	.dbline 62
;     }
L18:
	.dbline 63
L14:
	.dbline 45
	inc R22
L16:
	.dbline 45
	cpi R22,8
	brsh X0
	rjmp L13
X0:
	.dbline 66
;   }
;   
;   //去掉第一个和最大最小值后的平均值
;   ret=0;
	clr R0
	clr R1
	std y+1,R1
	std y+0,R0
	.dbline 67
;   for(i=1;i<8;i++)
	ldi R22,1
	rjmp L26
L23:
	.dbline 68
;   {
	.dbline 69
;     if((i!=min_id)&&(i!=max_id))
	cp R22,R12
	breq L27
	cp R22,R10
	breq L27
	.dbline 70
;       ret+=g_aAdValue[i];     
	ldi R24,2
	mul R24,R22
	movw R30,R0
	ldi R24,<_g_aAdValue
	ldi R25,>_g_aAdValue
	add R30,R24
	adc R31,R25
	ldd R2,z+0
	ldd R3,z+1
	ldd R0,y+0
	ldd R1,y+1
	add R0,R2
	adc R1,R3
	std y+1,R1
	std y+0,R0
L27:
	.dbline 71
L24:
	.dbline 67
	inc R22
L26:
	.dbline 67
	cpi R22,8
	brlo L23
	.dbline 72
;   }
;   if(min_id!=max_id)
	cp R12,R10
	breq L29
	.dbline 73
;     ret/=5;
	ldi R18,5
	ldi R19,0
	ldd R16,y+0
	ldd R17,y+1
	rcall div16u
	std y+1,R17
	std y+0,R16
	rjmp L30
L29:
	.dbline 75
;   else  
;     ret/=6;
	ldi R18,6
	ldi R19,0
	ldd R16,y+0
	ldd R17,y+1
	rcall div16u
	std y+1,R17
	std y+0,R16
L30:
	.dbline 77
; 
;   ADCSRA=0;//关闭ADC
	clr R2
	out 0x6,R2
	.dbline 79
;   
;   return ret;
	ldd R16,y+0
	ldd R17,y+1
	.dbline -2
L1:
	adiw R28,2
	rcall pop_gset5
	.dbline 0 ; func end
	ret
	.dbsym r min_value 14 c
	.dbsym r max_value 20 c
	.dbsym r min_id 12 c
	.dbsym r max_id 10 c
	.dbsym l ret 0 i
	.dbsym r i 22 c
	.dbend
	.dbfunc e adinit _adinit fV
	.even
_adinit::
	.dbline -1
	.dbline 82
; }
; void adinit()
; { 
	.dbline 87
;   //ad转换相关的寄存器的初始化
;       //ACSR=0x80; //别忘了关掉模拟比较器的电源哦
;      // SFIOR=0x00;
;    //IO初始化
;       DDRB|=_BV(DDB0);
	sbi 0x17,0
	.dbline 88
;       PORTB|=~_BV(PB0);
	in R24,0x18
	ori R24,254
	out 0x18,R24
	.dbline -2
	.dbline 93
;    //ad转换相关的寄存器的初始化
;      // ACSR=0x80; //别忘了关掉模拟比较器的电源哦
;     //  SFIOR=0x00;
; 
; }
L31:
	.dbline 0 ; func end
	ret
	.dbend
	.dbfunc e AdcConvertDin _AdcConvertDin fi
;      min_value -> R14
;      max_value -> R20
;         min_id -> R12
;         max_id -> R10
;            ret -> y+0
;              i -> R22
	.even
_AdcConvertDin::
	rcall push_gset5
	sbiw R28,2
	.dbline -1
	.dbline 98
; 
; 
; //AD转换8次去掉最高和最低后取平均值返回
; unsigned int AdcConvertDin(void)
; {
	.dbline 103
;   char i;
;   unsigned int  ret;
;   char max_id,min_id,max_value,min_value;
;   
;   ADMUX=0X44;//参考电压VCC
	ldi R24,68
	out 0x7,R24
	.dbline 104
;   ADCSRA=_BV(ADEN);//使能ADC,单次转换模式
	ldi R24,128
	out 0x6,R24
	.dbline 107
;   
;   //连续转换8次
;   for(i=0;i<8;i++)
	clr R22
	rjmp L36
L33:
	.dbline 108
;   {
	.dbline 109
;     ADCSRA|=_BV(ADSC);
	sbi 0x6,6
	.dbline 110
;     delay_us(30);
	ldi R16,30
	ldi R17,0
	rcall _delay_us
	rjmp L38
L37:
	.dbline 112
	ldi R16,30
	ldi R17,0
	rcall _delay_us
L38:
	.dbline 111
	sbic 0x6,6
	rjmp L37
	.dbline 113
	in R2,0x4
	clr R3
	std y+1,R3
	std y+0,R2
	.dbline 114
	in R2,0x5
	clr R3
	mov R3,R2
	clr R2
	ldd R0,y+0
	ldd R1,y+1
	or R0,R2
	or R1,R3
	std y+1,R1
	std y+0,R0
	.dbline 115
	ldi R24,2
	mul R24,R22
	movw R30,R0
	ldi R24,<_g_aAdValue
	ldi R25,>_g_aAdValue
	add R30,R24
	adc R31,R25
	ldd R0,y+0
	ldd R1,y+1
	std z+1,R1
	std z+0,R0
	.dbline 116
L34:
	.dbline 107
	inc R22
L36:
	.dbline 107
	cpi R22,8
	brlo L33
	.dbline 117
;     while(ADCSRA&_BV(ADSC))
;     delay_us(30);
;     ret=ADCL;
;     ret|=(unsigned int)(ADCH<<8);
;     g_aAdValue[i]=ret;
;   }
;   ret=0;
	clr R0
	clr R1
	std y+1,R1
	std y+0,R0
	.dbline 118
;   for(i=1;i<8;i++)
	ldi R22,1
	rjmp L43
L40:
	.dbline 119
	ldi R24,2
	mul R24,R22
	movw R30,R0
	ldi R24,<_g_aAdValue
	ldi R25,>_g_aAdValue
	add R30,R24
	adc R31,R25
	ldd R2,z+0
	ldd R3,z+1
	ldd R0,y+0
	ldd R1,y+1
	add R0,R2
	adc R1,R3
	std y+1,R1
	std y+0,R0
L41:
	.dbline 118
	inc R22
L43:
	.dbline 118
	cpi R22,8
	brlo L40
	.dbline 122
;     ret+=g_aAdValue[i];
;   
;   //找到最大和最小值索引  
;   ret/=7;
	ldi R18,7
	ldi R19,0
	ldd R16,y+0
	ldd R17,y+1
	rcall div16u
	std y+1,R17
	std y+0,R16
	.dbline 123
;   max_id=min_id=1;
	clr R12
	inc R12
	clr R10
	inc R10
	.dbline 124
;   max_value=min_value=0;
	clr R14
	clr R20
	.dbline 125
;   for(i=1;i<8;i++)
	ldi R22,1
	rjmp L47
L44:
	.dbline 126
;   {
	.dbline 127
;     if(g_aAdValue[i]>ret)
	ldi R24,2
	mul R24,R22
	movw R30,R0
	ldi R24,<_g_aAdValue
	ldi R25,>_g_aAdValue
	add R30,R24
	adc R31,R25
	ldd R2,z+0
	ldd R3,z+1
	ldd R0,y+0
	ldd R1,y+1
	cp R0,R2
	cpc R1,R3
	brsh L48
	.dbline 128
;     {
	.dbline 129
;       if(g_aAdValue[i]-ret>max_value)
	ldi R24,2
	mul R24,R22
	movw R30,R0
	ldi R24,<_g_aAdValue
	ldi R25,>_g_aAdValue
	add R30,R24
	adc R31,R25
	ldd R2,z+0
	ldd R3,z+1
	ldd R0,y+0
	ldd R1,y+1
	sub R2,R0
	sbc R3,R1
	mov R4,R20
	clr R5
	cp R4,R2
	cpc R5,R3
	brsh L49
	.dbline 130
;       {
	.dbline 131
;         max_value=g_aAdValue[i]-ret;
	ldi R24,2
	mul R24,R22
	movw R30,R0
	ldi R24,<_g_aAdValue
	ldi R25,>_g_aAdValue
	add R30,R24
	adc R31,R25
	ldd R20,z+0
	ldd R0,y+0
	ldd R1,y+1
	sub R20,R0
	sbc R21,R1
	.dbline 132
;         max_id=i;
	mov R10,R22
	.dbline 133
;       }
	.dbline 134
;     }
	rjmp L49
L48:
	.dbline 136
;     else
;     {
	.dbline 137
;       if(ret-g_aAdValue[i]>min_value)
	ldi R24,2
	mul R24,R22
	movw R30,R0
	ldi R24,<_g_aAdValue
	ldi R25,>_g_aAdValue
	add R30,R24
	adc R31,R25
	ldd R2,z+0
	ldd R3,z+1
	ldd R4,y+0
	ldd R5,y+1
	sub R4,R2
	sbc R5,R3
	mov R2,R14
	clr R3
	cp R2,R4
	cpc R3,R5
	brsh L52
	.dbline 138
;       {
	.dbline 139
;         min_value=ret-g_aAdValue[i];
	ldi R24,2
	mul R24,R22
	movw R30,R0
	ldi R24,<_g_aAdValue
	ldi R25,>_g_aAdValue
	add R30,R24
	adc R31,R25
	ldd R2,z+0
	ldd R3,z+1
	ldd R14,y+0
	ldd R15,y+1
	sub R14,R2
	sbc R15,R3
	.dbline 140
;         min_id=i;
	mov R12,R22
	.dbline 141
;       }
L52:
	.dbline 142
;     }
L49:
	.dbline 143
L45:
	.dbline 125
	inc R22
L47:
	.dbline 125
	cpi R22,8
	brsh X1
	rjmp L44
X1:
	.dbline 146
;   }
;   
;   //去掉第一个和最大最小值后的平均值
;   ret=0;
	clr R0
	clr R1
	std y+1,R1
	std y+0,R0
	.dbline 147
;   for(i=1;i<8;i++)
	ldi R22,1
	rjmp L57
L54:
	.dbline 148
;   {
	.dbline 149
;     if((i!=min_id)&&(i!=max_id))
	cp R22,R12
	breq L58
	cp R22,R10
	breq L58
	.dbline 150
;       ret+=g_aAdValue[i];     
	ldi R24,2
	mul R24,R22
	movw R30,R0
	ldi R24,<_g_aAdValue
	ldi R25,>_g_aAdValue
	add R30,R24
	adc R31,R25
	ldd R2,z+0
	ldd R3,z+1
	ldd R0,y+0
	ldd R1,y+1
	add R0,R2
	adc R1,R3
	std y+1,R1
	std y+0,R0
L58:
	.dbline 151
L55:
	.dbline 147
	inc R22
L57:
	.dbline 147
	cpi R22,8
	brlo L54
	.dbline 152
;   }
;   if(min_id!=max_id)
	cp R12,R10
	breq L60
	.dbline 153
;     ret/=5;
	ldi R18,5
	ldi R19,0
	ldd R16,y+0
	ldd R17,y+1
	rcall div16u
	std y+1,R17
	std y+0,R16
	rjmp L61
L60:
	.dbline 155
;   else  
;     ret/=6;
	ldi R18,6
	ldi R19,0
	ldd R16,y+0
	ldd R17,y+1
	rcall div16u
	std y+1,R17
	std y+0,R16
L61:
	.dbline 157
; 
;   ADCSRA=0;//关闭ADC
	clr R2
	out 0x6,R2
	.dbline 159
;   
;   return ret;
	ldd R16,y+0
	ldd R17,y+1
	.dbline -2
L32:
	adiw R28,2
	rcall pop_gset5

⌨️ 快捷键说明

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