?? stc12c5410ad溫濕度采集并將模擬量通過(guò)對(duì)半查找法查表轉(zhuǎn)換.c
字號(hào):
/************************************************
文件名稱(chēng):adc0.c
文件說(shuō)明:ad轉(zhuǎn)換,采集溫度模擬量
#define ADC_Power_On_Speed_Channel_0 0xc0 //P1.0作為AD輸入
#define ADC_Power_On_Speed_Channel_1 0xc1 //P1.1作為AD輸入
#define TempHH_AD_50 298 //AD轉(zhuǎn)化最大值
#define TempLL_AD_0 754 //AD轉(zhuǎn)化最小值 (用于故障判斷)
#define TempE1_AD 190
#define TempE2_AD 800 //故障狀態(tài)下AD值
#define HumiHH_AD_90 580
#define HumiLL_AD_10 180
#define HumiE1_AD 600
#define HumiE2_AD 150
//#define Humi_AD_Max
unsigned int tempture = 0; //整型溫度值
unsigned int huminity = 0; //整型濕度值
unsigned int moni[2] = {0,0}; //模擬量數(shù)組,存放溫度和濕度(或溫度)
unsigned int moni_AD[2][NUM_of_RESULTS] = {{0,0,0,0,0,0,0,0},{0,0,0,0,0,0,0,0}}; //存放序列通道單次轉(zhuǎn)換的AD值用于濾波處理
uchar Temp_Err_Value = 0; //溫度故障標(biāo)志
uchar Humi_Err_Value = 0; //濕度故障標(biāo)志
void delay(unsigned char us)
{
unsigned int i,j;
for(i=0;i<us;i++)
{
for(j=0;j<25;j++)
{}
}
}
/***********************************************
名稱(chēng):init_ADC10
描述:
***********************************************/
void init_adc10(void)
{
ADC_CONTR |= 0x80; //開(kāi)AD轉(zhuǎn)換電源
delay(32); //上電延時(shí)大約1ms
P1M0 |= 0x03;
P1M1 &= 0xfc; //P1.0 P1.1為高阻態(tài)模式
delay(5);
}
/************************************************
名稱(chēng):start_ADC12
描述:?jiǎn)?dòng)AD轉(zhuǎn)換
*************************************************/
void start_ADC10(void)
{
static unsigned int index=0;
unsigned int adcdata;
ADC_CONTR = ADC_Power_On_Speed_Channel_0; //選擇P1.0為轉(zhuǎn)換通道
delay(10);
ADC_CONTR |= 0x08; //啟動(dòng)ADC10
while((ADC_CONTR&0x10) == 0) {} //等待AD轉(zhuǎn)換完畢
ADC_CONTR &= 0xe7; //清0 ADC_FLAG ,ADC_START位 ,停止AD轉(zhuǎn)換
adcdata = ADC_DATA;
adcdata = adcdata << 2;
ADC_LOW2 &= 0x03; //清除高6位,保留低2位有效值
adcdata = adcdata + ADC_LOW2;
moni_AD[0][index] = adcdata;
ADC_CONTR = ADC_Power_On_Speed_Channel_1; //選擇P1.1為轉(zhuǎn)換通道
delay(10); //延時(shí)60us
ADC_DATA = 0;
ADC_CONTR |= 0x08; //啟動(dòng)ADC10
while((ADC_CONTR&0x10) == 0) {} //等待AD轉(zhuǎn)換完畢
ADC_CONTR &= 0xe7; //清0 ADC_FLAG ,ADC_START位 ,停止AD轉(zhuǎn)換
adcdata = ADC_DATA;
adcdata = adcdata << 2;
ADC_LOW2 &= 0x03; //清除高6位,保留低2位有效值
adcdata = adcdata + ADC_LOW2;
moni_AD[1][index] = adcdata;
index=(index+1)%NUM_of_RESULTS;
}
/***********************************************
名稱(chēng):filter
描述:濾波程序,為平均值濾波法
************************************************/
void filter(void)
{
unsigned char i,j;
unsigned long int t;
for(i=0;i<2;i++)
{
t=0;
for(j=0;j<NUM_of_RESULTS;j++)
t=t+(unsigned long)moni_AD[i][j]; //將采集到的模擬值相加求和
moni[i]=t/NUM_of_RESULTS; //求平均值
}
}
/**************************************************************
名稱(chēng):judg_err
描述:系統(tǒng)錯(cuò)誤判斷
入口參數(shù):無(wú)
出口參數(shù):無(wú)
說(shuō)明:根據(jù)各通道的平均模擬量判斷系統(tǒng)故障,并向全局變量賦予相應(yīng)的故障值
***************************************************************/
void judg_err(void)
{
Temp_Err_Value = 0;
Humi_Err_Value = 0;
if((moni[0] < TempE1_AD) || (moni[0] > TempE2_AD))
Temp_Err_Value = 0x01; //故障值
else if(moni[0] < TempHH_AD_50)
Temp_Err_Value = 0x02; //溫度過(guò)高值
else if(moni[0] > TempLL_AD_0)
Temp_Err_Value = 0x03; //溫度過(guò)低值
if((moni[1] < HumiE2_AD) || (moni[1] > HumiE1_AD))
Humi_Err_Value = 0x01; //濕度故障值
else if(moni[1] > HumiHH_AD_90)
Humi_Err_Value = 0x02; //濕度過(guò)高值
else if(moni[1] < HumiLL_AD_10)
Humi_Err_Value = 0x03; //濕度過(guò)低值
}
/********************************************************
名稱(chēng):check_humi_ku
描述:根據(jù)moni[1]的值在溫度表中查出對(duì)應(yīng)的濕度值
入口參數(shù):ADdata ,為ADC12采集到的模擬量moni[1]減溫度基準(zhǔn)TEMPBASE
出口參數(shù):local , 為humi_table中的位置
*********************************************************/
unsigned int check_ADdata_ku(uint ADdata, uint *ADdata_ku, uint num_ku)
{
unsigned char sign=1;
int local;
unsigned int top=0;
unsigned int bottom = num_ku - 1;
unsigned int mid;
if(ADdata < ADdata_ku[0] || ADdata > ADdata_ku[num_ku-1]) //判斷AD值是否超出范圍
{
sign=0;
local = -1;
}
while((sign == 1) && (top <= bottom)) //使用對(duì)折法查找ADdata在溫度表中對(duì)應(yīng)的位置
{
mid = ((top+bottom) >> 1);
if(ADdata == ADdata_ku[mid])
{
local = mid;
sign = 0;
}
else if(ADdata < ADdata_ku[mid])
{
if(ADdata > ADdata_ku[mid-1])
{ local = mid-1;
sign = 0;
}
else
bottom = mid-1;
}
else
{
if(ADdata < ADdata_ku[mid+1])
{ local = mid;
sign = 0;
}
else
top = mid+1;
}
}
return local;
}
/****************************************************************
名稱(chēng):shiji_temp
描述:求實(shí)際溫度值并放大10倍
入口參數(shù):
出口參數(shù):無(wú)
說(shuō)明:根據(jù)AD采樣結(jié)果用查表法求出實(shí)際對(duì)應(yīng)的溫度值()
****************************************************************/
void shiji_temp(void)
{
uchar i;
uint temp; //用于指示moni[0]在表中的位置,也代表整型溫度值
uint j,k;
temp = check_ADdata_ku(moni[0]-TEMPBASE, temp_table, N_TEMP_TABLE ); //求moni[0]在表中的位置
tempture = temp * 10; //求實(shí)際整型溫度值擴(kuò)大10倍放入全局變量tempture中
j = (temp_table[temp+1] - temp_table[temp]); //此溫度值的相鄰AD間隔差值
k = (moni[0]-temp_table[temp]-TEMPBASE) * 10; //求實(shí)際AD值與區(qū)間初值的差(對(duì)應(yīng)小數(shù)部分)
for(i = 1;i < 10;i++)
{
if(k >= i * j) //求小數(shù)部分,分辨力0.1
tempture=tempture + 1;
else
break;
}
if(tempture >= 510)
tempture = 0;
else
tempture = 510 - tempture;
}
/****************************************************************
名稱(chēng):shiji_humi
描述:求實(shí)際濕度值并放大10倍
入口參數(shù):
出口參數(shù):無(wú)
說(shuō)明:根據(jù)AD采樣結(jié)果用查表法求出實(shí)際對(duì)應(yīng)的溫度值()
****************************************************************/
void shiji_humi(void)
{
unsigned char i;
unsigned int humi; //用于指示moni[1]在表中的位置,也代表整型濕度值
unsigned int j,k;
if(tempture >= 350)
{
humi = check_ADdata_ku(moni[1]-TEMPBASE, humidity_table1, N_HUMI_TABLE); //求moni[0]在表中的位置
huminity = 20 + humi * 5; //求整型濕度
j = (humidity_table1[humi + 1] - humidity_table1[humi]); //此區(qū)間相鄰間隔的差
k = (moni[1] - humidity_table1[humi] - HUMIBASE)*5; //求實(shí)際濕度AD與區(qū)間初值的差擴(kuò)大5倍
for(i=1;i<5;i++)
{
if(k >= i*j)
huminity = huminity + 1;
else
break;
}
}
else
{
humi = check_ADdata_ku(moni[1]-TEMPBASE, humidity_table2, N_HUMI_TABLE);
huminity = 20 + humi * 5; //求整型濕度
j = (humidity_table2[humi + 1] - humidity_table2[humi]); //此區(qū)間相鄰間隔的差
k = (moni[1] - humidity_table2[humi] - HUMIBASE)*5; //求實(shí)際濕度AD與區(qū)間初值的差擴(kuò)大5倍
for(i=1;i<5;i++)
{
if(k >= i*j)
huminity = huminity + 1;
else
break;
}
}
}
?? 快捷鍵說(shuō)明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -