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

📄 adc.s

📁 采用Mega16+VS1011B+SD卡制作的Mp3
💻 S
字号:
	.module ADC.C
	.area text(rom, con, rel)
	.dbfile D:\学习\AVRpro\Mega16程序\TestLCD\ADC.C
	.dbfunc e MCUMode _MCUMode fV
;          iMode -> R16
	.even
_MCUMode::
	.dbline -1
	.dbline 22
; //*********************************************
;  //ADC转换
;  //MCU:AVR_MEGA16L ,晶振频率:8.0 MHz
;  //ADC通道:ADC3,PA3,采用软件方式
;  //制作人:平顶山工学院计算机系,郭猛
; //**********************************************
; 
; #include "iom16v.h"
; #include "macros.h"
; #include "LCDFun.h"
; #include "VS1011B.h"
; #include "mmc.h"
; 
; #define Vref 330   //参考电压为3.3V
; #define VolMax 651 //电池电量满,4.2V/2=2.1,对应ADC结果为0x3ff*(2.1/3.3)=651
; #define VolMin 520 //电池电量空,3.3V/2=1.65V,对应ADC结果为0x3ff*(1.65/3.3)=512
; #define ADC_MUX 0x03  //ADC通道(注意将下面的ADC_MUX改为3)
; 
; extern void DisplayLong(unsigned long ll,unsigned char line);
; 
; void MCUMode(uchar iMode)		 //设置CPU的休眠模式
; {
	.dbline 24
;    //关闭看门狗:
;    WDTCR=BIT(WDTOE)|BIT(WDE);
	ldi R24,24
	out 0x21,R24
	.dbline 25
;    WDTCR=0;
	clr R2
	out 0x21,R2
	.dbline 26
;    if (iMode<=6)
	ldi R24,6
	cp R24,R16
	brlo L2
X0:
	.dbline 27
;    {
	.dbline 29
;        //设置CPU的休眠模式
;    	   MCUCR|=(iMode&0x70);
	mov R24,R16
	andi R24,112
	in R2,0x35
	or R2,R24
	out 0x35,R2
	.dbline 31
;    	   //CPU的休眠
;    	   MCUCR|=BIT(SE);
	in R24,0x35
	ori R24,64
	out 0x35,R24
	.dbline 32
;    	   asm("sleep");
	sleep
	.dbline 33
;    	   ;;
	.dbline 33
	.dbline 34
;    }
L2:
	.dbline -2
L1:
	.dbline 0 ; func end
	ret
	.dbsym r iMode 16 c
	.dbend
	.dbfunc e ADC_Init _ADC_Init fV
	.even
_ADC_Init::
	.dbline -1
	.dbline 39
; }
; 
; //ADC初始化函数
; void ADC_Init(void)
; {
	.dbline 40
; 	DDRA&=~BIT(3);    		//端口A设置为高阻态
	cbi 0x1a,3
	.dbline 41
; 	PORTA&=~BIT(3);
	cbi 0x1b,3
	.dbline 43
; 	
; 	ADCSRA=0x00;
	clr R2
	out 0x6,R2
	.dbline 44
; 	ADMUX=BIT(REFS0)|(3&0x0f);  //选择内部AVcc为基准,ADC数据左对齐
	ldi R24,67
	out 0x7,R24
	.dbline 45
; 	ACSR=BIT(ACD);  //关闭模拟比较器
	ldi R24,128
	out 0x8,R24
	.dbline 46
; 	ADCSRA=BIT(ADEN)|BIT(ADPS2)|BIT(ADPS1); //CLK64分频,不产生ADC中断
	ldi R24,134
	out 0x6,R24
	.dbline -2
L4:
	.dbline 0 ; func end
	ret
	.dbend
	.dbfunc e ADC_Convert _ADC_Convert fc
;              i -> <dead>
;           rslt -> R20
;      adc_reslt -> R22,R23
	.even
_ADC_Convert::
	xcall push_xgsetF000
	.dbline -1
	.dbline 51
; }
; 
; //ADC转换处理函数:
; unsigned char ADC_Convert(void)
; {
	.dbline 52
;  	unsigned int adc_reslt=0;   //AD转换结果
	clr R22
	clr R23
	.dbline 54
; 	unsigned char rslt,i;
; 	ADCSRA|=BIT(ADSC);        //启动AD转换
	sbi 0x6,6
L6:
	.dbline 55
; 	while(!(ADCSRA & BIT(ADIF))) ; //等待AD转换完毕
L7:
	.dbline 55
	sbis 0x6,4
	rjmp L6
X1:
	.dbline 56
; 	adc_reslt=ADC&0x03FF;  	  //保存ADC结果
	in R22,0x4
	in R23,0x5
	andi R23,3
	.dbline 61
; 	//测试使用,显示adc_reslt:
; 	//DisplayLong(adc_reslt,5);
; 	//Delay(500);
; 	//对ADC结果进行处理
; 	if (adc_reslt<=VolMin) //电量为空/不足
	ldi R24,520
	ldi R25,2
	cp R24,R22
	cpc R25,R23
	brlo L9
X2:
	.dbline 62
;    	   rslt=0;         
	clr R20
	xjmp L10
L9:
	.dbline 63
; 	else  if (adc_reslt>=VolMax)  //电量为满
	cpi R22,139
	ldi R30,2
	cpc R23,R30
	brlo L11
X3:
	.dbline 64
;    	   rslt=14;     
	ldi R20,14
	xjmp L12
L11:
	.dbline 66
; 	else            //[其它介于0~13的情况]
;    	   rslt=(((adc_reslt-VolMin)*14)/(VolMax-VolMin));
	movw R18,R22
	subi R18,8
	sbci R19,2
	ldi R16,14
	ldi R17,0
	xcall empy16s
	ldi R18,131
	ldi R19,0
	xcall div16u
	mov R20,R16
L12:
L10:
	.dbline 67
; 	ADCSRA|=BIT(ADIF);    //ADIF位写入1,清零
	sbi 0x6,4
	.dbline 68
; 	ADCSRA&=~BIT(ADEN);	  //禁止ADC
	cbi 0x6,7
	.dbline 69
; 	return rslt; 
	mov R16,R20
	.dbline -2
L5:
	.dbline 0 ; func end
	xjmp pop_xgsetF000
	.dbsym l i 1 c
	.dbsym r rslt 20 c
	.dbsym r adc_reslt 22 i
	.dbend
; }

⌨️ 快捷键说明

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