prozmx 发表于 2014-6-9 00:57:29

再发一次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:54

只刷新改变的内容,其他不动

prozmx 发表于 2014-6-9 08:49:54

sohappyoh 发表于 2014-6-9 08:42
只刷新改变的内容,其他不动

恩,我现在的程序就是这么做的,固定的一些字都不刷新,只刷新数据,但是很明显在进入这个页面的时候连文字一起刷新了,所以又深入研究了一下,就是在显示程序中if(Dis_Page!=Dis_PageOld)被反复执行,一想肯定是Dis_PageOld被改变了,不然Dis_Page被改变页面都跳出了,全局搜索了Dis_PageOld只有在显示页面的程序中使用,AD中没有使用过,而且使用的方式和现在页面的都一样的,不过其他页面却没有发生这种情况,真的想不通啊

HGQ21102 发表于 2014-6-9 11:28:17

感觉不太可能的事,既然知是AD温度程序有问题就一段一段屏蔽(变量自己给)来测试下

prozmx 发表于 2014-6-9 13:23:31

HGQ21102 发表于 2014-6-9 11:28
感觉不太可能的事,既然知是AD温度程序有问题就一段一段屏蔽(变量自己给)来测试下 ...

其实是的,我也觉得不太可能,毕竟是这么常用的单片机,而且网上也没有类似的帖子,只能怀疑自己的程序,但程序看来看去就这几个寄存器和变量,真的有点没思路了才发个帖子问问
页: [1]
查看完整版本: 再发一次STC单片机AD的奇怪问题,会改变变量的值?