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

📄 ad.c

📁 采用MPS430控制的项目
💻 C
字号:
#define   _AD_
#include  "..\Inc\includes.h"
/*********************************************************************************************************
* 函数名称:AD_rest
*
* 功能描述:AD功能初始化
*
* 说明:
* 
********************************************************************************************************/
void   AD_rest(void)
{
	P6SEL      |=   0xc0;              // 外围功能模块 高2位 **
  	ADC12CTL0   =   ADC12CTL0&0xfd;    // 设置前将复位ADC使能  ENC=0 
  	ADC12CTL1   =   0x0200;
}
/*********************************************************************************************************
* 函数名称:AD
*
* 功能描述:启动AD转换
*
* 说明:
* 
********************************************************************************************************/
unsigned int AD(unsigned char  m)
{
	ADC12CTL0 = ADC12CTL0&0xfd;  // 设置前将复位ADC使能  ENC=0 
    ADC12MCTL0= 0xf0;            // 单次转换,选参考电压,默认通道为0 
    ADC12MCTL0= ADC12MCTL0|m;    // 选择测试通道 
	ADC12CTL0 = 0x0010+SHT0_8;   // ?????????????????
   	ADC12CTL0 = ADC12CTL0|0x02;  // 使能ADC转换  ENC=1
   	ADC12CTL0 = ADC12CTL0|0x01;  // 开始转换
   	ADC12CTL0 = ADC12CTL0&0xfe;
   	while((ADC12CTL1&0x01)==1);
   	return(ADC12MEM[0]); 
}
/*********************************************************************************************************
* 函数名称:ADC
*
* 功能描述:启动AD转换
*
* 说明:
* 
********************************************************************************************************/ 
unsigned int   ADC(unsigned char  m)
{
	unsigned int temp=0;
    unsigned char i;
    switch(m)
    {
    	case 0x00:CH_A0 CH_B0 CH_C0 CH_D0 break;
    	case 0x01:CH_A1 CH_B0 CH_C0 CH_D0 break;
    	case 0x02:CH_A0 CH_B1 CH_C0 CH_D0 break;
    	case 0x03:CH_A1 CH_B1 CH_C0 CH_D0 break;
    	case 0x04:CH_A0 CH_B0 CH_C1 CH_D0 break;
    	case 0x05:CH_A1 CH_B0 CH_C1 CH_D0 break;
    	case 0x06:CH_A0 CH_B1 CH_C1 CH_D0 break;
    	case 0x07:CH_A1 CH_B1 CH_C1 CH_D0 break;
    	case 0x08:CH_A0 CH_B0 CH_C0 CH_D1 break;
    	case 0x09:CH_A1 CH_B0 CH_C0 CH_D1 break;
    	case 0x0a:CH_A0 CH_B1 CH_C0 CH_D1 break;
    	case 0x0b:CH_A1 CH_B1 CH_C0 CH_D1 break;
    	case 0x0c:CH_A0 CH_B0 CH_C1 CH_D1 break;
    	case 0x0d:CH_A1 CH_B0 CH_C1 CH_D1 break;
   	 	case 0x0e:CH_A0 CH_B1 CH_C1 CH_D1 break;
    	case 0x0f:CH_A1 CH_B1 CH_C1 CH_D1 break;
    	default:  CH_A0 CH_B0 CH_C0 CH_D0 break;
    }
    for(i=0;i<100;i++);		//切换通道后,做适当延时
    for(i=0;i<8;i++)
    {
	    if((1<i)||(i<6))	temp=(temp+AD(3))/2;
    }
    return temp;
}
/*********************************************************************************************************
* 函数名称:CaiJiData
*
* 功能描述:定时采集模拟通道数据,开关量通道数据,读取时间,并刷新显示
*
* 说明:
* 
********************************************************************************************************/
void CaiJiData(void)
{
Uint16 Data;
	ADSam();
	DISam();
	Time_rd_data();
	if(Time_now[3]!=LastSaveDataTime[0])
	{
		if(Time_now[4]==LastSaveDataTime[1])
		{
			if((Time_now[5]>=LastSaveDataTime[2]-1)||(Time_now[5]<=LastSaveDataTime[2]+1))
			{
				LastSaveDataTime[0] = Time_now[3];
				LastSaveDataTime[1] = Time_now[4];
				LastSaveDataTime[2] = Time_now[5];
				Task |= Save_Data;
			}
		}
	}
	if(Menu_ID==14)			//实时显示
	{
		if(Set_temp==0)	Data = ADSam_Value[Set_array_count];
			else 		Data = DISam_Value[Set_array_count];
		Disp_Caiji_Data(Data,Set_temp,Set_array_count);
		Disp_Time();	  	//显示当前系统时间
	}
	Task &=~ CaiJi_Data;
}
/*********************************************************************************************************
* 函数名称:temp
*
* 功能描述:采集温度
*
* 说明:测温范围 -40 ~ 60..并放大了10倍..无符号
* 
********************************************************************************************************/
unsigned int temp(unsigned char x)
{
	float t;
  	t = ADC(x)+Zero-ADAlarm_para[2][x];
  	if(t<0)	t=0;
  	t = t * 0.244140625;  //t*2.5/4096*2      //t/5*1000
//  	t = t*0.001220703125;    //t/4096*5
//  	t = t / 0.05;          	 //t/5*100
//  	t = t - 40;
//	t = t * 10;
  	return t;
}
/*********************************************************************************************************
* 函数名称:humid
*
* 功能描述:采集湿度
*
* 说明:湿度范围0-100g/m3 ..放大了10倍
* 
********************************************************************************************************/
unsigned int humid(unsigned char x)	
{
	float t;
  	t = ADC(x)+Zero-ADAlarm_para[2][x];
  	if(t<0)	t=0;
  	t = t * 0.244140625;  //t*2.5/4096*2      //t/5*1000
  	return t;
}
/*********************************************************************************************************
* 函数名称:volt
*
* 功能描述:
*
* 说明:蓄电池电压范围0-60V  放大了10倍
* 
********************************************************************************************************/
unsigned int volt(unsigned char x)	
{
	float t;
  	t = ADC(x)+Zero-ADAlarm_para[2][x];
  	if(t<0)	t=0;
  	t = t*0.146484375;  //t*2.5/4096*2   //t/5*600
  	return t;
}
/*********************************************************************************************************
* 函数名称:current
*
* 功能描述:
*
* 说明:电流范围0-10A 放大了10倍
* 
********************************************************************************************************/
unsigned int current(unsigned char x)
{
	float t;
  	t = ADC(x)+Zero-ADAlarm_para[2][x];
  	if(t<0)	t=0;
  	t = t*0.0244140625;  //t*2.5/4096*2   //t/5*100
  	return t;
}
/*********************************************************************************************************
* 函数名称:ADSam
*
* 功能描述:采集所有模拟通道(未完成)
*
* 说明:
* 
********************************************************************************************************/
void ADSam(void)
{
	Uint16 i, k;
  	for(i=0;i<16;i++)
  	{
    	if(ADSam_Code[i] != 0)
    	{
    		if(ADSam_Code[i] < 32)	k = 10;else k = ADSam_Code[i] - 32;
      		switch(MoniCode[k])
      		{	
   			case 0: ADSam_Value[i] = volt(i);		break;//电压
       		case 1: ADSam_Value[i] = current(i); 	break;//电流
       		case 2: ADSam_Value[i] = temp(i);		break;//温度
            case 3: ADSam_Value[i] = humid(i);		break;//湿度
	        default:ADSam_Value[i] = ADC(i)*10;		break;//不是该范围内,显示AD代码0-4095,放大10倍
			}
			if(ADSam_Value[i]>ADAlarm_para[0][i])		k = 0x02;	//上限告警
			else if(ADSam_Value[i]<ADAlarm_para[1][i])	k = 0x01;   //下限告警
			else										k = 0x0;
			if(k != 0)				    //有告警
			{
				if(k != ADSam_Alarm[i])//有告警且本次告警同以前告警内容不同,视为新增告警
				{	
					SaveAlarm(0,i,ADSam_Code[i],k);
					DATAFLAG |= 0x01;
				}
			}
			ADSam_Alarm[i] = k;
		}
		if(ADSam_Value[i]>ADMax[i])		ADMax[i] = ADSam_Value[i];
		if(ADSam_Value[i]<ADMin[i])		ADMin[i] = ADSam_Value[i];
	}
}
/*********************************************************************************************************
* 函数名称:DISam
*
* 功能描述:采集所有开关量数据
*
* 说明:
* 
********************************************************************************************************/
void DISam(void)
{
	unsigned char i;
  	unsigned int k;
  	for(i=0;i<16;i++)
  	{
    	if(DISam_Code[i]!=0)
    	{
     		k = input();
     		k = (k>>i)&0x01;
   			if(i == DIDOOR || i == DILOCK)
  			{
   				if(HaveDoorRight==0 && k == 0)
   				{
   					ALARM1
   				}
   			}
     		else if(k==1&&DISam_Value[i]==0)					//本次输入闭合,上次为短开,视为新增报警
     		{
   				DISam_Alarm[i] = 0x04;
   				DISam_Value[i] = k;
   				SaveAlarm(1,i,DISam_Code[i],0x04);
				DATAFLAG |= 0x10;
     		}
     		DISam_Value[i] = k;
    	}
  	}
}
/*********************************************************************************************************
* 函数名称:CountZero
*
* 功能描述:用于校正零点
*
* 说明:
* 
********************************************************************************************************/
Uint16 CountZero(Uint16 code,Uint16 old,Uint16 jz,Uint16 ld)
{
	switch(code)
	{
	case 0:old /= 0.0244140625;jz /= 0.0244140625; break;//电压
	case 1:old /= 0.0244140625;jz /= 0.0244140625; break;//电流
	case 2:old /= 0.244140625; jz /= 0.244140625;  break;//温度
	case 3:old /= 0.244140625; jz /= 0.244140625;  break;//湿度
	default:break;
	}
	old = old + Zero - ld;
	ld = jz + Zero - old;
	return ld;
}
/********************************************************************************************************/


⌨️ 快捷键说明

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