求助!急求!STC12C5A60S2单片机 AD采样与定时器定时能否同时工作?

2019-07-15 08:27发布

      STC12C5A60S2单片机,ad转换一直进行200ms,每次转换的结果都相加,200ms后求这么多次采样的平均值,平均值与某个值进行比较,然后再一次转换200ms,再求平均,再比较......这样一直循环下去。
      我用定时器定时50ms,4次中断后就是200ms,但是定时器开始工作后,ad转换能同时进行吗?还是定时器先工作,直到定时完50ms后才进行ad转换呢?
      新手求助,拜托各位大佬了!
void main()
{
       
        while(1)
        {
                n=0;
                sum=0;
                TMOD=0x01;                  
                TH0=0x4C;                  //11.0592MHZ晶振,定时50ms
                TL0=0;
                EA=1;
                ET0=1;
                TR0=1;                  //定时器开始工作
                while(n<=4)           //没到200ms就一直ad转换
                {
                        InitADC();                                                           //ad初始化
                        ADC_CONTR=ADC_POWER|ADC_SPEEDLL|P1ASF|ADC_START;
                        _nop_();
                        _nop_();
                        _nop_();
                        _nop_();
                        while(!(ADC_CONTR&ADC_FLAG));
                        ADC_CONTR&=~ADC_FLAG;                                 //一次ad转换结束
                        x=ADC_RES*256+ADC_RESL;
                        sum+=x;
                }
                //n=0;
                y=sum/2457;                                                          //求平均
                if(y>=31)                                                          //比较
                {       
                        D1=0;
                        Bee=0;
                }               
        }       
}

void InitADC()
{
        P1ASF=0X04;
        ADC_RES=0;
        AUXR1=0x04;
        ADC_CONTR=ADC_POWER|ADC_SPEEDLL;
        Delay(2);
}

void Delay(unsigned int n)
{
        unsigned int x;
        while(n--)
        {
                x=5000;
                while(x--);
        }       
}

void exter() interrupt 1
{
        TH0=0x4C;
        TL0=0;
        n++;       
}


友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
4条回答
人中狼
2019-07-15 19:09
试试这样改吧


unsigned char adc_times;


void main()

{
        n=0;
                sum=0;                adc_times = 0;
                TMOD=0x01;                  
                TH0=0x4C;                  //11.0592MHZ晶振,定时50ms
                TL0=0;               
                InitADC();                                                           //ad初始化
                EA=1;
                ET0=1;
                TR0=1;                  //定时器开始工作
        while(1)
        {
               
                while(n<=4)           //没到200ms就一直ad转换
                {
                        ADC_CONTR=ADC_POWER|ADC_SPEEDLL|P1ASF|ADC_START;
                        _nop_();
                        _nop_();
                        _nop_();
                        _nop_();
                        while(!(ADC_CONTR&ADC_FLAG));
                        ADC_CONTR&=~ADC_FLAG;                                 //一次ad转换结束
                        x=ADC_RES*256+ADC_RESL;
                        sum+=x;

                        adc_times ++;
                }
                n=0;
                y=sum/adc_times;                                                          //求平均
                if(y>=31)                                                          //比较
                {        
                        D1=0;
                        Bee=0;
                }         

               sum = 0;
               adc_times = 0;      
        }        
}



一周热门 更多>