⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 adc.c

📁 STC12C5410AD模拟串口再现多串口通讯
💻 C
字号:
#include"include.h"

uint32 xdata sum[10];
/*********************************************************************************************************
** 函数名称: void delaynms(uint16 n) 
** 功能描述: 延时函数
** 输   入: 无
** 输   出: 无
** 全局变量: 
** 调用模块: 
**
** 作   者: 李伟
** 日   期: 2008年12月09日
**-------------------------------------------------------------------------------------------------------
** 修 改 人:
** 日   期:
**-------------------------------------------------------------------------------------------------------
********************************************************************************************************/
void delaynms(uint16 n)                           //延时1mS
{
    uint16 i;
    while(n>0)
    {
        for(i=0;i<490;i++)
        {}
        n--;
    }
}
/*********************************************************************************************************
** 函数名称: uint16 Get_AD_Result(void)
** 功能描述: 获取ADC转换结果函数
** 输   入: 无
** 输   出: 无
** 全局变量: 
** 调用模块: 
**
** 作   者: 李伟
** 日   期: 2008年12月09日
**-------------------------------------------------------------------------------------------------------
** 修 改 人:
** 日   期:
**-------------------------------------------------------------------------------------------------------
********************************************************************************************************/
uint16 Get_AD_Result(void)
{
    uint16 ADH;
    uint16 ADL;
    ADC_DATA  = 0x00;
    ADC_LOW2  = 0x00;
    ADC_CONTR|= 0x08;
    delaynms(2);
    while(ADC_CONTR&0x10 != 0x10);
    ADC_CONTR &= 0xe7;                     //0xe7;
    ADH = ADC_DATA<<2;
    ADL = ADC_LOW2&0x03;
    ADH = ADH|ADL;
    return(ADH);
}
/*********************************************************************************************************
** 函数名称: void SetChannel(uint8 chnum)
** 功能描述: ad通道设置函数
** 输   入: 无
** 输   出: 无
** 全局变量: 
** 调用模块: 
**
** 作   者: 李伟
** 日   期: 2008年12月09日
**-------------------------------------------------------------------------------------------------------
** 修 改 人:
** 日   期:
**-------------------------------------------------------------------------------------------------------
********************************************************************************************************/
void SetChannel(uint8 chnum)      //chnum:channel number
{
    switch (chnum)
    {
        case 0 :
        {
            A12 = 0;                  //选通U9-138译码器
            A11 = 0;				  //E1
            A10 = 0;				  //选中第1路电池 A10
            A9  = 0;				  //A9
		    A8  = 0;				  //A8
        }break;
        case 1:
        {
            A12 = 0;                  //选通U9-138译码器
            A11 = 0;				  //E1
            A10 = 0;				  //选中第2路电池 A10
            A9  = 0;				  //A9
		    A8  = 1;				  //A8
        }break;
        case 2:
        {
            A12 = 0;                  //选通U9-138译码器
            A11 = 0;				  //E1
            A10 = 0;				  //选中第3路电池 A10
            A9  = 1;				  //A9
		    A8  = 0;				  //A8
        }break;
        case 3 :
        {
            A12 = 0;                  //选通U9-138译码器
            A11 = 0;				  //E1
            A10 = 0;				  //选中第4路电池 A10
            A9  = 1;				  //A9
		    A8  = 1;				  //A8
        }break;
        case 4:
        {
            A12 = 0;                  //选通U9-138译码器
            A11 = 0;				  //E1
            A10 = 1;				  //选中第5路电池 A10
            A9 = 0;				      //A9
		    A8 = 0;				      //A8
        }break;
        case 5:
        {
            A12 = 0;                  //选通U9-138译码器
            A11 = 0;				  //E1
            A10 = 1;				  //选中第6路电池 A10
            A9  = 0;				  //A9
		    A8  = 1;				  //A8
        }break;
        case 6 :
        {
            A12 = 0;                  //选通U9-138译码器
            A11 = 0;				  //E1
            A10 = 1;				  //选中第7路电池 A10
            A9  = 1;				  //A9
		    A8  = 0;				  //A8
        }break;
        case 7:
        {
            A12 = 0;                  //选通U9-138译码器
            A11 = 0;				  //E1
            A10 = 1;				  //选中第8路电池 A10
            A9  = 1;				  //A9
		    A8  = 1;				  //A8
        }break;
        case 8:                       //选通U10-138译码器
        {
            A12 = 0;                  //选通U10-138译码器
            A11 = 1;				  //E3
            A10 = 0;				  //选中第1路电池
            A9  = 0;				  //A9
		    A8  = 0;				  //A8
        }break;
        case 9 :
        {
            A12 = 0;                  //选通U10-138译码器
            A11 = 1;				  //E3
            A10 = 0;				  //选中第2路电池
            A9  = 0;				  //A9
		    A8  = 1;				  //A8
        }break;
        case 10:
        {
            A12 = 0;               	  //选通U10-138译码器
            A11 = 1;				  //E3
            A10 = 0;				  //选中第3路电池
            A9  = 1;				  //A9
		    A8  = 0;				  //A8
        }break;
        case 11:
        {
            A12 = 0;                  //选通U10-138译码器
            A11 = 1;				  //E3
            A10 = 0;				  //选中第4路电池
            A9  = 1;				  //A9
		    A8  = 1;				  //A8
        }break;
        case 12 :
        {
            A12 = 0;                  //选通U10-138译码器
            A11 = 1;				  //E3
            A10 = 1;				  //选中第5路电池
            A9  = 0;				  //A9
		    A8  = 0;				  //A8
        }break;
        case 13:
        {
            A12 = 0;                  //选通U10-138译码器
            A11 = 1;				  //E3
            A10 = 1;				  //选中第6路电池
            A9  = 0;				  //A9
		    A8  = 1;				  //A8
        }break;
        case 14:
        {
            A12 = 0;                  //选通U10-138译码器
            A11 = 1;				  //E3
            A10 = 1;				  //选中第7路电池
            A9  = 1;				  //A9
		    A8  = 0;				  //A8
        }break;
        case 15 :
        {
            A12 = 0;                  //选通U10-138译码器
            A11 = 1;				  //E3
            A10 = 1;				  //选中第8路电池
            A9  = 1;				  //A9
		    A8  = 1;				  //A8
        }break;
        default: break;
    }//end switch
}
/*********************************************************************************************************
** 函数名称: uint16 TemperatureLine(uint16 ADResult_T)
** 功能描述: 负温度系数传感器线性化处理(线性化电压采集最好使用12位ADC这样采样精度高,同样温度精度高)
** 输   入: 无
** 输   出: 无
** 全局变量: 
** 调用模块: 
**
** 作   者: 李伟
** 日   期: 2008年12月09日
**-------------------------------------------------------------------------------------------------------
** 修 改 人:
** 日   期:
**-------------------------------------------------------------------------------------------------------
********************************************************************************************************/
signed char TemperatureLine(uint16 ADT)
{
    uint16 Current;
    signed   char TEMPT;
    unsigned long R,Yout,Temperature,ADResult_T;
    signed   long T;
    Temperature  = ADT;
    ADResult_T   = 5000 - Temperature;
    Current      = (unsigned int)(ADResult_T*10/100);//扩大10倍计算出电流值 100表示100K电阻
    R            = Temperature*10000;
    R            = R/Current;                          //R/Current/1000;;
    if(R > 181385) //小于-30度    
    {
		T = -30;    
    }
	else if(R > 32851)   //小于零度 0 ~ -30
		 {
		     Yout         = 1000000000/(1000+0.0169*R);  //将结果扩大到小数点后六位
		     T            = Yout - 647275;                       
		     //T            = T/1344;                    //温度取三位整数
			 T            = T/13440;                     //温度取2位整数 		
		 }
		 else if(R > 8052)           //小于30度 0 ~ +30
		      {
			 	  Yout = 1000000000/(1000+0.082*R);      //将结果扩大到小数点后六位
				  T    = Yout - 268487;                  
				  //T    = T/1120;                       //温度取三位整数 
                  T    = T/11200;                        //温度取2位整数          
		      }
		      else if(R > 2488)      //小于60度  +30 ~ +60
		           {
				 	   Yout = 1000000000/(1000+0.305*R); //将结果扩大到小数点后六位
					   T    = Yout - 9671;                
					   //T    = T/940;                   //温度取三位整数 
		 		       T    = T/9400;                    //温度取2位整数   
		           }
		           else if(R > 920)  //小于90度    +60 ~ +90
		                {
					 	    Yout = 1000000000/(1000+0.928*R); 
						    T    = Yout + 176081;                
						    //T    = T/796;             //温度取三位整数 
		                	T    = T/7960;              //温度取2位整数 
		                }
		                else T = 90;                    //高于90度
	TEMPT  = (signed char)(T);
    return TEMPT;
} 
/*********************************************************************************************************
** 函数名称: uint16 Adc_Collect(uint8 adchannel)
** 功能描述: 模数转换函数
** 输   入: 无
** 输   出: 无
** 全局变量: 
** 调用模块: 
**
** 作   者: 李伟
** 日   期: 2008年12月09日
**-------------------------------------------------------------------------------------------------------
** 修 改 人:
** 日   期:
**-------------------------------------------------------------------------------------------------------
********************************************************************************************************/
uint16 Adc_Collect(uint8 adchannel)
{
    uint32 Result,ad_data,t;
    uint16 LDATA;
    uint8  i,j;
    //WDT_CONTR = 0x3c;       /************************喂狗************************/
    ADC_CONTR|= 0x80;         /*AD_Power_On*/
    delaynms(2);
	if(adchannel == NEG_CURRENT)    //P1.2 used for negative current collect
	{
	    ADC_CONTR = 0xE2;     /*ADC_Power_On_Speed_Channel_2 0xe2;11100010B P1.2做为A/D输入*/
		delaynms(2);	
	}
	else if(adchannel == ACT_CURRENT)	  //P1.3 used for active current collect
		 {
		 	 ADC_CONTR = 0xE3;
			 delaynms(2);
		 }
		 else if(adchannel == OUTS_TEMPERATURE)    //P1.4 used for outside temperature collect
		 	  {
			  	  ADC_CONTR = 0xE4;
				  delaynms(2);
			  }
			  else if(adchannel == CELL_TEMPERATURE)     //P1.5 used for cell temperature collect
			  	   {
				   	   ADC_CONTR = 0xE5;
					   delaynms(2);
				   }
				   else if(adchannel == CELL_VOLTAGE)	   //P1.6 used for cell voltage collect
				        {
							ADC_CONTR = 0xE6;
							delaynms(2);
						}
    for(i = 0;i < 10;i++)
    {
        Result = Get_AD_Result();
        sum[i] = Result;
    }
	//A11 = 1;    //close the channel
	//A12 = 1;	//close the channel
    for(j = 0;j < 10;j++)
    {
        for(i = 0;i < 9-j;i++)
        {
            if(sum[i] > sum[i+1])
            {
                t = sum[i];sum[i] = sum[i+1];sum[i+1] = t;
            }
        }
    }
	ad_data = 0;
    for(i = 3;i <= 6;i++)
    {
        ad_data += sum[i];
    }
    Result = ad_data/4;
	if(adchannel == NEG_CURRENT)
	{
		;
	}
	else if(adchannel == ACT_CURRENT)
	     {
		 	;
		 }
		 else if(adchannel == OUTS_TEMPERATURE)
		      {
			      Result*= 5000;   //5000
				  Result/= 1024;
				  Result*= OTK;
				  Result/= 10000;
			  } 
			  else if(adchannel == CELL_TEMPERATURE)
		           {
			           Result*= 5000;   //5000
				       Result/= 1024;
				       Result*= CTK;
				       Result/= 10000;
//					   Suart_Send_Byte(0xAA);
//					   Suart_Send_Byte(Result>>8);
//					   Suart_Send_Byte(Result);
//					   Suart_Send_Byte(0xBB);
			       }
				   else if(adchannel == CELL_VOLTAGE)
						{
							Result*= 10000;   //5000*2
							Result/= 1024;
						    Result*= CUK;
							Result/= 10000;
						}
    LDATA  = (uint16)(Result);
    return(LDATA);
}
/********************************************************************************************************
                                               End of file
********************************************************************************************************/

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -