📄 adc.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 + -