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

📄 adc.c

📁 采用Mega16+VS1011B+SD卡制作的Mp3
💻 C
字号:
//*********************************************
 //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的休眠模式
{
   //关闭看门狗:
   WDTCR=BIT(WDTOE)|BIT(WDE);
   WDTCR=0;
   if (iMode<=6)
   {
       //设置CPU的休眠模式
   	   MCUCR|=(iMode&0x70);
   	   //CPU的休眠
   	   MCUCR|=BIT(SE);
   	   asm("sleep");
   	   ;;
   }
}

//ADC初始化函数
void ADC_Init(void)
{
	DDRA&=~BIT(3);    		//端口A设置为高阻态
	PORTA&=~BIT(3);
	
	ADCSRA=0x00;
	ADMUX=BIT(REFS0)|(3&0x0f);  //选择内部AVcc为基准,ADC数据左对齐
	ACSR=BIT(ACD);  //关闭模拟比较器
	ADCSRA=BIT(ADEN)|BIT(ADPS2)|BIT(ADPS1); //CLK64分频,不产生ADC中断
}

//ADC转换处理函数:
unsigned char ADC_Convert(void)
{
 	unsigned int adc_reslt=0;   //AD转换结果
	unsigned char rslt,i;
	ADCSRA|=BIT(ADSC);        //启动AD转换
	while(!(ADCSRA & BIT(ADIF))) ; //等待AD转换完毕
	adc_reslt=ADC&0x03FF;  	  //保存ADC结果
	//测试使用,显示adc_reslt:
	//DisplayLong(adc_reslt,5);
	//Delay(500);
	//对ADC结果进行处理
	if (adc_reslt<=VolMin) //电量为空/不足
   	   rslt=0;         
	else  if (adc_reslt>=VolMax)  //电量为满
   	   rslt=14;     
	else            //[其它介于0~13的情况]
   	   rslt=(((adc_reslt-VolMin)*14)/(VolMax-VolMin));
	ADCSRA|=BIT(ADIF);    //ADIF位写入1,清零
	ADCSRA&=~BIT(ADEN);	  //禁止ADC
	return rslt; 
}

⌨️ 快捷键说明

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