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
}
|