STC12LE5A60S2单片机使用P1.0和P1.1口做AD检测电压,出现AD0的值有一瞬间和AD1相同,求解。
时间:10-02
整理:3721RD
点击:
如题,使用STC12LE5A60S2单片机的P1.0和P1.1口做两组电池的电压实时检测并显示,两组电池电压交替检测,如果A组电池电压低于46V时关闭LED0和LED1,然后继续检测B组电池电压,B组电池电压低于46V时关闭LED2和LED3;如果B组电池电压低于46V时关闭LED2和LED3,然后继续检测A组电池电压,A组电池电压低于46V时关闭LED0和LED1。但程序出现一个问题:A组电池电压为48V不变,B组电压由48V缓慢下降,当降到46V时,关闭LED2和LED3,然后单片机检测到A组的电压瞬间也变成46V导致LED0和LED1也关闭了,接着检测到的A组电池电压又恢复到48V,但使用示波器量测过A组电压全过程中并未发生变化,非常疑惑,请各位大神解答,非常感谢。
附上此部分的程序。
void discharge(void) interrupt 0
{
unsigned char a,LED0,LED1,LED2,LED3;
unsigned int ADDATA;
LED0=1;
LED1=1;
LED2=1;
LED3=1;
a=0;
LCD12864_clear(); //12864清屏
get_adc_result(a); //获取a通道电压值 ,返回的是temp
discharge_buffer=(temp-3013)/0.27970; //精确计算实际电压值,discharge_buffer为实际的电压值的100000倍,便于12864显示小数部分
ADDATA=(uint)(discharge_buffer/100000); //对实际电压值取整,方便和46V进行比较
disp12864_fangdianya(a); //在12864上显示a通道的电压值
do
{
a=1-a; //对a进行取反,轮流检测P1.0和P1.1通道的电压
get_adc_result(a); //获取a通道电压值 ,返回的是temp
discharge_buffer=(temp-3013)/0.05654;//精确计算实际电压值,discharge_buffer为实际的电压值的100000倍,便于12864显示小数部分
ADDATA=(uint)(discharge_buffer/100000);//对实际电压值取整,方便和46V进行比较
disp12864_fangdianya(a); //在12864上显示a通道的电压值
}
while(46<ADDATA);
if(a==1) //如果a=1,说明B组电池电压低于46V,关掉LED2和LED3
{
LED2=0; LED3=0;
}
else //否则,说明A组电池电压低于46V,关掉LED0和LED1
{
LED0=0; LED1=0;
}
a=1-a; //对a取反,下面要检测另一路电池电压
Delay100ms(); //延时100ms
get_adc_result(a); //获取a通道电压值 ,返回的是temp
discharge_buffer=(temp-3013)/0.05654; //精确计算实际电压值,discharge_buffer为实际的电压值的 //100000倍,便于12864显示小数部分
ADDATA=(uint)(discharge_buffer/100000); //对实际电压值取整,方便和46V进行比较
disp12864_fangdianya(a); //在12864上显示a通道的电压值
do
{
get_adc_result(a); //获取a通道电压值 ,返回的是temp
discharge_buffer=(temp-3013)/0.05654;//精确计算实际电压值,discharge_buffer为实际的电压值的 //100000倍,便于12864显示小数部分
ADDATA=(uint)(discharge_buffer/100000);//对实际电压值取整,方便和46V进行比较
disp12864_fangdianya(a);//在12864上显示a通道的电压值
Delay100ms(); //延时100ms
}
while(46<ADDATA);
if(a==0) {
LED0=0; LED1=0;
}
else
{
LED2=0; LED3=0;
}
}
附上此部分的程序。
void discharge(void) interrupt 0
{
unsigned char a,LED0,LED1,LED2,LED3;
unsigned int ADDATA;
LED0=1;
LED1=1;
LED2=1;
LED3=1;
a=0;
LCD12864_clear(); //12864清屏
get_adc_result(a); //获取a通道电压值 ,返回的是temp
discharge_buffer=(temp-3013)/0.27970; //精确计算实际电压值,discharge_buffer为实际的电压值的100000倍,便于12864显示小数部分
ADDATA=(uint)(discharge_buffer/100000); //对实际电压值取整,方便和46V进行比较
disp12864_fangdianya(a); //在12864上显示a通道的电压值
do
{
a=1-a; //对a进行取反,轮流检测P1.0和P1.1通道的电压
get_adc_result(a); //获取a通道电压值 ,返回的是temp
discharge_buffer=(temp-3013)/0.05654;//精确计算实际电压值,discharge_buffer为实际的电压值的100000倍,便于12864显示小数部分
ADDATA=(uint)(discharge_buffer/100000);//对实际电压值取整,方便和46V进行比较
disp12864_fangdianya(a); //在12864上显示a通道的电压值
}
while(46<ADDATA);
if(a==1) //如果a=1,说明B组电池电压低于46V,关掉LED2和LED3
{
LED2=0; LED3=0;
}
else //否则,说明A组电池电压低于46V,关掉LED0和LED1
{
LED0=0; LED1=0;
}
a=1-a; //对a取反,下面要检测另一路电池电压
Delay100ms(); //延时100ms
get_adc_result(a); //获取a通道电压值 ,返回的是temp
discharge_buffer=(temp-3013)/0.05654; //精确计算实际电压值,discharge_buffer为实际的电压值的 //100000倍,便于12864显示小数部分
ADDATA=(uint)(discharge_buffer/100000); //对实际电压值取整,方便和46V进行比较
disp12864_fangdianya(a); //在12864上显示a通道的电压值
do
{
get_adc_result(a); //获取a通道电压值 ,返回的是temp
discharge_buffer=(temp-3013)/0.05654;//精确计算实际电压值,discharge_buffer为实际的电压值的 //100000倍,便于12864显示小数部分
ADDATA=(uint)(discharge_buffer/100000);//对实际电压值取整,方便和46V进行比较
disp12864_fangdianya(a);//在12864上显示a通道的电压值
Delay100ms(); //延时100ms
}
while(46<ADDATA);
if(a==0) {
LED0=0; LED1=0;
}
else
{
LED2=0; LED3=0;
}
}
没有人能够解答这个问题吗?
感觉交替测压通道应该给个延时,毕竟AD采集有个反映时间;或者分别用两组通道采集试试看
观望中,也来学习一下
两次检测之间要重新初始化AD,转换通道,希望能帮到你,可以在联系我