STC12C5A60S2的AD转换程序,还能变换采样的位数,不懂,特此请教

2019-07-14 20:56发布

#include "SocAdc.h"


/*----------------------------
Software delay function
----------------------------*/
void Delay(uint16 n)
{
    uint16 x;
    while (n--)
    {
        x = 5000;
        while (x--){;}
    }
}

/*----------------------------
Get ADC result
----------------------------*/
uint16 GetAdcResult(uint8 ch)
{
    uint16 tmp = 0;  //无符号16位整型变量
   
    ADC_CONTR = ADC_POWER | ADC_SPEEDHH | ch | ADC_START;
    _nop_();                        //Must wait before inquiry
    _nop_();
    _nop_();
    _nop_();
    while (!(ADC_CONTR & ADC_FLAG));//Wait complete flag
    //ADC_CONTR &= ~ADC_FLAG;         //Close ADC
   
    tmp = ADC_RES;  //A/D 转换结果高8位 ADCV.9 ADCV.8 ADCV.7 ADCV.6 ADCV.5 ADCV.4 ADCV.3 ADCV.2  0000,0000
    tmp <<= 2;  //等价于  tmp = tmp<< 2   ,左移2位
    tmp |= ADC_RESL;   //等价于tmp= ADC_RESL | tmp   按位或,       A/D 转换结果低2位                                           ADCV.1 ADCV.0  0000,0000
   
    return tmp;                 //Return ADC result    ,即输出一个采样点的二进制表示值
}

/****************************************************************
  函数名:AdcInit
  参  数:
  返回值:
  描  述:ADC初始化
****************************************************************/
void AdcInit()
{
    P1M1 = 0x0f;
    P1M0 = 0x00;
    P1ASF = 0x0f;                   //Open 8 channels ADC function
   
    AUXR1 &= (~0x04);
    ADC_RES = 0;                    //Clear previous result
    ADC_RESL = 0;
    ADC_CONTR = ADC_POWER | ADC_SPEEDHH;
    Delay(2);                       //ADC power-on and delay
}

/****************************************************************
  函数名:GetAdc10bit
  参  数:ucChannel = 通道(0~7)
  返回值:
  描  述:10位采样
****************************************************************/
uint16 GetAdc10bit(uint8 ucChannel)
{
    if (ucChannel > 7) {return 0;}
   
    GetAdcResult(ucChannel);    //切换后的第1次舍去
   
    return GetAdcResult(ucChannel);
}

/****************************************************************
  函数名:GetAdc12bit
  参  数:ucChannel = 通道(0~7)
  返回值:
  描  述:12位采样
****************************************************************/
uint16 GetAdc12bit(uint8 ucChannel)
{
    uint16 sum = 0;
    uint8 i = 0;
   
    if (ucChannel > 7) {return 0;}
   
    GetAdcResult(ucChannel);    //切换后的第1次舍去
   
    for (i=0; i<4; i++)   //2^2    //10bit过采样到12bit(0~4095)
    {
        sum += GetAdcResult(ucChannel);
    }
   
    return (uint16)sum;
}

/****************************************************************
  函数名:GetAdc14bit
  参  数:ucChannel = 通道(0~7)
  返回值:
  描  述:14位采样
****************************************************************/
uint16 GetAdc14bit(uint8 ucChannel)
{
    uint16 sum = 0;
    uint8 i = 0;
   
    if (ucChannel > 7) {return 0;}
   
    GetAdcResult(ucChannel);    //切换后的第1次舍去
   
    for (i=0; i<16; i++)   //2^4     //10bit过采样到14bit(0~16383)
    {
        sum += GetAdcResult(ucChannel);
    }
   
    return (uint16)sum;
}

/****************************************************************
  函数名:GetAdc16bit
  参  数:ucChannel = 通道(0~7)
  返回值:
  描  述:16位采样
****************************************************************/
uint16 GetAdc16bit(uint8 ucChannel)
{
    uint16 sum = 0;
    uint8 i = 0;
   
    if (ucChannel > 7) {return 0;}
   
    GetAdcResult(ucChannel);    //切换后的第1次舍去
   
    for (i=0; i<64; i++)   //2^6     //10bit过采样到16bit(0~65535)
    {
        sum += GetAdcResult(ucChannel);
    }
   
    return (uint16)sum;
}

友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
1条回答
小狼崽在路上
1楼-- · 2019-07-15 10:05
aihai0002275 发表于 2016-5-5 00:00
采样位数不变    只是把寄存器的前8位取出来专换成采样直而已

能说具体点吗?本身是10位AD采样,12位采样是采集4个数据进行累加,14位采样是采集16个数据进行累加,这是为什么?

一周热门 更多>