求助!急求!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条回答
人中狼
1楼-- · 2019-07-15 14:49
这个问题取决于你的设计思路和目的,
定时50ms,如果定时到了时进行采样,那么200ms就是采样4次,
如果第一次采样开始进行定时,到200ms结束采样,定时50ms只是用来确定200ms是否到时,期间每次采样结束后就进行下一次采样,与定时器无关的话,那么200ms内的采样次数就取决于每次采样所需要的时间,这个次数通常都大于4次
deansk
2楼-- · 2019-07-15 16:05
人中狼 发表于 2018-5-10 10:32
这个问题取决于你的设计思路和目的,
定时50ms,如果定时到了时进行采样,那么200ms就是采样4次,
如果第一次采样开始进行定时,到200ms结束采样,定时50ms只是用来确定200ms是否到时,期间每次采样结束后就进行下一次采样,与定时器无关的话,那么200ms内的采样次数就取决于每次采样所需要的时间,这个次数通常都大于4次 ...

我的思路是您说的第二种思路,是让采样次数大于4次的,但是我不知道我编的程序是不是这样的,能烦请您帮我看一下吗?
人中狼
3楼-- · 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;      
        }        
}



wulinwl
4楼-- · 2019-07-15 23:55
 精彩回答 2  元偷偷看……

一周热门 更多>