|
標(biāo)參點(diǎn)之間的溫度區(qū)間以線性處理這樣可以節(jié)省內(nèi)存,但是,無疑會(huì)使精度大大降低,精確不到0.1,而且另一個(gè)問題接踵而至,那就是分度的問題,步長太高就會(huì)導(dǎo)致小數(shù)點(diǎn)后尾數(shù)的減小,不利于計(jì)算和處理,而變大則精度大大降低,所以在這種問題上要經(jīng)過實(shí)際的實(shí)驗(yàn)才可以得到結(jié)果,配合我的顯示程序最終為9分度,步長是可變的,對于不需非常非常精確的場合足以!
2012/11/14
小ARM菜菜
日照
/*
作者:小ARM菜菜
Q Q :925295580
AD處理
*/
void ad_process(uint16_t ad_data,uint16_t *p)//ad數(shù)據(jù)處理
{
uint8_t i;
uint8_t n;
if(ad_data<*p)
{Dispaly_SEGD5(0); //小數(shù)點(diǎn)
Dispaly_SEGD3(0);//
Dispaly_SEGD4(0);return ;
}//如果小于0度,按照0度處理
for(i=0;i<33;i++)//0攝氏度到32攝氏度
{
if((*p<ad_data)&&(*(p+1)>ad_data))
{
if(set_tem>i)//判斷溫度是否達(dá)到設(shè)定溫度(手動(dòng)必須關(guān)閉)
{
if(hand_ctrl==0)
{
display_s1_s2_s3_s4_s5_p(0,1,1,0,1,1); //開啟
Relay =0;
}
}
else
{
if(hand_ctrl==0)
{
display_s1_s2_s3_s4_s5_p(0,1,0,1,1,1);//關(guān)閉
Relay =1;
}
}
n=*(p+1)-*p;
n=n/9;
ad_data=(ad_data-*p);
n=ad_data/n;
Dispaly_SEGD5(n); //小數(shù)點(diǎn)
Dispaly_SEGD3(i/10);//
Dispaly_SEGD4(i%10);
return ;
}
else
if(*p==ad_data)//如果相等,那么直接返回點(diǎn)溫度值
{
Dispaly_SEGD5(0); //小數(shù)點(diǎn)
Dispaly_SEGD3(i/10);//
Dispaly_SEGD4(i%10);
}
p++;
}
}
|
|