C8051 ADC控制

来源:互联网 发布:知乎你懂的网站 编辑:程序博客网 时间:2024/05/30 04:05
//-----------------------------------------------------------------------------
// 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
//-----------------------------------------------------------------------------
0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 柔顺后头发太臭怎么办 积分兑换手机被骗了怎么办 老板对你的上级不满怎么办 如果老板不给工资怎么办 手机号码被标记为其他公司怎么办? 被标记为骚扰电话怎么办 手机被标记骚扰电话怎么办 360摄像头不支持5g怎么办 摄像头不支持5g网络怎么办 家里的wifi卡了怎么办 办信用卡没有座机号码怎么办 拨打电话时显示号码有误怎么办 个体营业执照怎么办企业支付宝 没满16岁怎么办电话卡 我的电话卡丢了怎么办 公司注销地税没有补齐怎么办 公司没有固定电话怎么办信用卡 申请信用卡公司没有固定电话怎么办 办理信用卡公司没有固定电话怎么办 江门市固话欠费停机后怎么办 物业交钥匙地面有裂缝怎么办 深圳交通卡丢了怎么办 没装etc走etc怎么办 找不到过敏源身体痒怎么办 微信客服电话打不通怎么办 华为手机网络信号不好怎么办 酷我好友动态加载不了怎么办? 米兔电话手表停机了怎么办 糖猫电话手表停机了怎么办 360电话手表停机了怎么办 小天才电话手表停机怎么办 移动手机卡不知道号码怎么办 天猫退款手机号换了怎么办 科目二考试脚抖怎么办 面试新工作没打电话怎么办 怀孕5个月胎位低怎么办 做业务很害怕打电话怎么办 固定电话总是接到骚扰电话怎么办 电话卡通话被限制了怎么办? 手机名单拉黑了怎么办 被苹果6s被拉黑怎么办