现在的位置: 首页 > 综合 > 正文

C8051 ADC控制

2018年02月01日 ⁄ 综合 ⁄ 共 4478字 ⁄ 字号 评论关闭

//-----------------------------------------------------------------------------
// ADC0.c
//-----------------------------------------------------------------------------
// Includes
//-----------------------------------------------------------------------------

#include <C8051F340.h>                 // SFR declarations
#include "public.h"

//-----------------------------------------------------------------------------
// 16-bit SFR Definitions for 'F34x
//-----------------------------------------------------------------------------

sfr16 ADC0 = 0xBD;                      // 10-bit ADC0 result

//-----------------------------------------------------------------------------
// Global Variables
// 模拟输入引脚配置:
//
//    AMX0P      Port Pin
//    0x02         P2.2
//    0x03         P2.3
//    0x1E         温度传感器

//-----------------------------------------------------------------------------
// Temperature Sensor Calibration PARAMETERS
//-----------------------------------------------------------------------------
#define AMB_TEMP           22         // Ambient Calibration Temperature 
                                       // (degC)此校准值取决于运行程序时的环境温度

#define TEMP_SENSOR_GAIN   2860        // Temp Sensor Gain in (uV / degC)

#define VREF           2470   // 3300        // ADC 参考电压 (mV)

#define TEMP_OFFSET        0          // offset

//-----------------------------------------------------------------------------
// ADC0_Init
//-----------------------------------------------------------------------------
//
// Return Value : None
// Parameters   : None
//
//-----------------------------------------------------------------------------

void ADC0_Init (void)
{
    ADC0CF  = 0x20; //0x80 转换时钟为SYSCLK/17. 3M
  sysclk/5
ADC0LTH = 0xFF; //ADC上限数据高位
ADC0LTL = 0xFF; //ADC上限数据高位
ADC0GTH = 0x00; //ADC下限数据高位
ADC0GTL = 0x00; //ADC下限数据低位

ADC0CN  = 0xC0; 
REF0CN  = 0x07;
//0x0E 电压基准控制寄存器;2.457内部基准作为电压基准,内部偏压发生器工作,温度传感器工作使能
AMX0N   = 0xFF; //GND 单端方式
}

uint ADconvert(uchar iChannels)
{
   AMX0P = iChannels; //配置输入通道  
   AD0BUSY=1;
   while(!AD0INT);
   AD0INT=0;  
   return ADC0;
}  

/////////////////////////////////
uint DET_DU_TR() //P2^2;

{  uint ADC_code,i,tmp;
   ADC_code=ADconvert(0x02);
   ADC_code=0;       
   for(i=0;i<10;i++) //配置P2^2;为单端输入
   {   tmp=ADconvert(0x02);
  ADC_code=ADC_code+tmp;

   }
   ADC_code=ADC_code/10;    
   return ADC_code;  
}
uint DET_DU_40V() //P2^3;
{  uint ADC_code,i,tmp;
   ADC_code=ADconvert(0x03);
   ADC_code=0;       
   for(i=0;i<10;i++)
   {   tmp=ADconvert(0x03);   //配置P2^3;为单端输入
  ADC_code=ADC_code+tmp;

   }
   ADC_code=ADC_code/10;    
   return ADC_code; 
}
uint DET_DU_PC() //P2^4->P2^6;
{  uint ADC_code,i,tmp;
   ADC_code=ADconvert(0x05);
   ADC_code=0;       
   for(i=0;i<10;i++)
   {   tmp=ADconvert(0x05);
  ADC_code=ADC_code+tmp;

   }
   ADC_code=ADC_code/10;    
   return ADC_code; 
}

uint DET_DU_36V() //P2^5;

{  uint ADC_code,i,tmp;
   ADC_code=ADconvert(0x04);
   ADC_code=0;       
   for(i=0;i<10;i++)
   {   tmp=ADconvert(0x04);
  ADC_code=ADC_code+tmp;

   }
   ADC_code=ADC_code/10;    
   return ADC_code; 
}
sbit DI_TR = P3^0;
sbit DI_36V = P3^4;
sbit DI_PC = P3^1;
sbit DI_40V = P3^5;
///////////////////////////////////
uint DET_DI_TR() //P3^0;
{  uint ADC_code,i,tmp;
   ADC_code=ADconvert(0x06);
   ADC_code=0;
          
   for(i=0;i<10;i++)
   {   tmp=ADconvert(0x06);
  ADC_code=ADC_code+tmp;

   }
   ADC_code=ADC_code/10;    
   return ADC_code;
}

ulong DET_DI_36V() //P3^4;
{  
   ulong ADC_code;
   uint tmp;
   uchar i; //  EA=0;
   ADC_code=ADconvert(0x08);
   ADC_code=0;       
   for(i=0;i<20;i++)
   {   tmp=ADconvert(0x08);
  ADC_code=ADC_code+tmp;

   }
   ADC_code=ADC_code/20;//EA=1;    
   return ADC_code;
}

uint DET_DI_PC() //P3^1;
{  uint ADC_code,i,tmp;
   ADC_code=ADconvert(0x07);
   ADC_code=0;       
   for(i=0;i<10;i++)
   {   tmp=ADconvert(0x07);
  ADC_code=ADC_code+tmp;

   }
   ADC_code=ADC_code/10;    
   return ADC_code;
}
/*
uint DET_DI_40V() //P3^5;
{  uint ADC_code,i,tmp;
   ADC_code=ADconvert(0x09);
   ADC_code=0;       
   for(i=0;i<10;i++)
   {   tmp=ADconvert(0x09);
  ADC_code=ADC_code+tmp;

   }
   ADC_code=ADC_code/10;    
   return ADC_code; 
}
//*/

////////////////////////////////////

uint Temprature_DET() //温度检测
{
AMX0P = 0x1e;   //配置为单端输入
AD0BUSY=1;
while(!AD0INT);
AD0INT=0;  
return ADC0;
}

uint get_temp_int(void)                       //返回数字采样值
{
   uint ADC_code,i,tmp;    
   ADC_code = Temprature_DET();
   ADC_code=0;                 //第一次采样丢掉

   for(i=0;i<10;i++)
   {
      tmp=Temprature_DET();
  ADC_code=ADC_code+tmp;

   }
   ADC_code=ADC_code/10;    
   return ADC_code;
}

int get_temp(void)
{
    long result=0L;
   //result=230;                                 //仅做测试用
      
   result=get_temp_int();

   if(result>241)
   {
    result = (result * (long) VREF / 1024 -776)* 1000/ TEMP_SENSOR_GAIN ;
}
else                                        //负温
{
result = 65536-(776-result * (long) VREF / 1024 )* 1000/ TEMP_SENSOR_GAIN ;
}
   
   return (int) result;
} //*/
//-----------------------------------------------------------------------------
// End Of File
//-----------------------------------------------------------------------------

【上篇】
【下篇】

抱歉!评论已关闭.