ADC采用中斷方式呀
我一開始沒有認真看,還以為你是采用ADC中斷模式
ADC采用中斷模式,128次ADC累加后,取平均值就行,我試過,去不去掉這個最大和最小值,對于結果影響并不大,可以說是沒啥效果以下是我STC8G的ADC,你參考一下
/*stc8g系列單片機ADC程序*/
#include "Stc8g.h"
#include "Stc8g_Adc.h"
#define ADC_P10 0x80
#define ADC_P11 0x81
#define ADC_P12 0x82
#define ADC_P13 0x83
#define ADC_P14 0x84
#define ADC_P15 0x85
#define ADC_P16 0x86
#define ADC_P17 0x87
#define ADC_P1f 0x8f
#define ADC_COUNT 128
/*需要在主程序使用以下變量,可以在變量聲明前加上 extern 來聲明,就可以直接調用了*/
//──────────────────────────────────────────────────────────────────────────────────
unsigned char ADC_LINE; //ADC通道記錄
unsigned long int ADC_AN7; //ADC0數據
unsigned long int ADC_ANf; //ADCf數據
//──────────────────────────────────────────────────────────────────────────────────
void Stc8g_Adc_int()//stc8gadc初始化
{
unsigned int i;
P1M0=0;
P1M1=0x80; //p1.7用作ADC端口
ADC_CONTR=0x80;//打開adc電源
ADCCFG=0x2f; //設定ADC轉換結果保存格式
for(i=10000;i>0;i--); //延時
ADC_LINE=ADC_P1f;
ADC_CONTR=ADC_CONTR|0x40; //啟動ADC
EADC=1;
}
//──────────────────────────────────────────────────────────────────────────────────
void Adc_Isr() interrupt 5 //Adc中斷函數
{
static unsigned char count7; //ADC通道6轉換次數記錄
static unsigned char countf; //ADC通道f轉換次數記錄,內部參考電壓通道
static unsigned long int ADC_DATA7; //ADC0數據,累加
static unsigned long int ADC_DATAf; //ADCf數據,累加
ADC_CONTR=ADC_CONTR&0xdf; //清除中斷標志位
//──────────────────────────────────────────────────────────────────────────
if(ADC_LINE==ADC_P1f) //檢測觸發ADC中斷的通道
{
if(countf>=ADC_COUNT) //檢測ADC轉換次數
{
ADC_ANf=ADC_DATAf/ADC_COUNT; //取平均值
ADC_DATAf=0x00; //清除ADC累加結果
countf=0x00; //清除ADC轉換次數記錄
}
ADC_DATAf+=ADC_RES*256+ADC_RESL; //ADC結果累加
countf++;
ADC_CONTR=ADC_LINE=ADC_P17; //選擇下一個ADC通道
}
//──────────────────────────────────────────────────────────────────────────
else if(ADC_LINE==ADC_P17)
{
if(count7>=ADC_COUNT)
{
ADC_AN7=ADC_DATA7/ADC_COUNT;
ADC_DATA7=0x00;
count7=0x00;
}
ADC_DATA7+=ADC_RES*256+ADC_RESL;
count7++;
ADC_CONTR=ADC_LINE=ADC_P1f;
}
//──────────────────────────────────────────────────────────────────────────
ADC_CONTR=ADC_CONTR|0x40; //啟動ADC
}
|