给你一个#define JL_OUT GPIO1 //低电压电位保护
#define JH_OUT GPIO2 //高电压电位保护
#define MAX_REF (5000) //5.00v
#define MAX_UK (10) //变比系数10最大测量范围
/*-----------------------------------------------------------
//ADCON0 ADFM VCFG - - CHS1 CHS0 GO/DONE ADON 00-- 0000 58,83
ADFM: A/D 结果格式选择位
1 = 右对齐
0 = 左对齐
//ch=输入的ADC的通道 B0000_1111
--------------------------------------------------------------*/
void ADC_Init(unsigned char ch){
ANSEL =B0111_0000 | ch; //使用内部特殊RC=500K
CMCON =B0000_0111; //Cout在内部,V-=Cin-
TRISIO =B0000_1000 | ch; //必须采用或处理
if(ch & B0000_1000) TRISIO |=B0001_0000; //CH4=ENABLED
}
//-----------------------------------------------------------
//ADC采集开始
unsigned int ADC(unsigned char channel){ //AD转换.
const unsigned char ADCNok[]={
B1000_0001,B1000_0101,B1000_1001,B1000_1101,
};
while(GODONE); //等待转换完成.查询方式.
ADCON0=ADCNok[channel];
GODONE=1; //开启转换过程.
while(GODONE); //等待转换完成.查询方式.
return (ADRESH<<8 | ADRESL);
}
//*******************************************************
//电压检测
void Get_U_Value(void){
#define ADC_MAX_CNT 8
static unsigned short buf[ADC_MAX_CNT];
static unsigned char cnt=0;
unsigned long u;
unsigned char i;
buf[cnt++]=ADC(0);
if(cnt>=ADC_MAX_CNT) cnt=0;
//**********************************
//滑动滤波
u=0;
for(i=0;i<ADC_MAX_CNT;i++) u +=buf[i];
u /=ADC_MAX_CNT;
u =u*MAX_REF/1024;
u *=MAX_UK;//得到电压值
Current_U=u;
}:
|