?? 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 + -