📄 ad.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 + -