lhcyy 发表于 2012-4-27 15:37:41

STC自带ADC多路采样问题,以及如果获得结果,请帮忙看看...

我用的是STC12C5A60S2,自带的ADC,有些疑惑



程序如下的一部分:
#define ADC_POWER 0x80
#define SPEEDHH 0x60
#define SPEEDH 0x40
#define SPEEDL 0x20
#define SPEEDLL 0x00
#define ADC_START 0x08
#define ADC_FLAG 0x10


uchar ADC_CH[]={0x00,0x01,0x020,0x30,0x04,0x05,0x06,0x07};

uchar ADC_CHresult

uchar ADC_data;
void ADC_Init()
{
        P1ASF=0xff;//选择ADC通道
        ADC_CONTR=ADC_POWER|SPEEDHH;
        ADC_RES=0;
        ADC_RESL=0;

        }
void GET_ADCresult(uint i)
    {
          
          ADC_CONTR=ADC_POWER|SPEEDHH|ADC_START|ADC_CH;

          _nop_();
          _nop_();
          _nop_();
          _nop_();
          _nop_();
          _nop_();
          while(!(ADC_CONTR&ADC_FLAG));

          ADC_CONTR&=!ADC_FLAG;


          ADC_CHresult=???


       }
想知道该怎么样获得结果。10位的。而且这个函数可以用来做8路顺序采样吗?求指导

farrtone 发表于 2012-4-27 20:16:21

/*********************************************************************
函数名称:InitADC()
函数功能:初始化AD
返 回 值:无
入    参:无
**********************************************************************/
void InitADC(void)
{
ADC_RES = 0;
ADC_RESL = 0;                  //clear previous result

P1ASF |= 0x13;                   //Open P10,P11 and P14 channels ADC function
AUXR1 |= 0x04;                   //0000,0100, 令 ADRJ=1
                                 //10位A/D转换结果的高2位存放在ADC_RES中低2位中,低8位存放在ADC_RESL中
ADC_CONTR |= 0x80;               //1000,0000 打开 A/D 转换电源
dlms(1);                         //使输入电压达到稳定
}

/********************************************************t*************
函数名称:g_AD_result()
函数功能:A/D转换
返 回 值:有
入    参:有
**********************************************************************/
uint g_AD_result(uchar Channel1)
{
        uchar ADC_finished=0;            //Define A/D conversion flag

        P1M0 = 0X00;
        P1M1 = 0X13;                     //P1.X口做A/D使用,现将其设置成高阻输入

        ADC_CONTR = AD_SPEED;
        _nop_();                         //空操作,延迟一个机器周期


if(Channel1==1)
        {
             s=0;
                                         //Choose the P1.0 channel of A/D inupt
                        _nop_();

           }
   else if(Channel1==0)
           {
      s=1;   //Choose the P1.1 channel of A/D inupt
                        _nop_();

           }
   else if(Channel1==2)
           {
      s=4;   //Choose the P1.4 channel of A/D inupt
                        _nop_();

           }

ADC_CONTR = (ADC_CONTR &0xf8)|s;
_nop_();

        ADC_CONTR |= 0x80;               //启动 A/D 电源
        dlms(1);                         //使输入电压达到稳定

        ADC_CONTR |= 0x08;               //0000,1000 令 ADC_START = 1, 启动A/D转换
        ADC_finished = 0;
        while(ADC_finished == 0)         //等待A/D转换完成
           {
           ADC_finished =(ADC_CONTR & 0X10); //判断A/D转换是否结束
           }
        ADC_CONTR = 0XE7;                //转换完成后,ADC_FLAG=1,软件清零;关闭A/D转换

        return(ADC_RES<<8 | ADC_RESL);   //返回 A/D 10位转换结果

}
格式有点乱,自己在结合datasheet看一下吧

jxcylxh 发表于 2012-5-4 23:28:56

可以。只要读高8位。转换完后读取出来就好。

下面有段参考
void get_adc()
{             unsigned int temp1,temp2;
                  unsigned char i;
          for(i=0;i<64;i++)
                   {
                                      ADC_CONTR=0xa8;
                                                  delay_nop();
                                                  delay_nop();
                                                  delay_nop();
                                                  delay_nop();
                                                  while (!(ADC_CONTR&0x10))
                                            temp1=ADC_RES;
                                                  temp1=temp1<<2;
                                                  temp1=temp1|ADC_RESL;          
                                                  
                                                  
                                                  delay_nop();
                                           delay_nop();
                                                  delay_nop();
                                      ADC_CONTR=0xa9;
                                                  delay_nop();
                                                  delay_nop();
                                                  delay_nop();
                                                  delay_nop();
                                                  while (!(ADC_CONTR&0x10))
                                            temp2=ADC_RES;
                                                  temp2=temp2<<2;
                                                  temp2=temp2|ADC_RESL;       

                                                  //////////////////////////////////
                                             datas=temp2+temp1;
//                                               (float)datas;
                                             
                                                  
                               }
                                                                           
}

wjzhongshi 发表于 2013-1-3 21:14:18

记号一下,以后慢慢看
页: [1]
查看完整版本: STC自带ADC多路采样问题,以及如果获得结果,请帮忙看看...