再发一次STC单片机AD的奇怪问题,会改变变量的值?
一个项目用的是STC12C5A60S2的单片机,之前一直正常,有19264屏幕,后来客户说要加个温度,用了ad,事情就来了,有个变量会被AD改变,我要测量3个AD,TL431的值,热电阻的值,热电偶的值,程序如下,发现开了AD的这段程序后就会影响屏幕的刷新程序,关了就好了,表现是我每3秒刷新一次AD,每个值做10次采样,然后计算,屏幕也每3秒快速刷新几百毫秒的时间,感觉这几百毫秒就是AD在运行导致屏幕一直在刷新,这个是其中一个菜单的程序,测试了多次,确定影响的是Dis_PageOld这个参数,然而我其他的页面同样的程序就没有影响,非常奇怪,我改变了AD采样速度问题消失,但我知道其实不是消失,而是暂时没有,有可能我多加一个菜单就又会发生了,真的能屏蔽的都先屏蔽了这样测试问题在哪里,已经把AD程序做到了最小化了,还是一样,只有关了就不刷新了void Display_Menu39 (void)
{
if(Dis_Page==39)
{
if(Dis_Page!=Dis_PageOld)
{
LCD_Clear();
LCD_Display (0,0,0,16,2,TUPIAN1);
LCD_Display (0,176,0,16,2,TUPIAN2);
LCD_Display (0,64,0,16,2,WEN1);
LCD_Display (0,80,0,16,2,DU1);
LCD_Display (0,96,0,16,2,JIAN3);
LCD_Display (0,112,0,16,2,CE1);
Dis_Buffer=*(CanShu);
Dis_Reverse=0; //清空反显
Dis_Flag=1; //刷新可变参数
Dis_PageOld=Dis_Page;
}
if(Dis_Flag==1)
{
LCD_Display (Dis_Reverse==1,80,3,24,5,Number);
Dis_Flag=0;
}
KeyBoard_Parameter(1);
}
}
AD程序
//*****************************************中断5,ADC中断*****************************//
/*
功能:数模转换中断
全局变量:变量看列表
输入变量:无
输出变量:无
局部变量:无
*/
void Funtime1 (void) interrupt 5 using 0
{
if(ADC_Channel==1)
{ADC_CONTR=0xa1;} //清除ADC标记
else if(ADC_Channel==2)
{ADC_CONTR=0xa2;}
else if(ADC_Channel==3)
{ADC_CONTR=0xa3;}
if(ADC_Flag==0)
{
ADC_Value=(uint)ADC_RES<<2;
ADC_Value|=ADC_RESL&0x03;
ADC_Flag=1;
}
}
//*****************************************温度值计算*****************************//
/*
功能:计算温度值,整数值
全局变量:
输入变量:无
输出变量:无
局部变量:无
*/
void Result_Temp (void)
{
if(ADC_Flag==1)
{
ADC_Array=ADC_Value;
ADC_SampleCount++;
if(ADC_SampleCount<SAMPLE_COUNT)
{
if(ADC_Channel==1)
{ADC_CONTR=0xa9;}
else if(ADC_Channel==2)
{ADC_CONTR=0xaa;}
else if(ADC_Channel==3)
{ADC_CONTR=0xab;}
ADC_Flag=0;
}
}
if(ADC_SampleCount>=SAMPLE_COUNT) //取样次数到
{
uint min=0xffff,max=0;
uchar mincount=0,maxcount=0;
uchar i,j;
ulong res=0,tc_v=0;
uint tenth=0;
ulong adc_mean=0;
for(i=0;i<SAMPLE_COUNT;i++)
{
if(min>ADC_Array) //查找最小值
{
min=ADC_Array;
mincount=i;
}
if(max<ADC_Array) //查找最大值
{
max=ADC_Array;
maxcount=i;
}
}
ADC_Array=0;
ADC_Array=0;
for(i=0;i<SAMPLE_COUNT;i++)
{
adc_mean+=ADC_Array;
}
if(mincount!=maxcount){adc_mean/=8;} //取得平均值
else{adc_mean/=9;}
if(ADC_Channel==1) //电源电压
{
Vref_ADC=adc_mean;
ADC_Channel=2;ADC_CONTR=0xaa;
}
else if(ADC_Channel==2) //热电偶温差
{
tc_v=((ulong)2500000*adc_mean)/Vref_ADC/121; //121倍放大倍数
if((tc_v>=TC_VOL)&&(tc_v<=TC_VOL)) //数据必须在数组区间内
{
for(i=0;(tc_v>=TC_VOL)&&(i<=(TC_MAX-1));i++){;} //确定具体温差值
if((i>0)&&(i<TC_MAX))
{
tenth=((TC_VOL-TC_VOL))/10; //1度对应的具体阻值
j=(TC_VOL-tc_v)/tenth;
TC_Temp=(i*10)-j; //当前温差
}
}
ADC_Channel=3;ADC_CONTR=0xab;
}
else if(ADC_Channel==3) //室温
{
res=(10240000/(1024-adc_mean))-10000; //10K电阻
if((res<=NTC_RES)&&(res>=NTC_RES)) //数据必须在数组区间内
{
for(i=0;(res<=NTC_RES)&&(i<=(NTC_MAX-1));i++){;} //确定具体温度值
if((i>0)&&(i<NTC_MAX))
{
NTC_Temp=i-20;
}
}
Temp_Value=NTC_Temp+TC_Temp; //总温度
if(Temp_Value<0){Temp_Value=0;}
ADC_SampleTime=1;
}
ADC_SampleCount=0;
ADC_Flag=0;
}
if(ADC_SampleTime>3000) //刷新时间
{
ADC_Channel=1;ADC_CONTR=0xa9;
ADC_SampleTime=0;
if(Dis_Page==DISP_MAIN_MINPAGE){Dis_Flag=1;} //当前页面为主页面就刷新一次
}
}
只刷新改变的内容,其他不动 sohappyoh 发表于 2014-6-9 08:42
只刷新改变的内容,其他不动
恩,我现在的程序就是这么做的,固定的一些字都不刷新,只刷新数据,但是很明显在进入这个页面的时候连文字一起刷新了,所以又深入研究了一下,就是在显示程序中if(Dis_Page!=Dis_PageOld)被反复执行,一想肯定是Dis_PageOld被改变了,不然Dis_Page被改变页面都跳出了,全局搜索了Dis_PageOld只有在显示页面的程序中使用,AD中没有使用过,而且使用的方式和现在页面的都一样的,不过其他页面却没有发生这种情况,真的想不通啊 感觉不太可能的事,既然知是AD温度程序有问题就一段一段屏蔽(变量自己给)来测试下 HGQ21102 发表于 2014-6-9 11:28
感觉不太可能的事,既然知是AD温度程序有问题就一段一段屏蔽(变量自己给)来测试下 ...
其实是的,我也觉得不太可能,毕竟是这么常用的单片机,而且网上也没有类似的帖子,只能怀疑自己的程序,但程序看来看去就这几个寄存器和变量,真的有点没思路了才发个帖子问问
页:
[1]