|
电池单节设定2.9V~3.70V超范围关MOS 管,双节电压5.8V~7.4V超范围关MOS 管。
电压采集比较费劲,差分放大分别测量单体电池电压,最后串联采集电压。
芯片用PIC16F676 10位AD转换。
c程序
/*
**********/
#include<pic.h>
__CONFIG(0X3BB1);
#define uchar unsigned char
#define uint unsigned int
void Delay_ms(uint xms);
//void Compare(int x);
void timer1_init();
void port_init();
void caiji (void );
void didi_n(uint k);
#define LED RC3
#define K RC4
//int SDZ=96;//382 //设定值
//uchar FW =24;// 96 //范围
uchar counter=0;
uchar con1=0;
uchar con2=0;
uchar con3=0;
char F=0;
char W1=0;
char W2=0;
char W3=0;
char a1=0;
char a2=0;
char a3=0;
//uchar a4=0;
//uchar const seg_data[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x00};
//{0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff};//共阳极
/************短延时函数******************/
/*******DIDI*******/
void didi_n(uint k)
{
TRISC&=0xfe;
char m;
for(m=k;m>0;m--)
{
RC1=1;
Delay_ms(300);
RC1=0;
Delay_ms(200);
}
}
/****************************/
/************延时函数******************/
void Delay_ms(uint xms)
{
int i,j;
for(i=0;i<xms;i++)
{
for(j=0;j<71;j++);}
}
/**********数制转换函数*********/
void conv(int x)
{
float temp;
//temp=x*5.0/255;
temp=(x*5.0/1023);
}
/*********显示函数**********/
void timer1_init()
{
GIE=1;
PEIE=1;
T1CKPS0=1;T1CKPS1=1; //1:8
TMR1CS=0;
TMR1IE=1;
TMR1ON=1;
TMR1GE=0;
T1OSCEN=1;
TMR1H=0xfb;
TMR1L=0x1e;
}
/************T0**********/
void interrupt ISR(void)
{
if(TMR1IF==1)
{
//TMR1GE=0;
TMR1IF=0;
TMR1H=0xfb;
TMR1L=0x1e;
if(++counter>=200)
{
// LED=~LED;
F=1;
counter=0;
}
}
}
/************port_init**********/
void port_init()
{
PORTA=0XF0;
TRISA=0XFF;
ANSEL=0X07;
TRISC=0X00;
PORTC=0X00;
// ADCON0=0X41;
}
/*************主函数***********/
void main()
{
port_init();
LED=1;
K=0;
Delay_ms(500);
LED=0;
Delay_ms(500);
didi_n(5);
timer1_init();
//caiji ( );
while(1)
{
caiji ( );
if(F==1)
{
F=0;
LED=1;
Delay_ms(100);
if(++con1>=2)
{
// LED=~LED;
W1=1;
con1=0;
}
if(++con2>=4)
{
// LED=~LED;
W2=1;
con2=0;
W1=0;
}
}
if(++con3>=6)
{
// LED=~LED;
W3=1;
con3=0;
W1=0;
W2=0;
}
else LED=0;
if(((a1==1)&&(a2==1))&&(a3==1))
{ K=1;RC2=1;}
else
{
K=0;
RC2=0;
}
/**************
if(K==0)
{
Delay_ms(20);
if(++a4>200)
didi_n(2);
}
*****************/
}
}
/******************************/
void caiji (void )
{
if(W1==1)
{
int result=0x00;
W1=0;
ADCON1=0X10;//8分频
ADCON0=0X81;//A0通道,右对齐,内部参考电压
char i;
result=0x00; //转换结果清零
for(i=3;i>0;i--)
{
GO_DONE=1; //开启转换
while(GO_DONE); //等待转换完成
result=result+ADRESL+ADRESH*256;//累计转换结果
}
result=result/3; //求5次结果平均值
if((result<757)&&(result>590))
{
a1=1;
}
else
{
// K=1;
a1=0;
}
}
if(W2==1)
{
int result=0x00;
W2=0;
ADCON1=0X10;//8分频
ADCON0=0X85;//A1通道,右对齐,内部参考电压
char i;
result=0x00; //转换结果清零
for(i=3;i>0;i--)
{
GO_DONE=1; //开启转换
while(GO_DONE); //等待转换完成
result=result+ADRESL+ADRESH*256;//累计转换结果
}
result=result/3; //求5次结果平均值
if((result<757)&&(result>590))
{
a2=1;
}
else
{
//K=1;
a2=0;
}
}
//////
if(W3==1)
{
int result=0x00;
W3=0;
ADCON1=0X10;//8分频
ADCON0=0X89;//A2通道,右对齐,内部参考电压
char i;
result=0x00; //转换结果清零
for(i=3;i>0;i--)
{
GO_DONE=1; //开启转换
while(GO_DONE); //等待转换完成
result=result+ADRESL+ADRESH*256;//累计转换结果
}
result=result/3; //求5次结果平均值
if((result<606)&&(result>475))
{
a3=1;
}
else
{
// K=1;
a3=0;
didi_n(2);
}
}
}
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?立即注册
x
打赏
-
查看全部打赏
|