標(biāo)題: 基于stc12c5a32s2單片的18b20溫度顯示固定數(shù)值不變,以下是程序,哪位大神能否指導(dǎo)... [打印本頁]

作者: tony2dora    時間: 2018-8-24 17:18
標(biāo)題: 基于stc12c5a32s2單片的18b20溫度顯示固定數(shù)值不變,以下是程序,哪位大神能否指導(dǎo)...
#include "ds18b20.h"


void delay(uint z)
{
   uint x,y;
   for(x=z;x>0;x--)
      for(y=110;y>0;y--);
}
void dsreset(void)  //復(fù)位,初始化
{
   uint i;
   ds=0;
   i=103;
   while(i>0) i--;
   ds=1;
   i=4;
   while(i>0) i--;
}
bit tempreadbit(void)
{
   uint i;
   bit dat;
   ds=0;
   i++;
   ds=1;
   i++;
   i++;
   dat=ds;
   i=8;
   while(i>0)i--;
   return dat;
}
uchar tempread(void)   //讀一個字節(jié)函數(shù)
{
   uchar i,j,dat;
   dat=0;
   for(i=1;i<=8;i++)
   {
      j=tempreadbit();
   dat=(j<<7)|(dat>>1);  //讀出的數(shù)據(jù)最低位在最前面,這樣剛好一個字節(jié)在dat里
   }
   return dat;
}
void tempwritebyte(uchar dat)   //寫一個字節(jié)函數(shù)
{
   uint i;
   uchar j;
   bit testb;
   for(j=1;j<=8;j++)
   {
       testb=dat&0x01;
    dat=dat>>1;
    if(testb)
    {
       ds=0;
    i++;
    i++;
    ds=1;
    i=8;
    while(i>0)i--;
  }
     else
  {
    ds=0;
    i=8;
    while(i>0)i--;
    ds=1;
    i++;
    i++;
  }
}
}
void tempchange(void)  //開始獲取溫度并轉(zhuǎn)換
{
    dsreset();
delay(1);
tempwritebyte(0xcc);
tempwritebyte(0x44);
}
uint get_temp(void)
{
   uchar a,b;
   uint temp;
   dsreset();
   delay(1);
   tempwritebyte(0xcc);
   tempwritebyte(0xbe);
   a =tempread();                           //存放溫度值的低字節(jié)
   b =tempread();
   temp=b;
   temp<<=8;
   temp=temp|a;
   temp=temp*0.0625*10+0.5;
   return temp;
}
顯示程序在主函數(shù)
tempchange();//調(diào)用溫度轉(zhuǎn)換函數(shù)
LcdDisplay(get_temp());   //讀取溫度并顯示
void LcdDisplay(int temp)   //lcd顯示
{   
   unsigned char datas[] = {0, 0, 0, 0, 0}; //定義數(shù)組
float tp;  
if(temp< 0)    //當(dāng)溫度值為負數(shù)
   {
  temp=temp-1;
  temp=~temp;
  tp=temp;
  temp=tp*0.0625*100+0.5;
   }
  else
   {   
   
  tp=temp;//因為數(shù)據(jù)處理有小數(shù)點所以將溫度賦給一個浮點型變量
  temp=tp*0.0625*100+0.5;
}
datas[0] = temp / 10000;
datas[1] = temp % 10000 / 1000;
datas[2] = temp % 1000 / 100;
datas[3] = temp % 100 / 10;
datas[4] = temp % 10;
write_str("溫度:");
write_data('0'+datas[1]|0x30);
write_data('0'+datas[2]|0x30);
write_data('.');
write_data('0'+datas[3]|0x30);
write_data('0'+datas[4]|0x30);
location(4,6);
write_data(0xA1);
write_data(0xE6);
}

作者: 1984528951    時間: 2018-8-24 17:43
讀取后好像沒有返回
作者: 歷程龍    時間: 2018-8-24 18:12
我也沒看到返回

作者: a庚    時間: 2018-8-25 17:11
沒刷新顯示
作者: tony2dora    時間: 2018-8-27 08:11
歷程龍 發(fā)表于 2018-8-24 18:12
我也沒看到返回

怎么樣修改才有返回呢
作者: yousunny    時間: 2018-8-27 10:06
1984528951 發(fā)表于 2018-8-24 17:43
讀取后好像沒有返回

顯示程序在主函數(shù)
tempchange();//調(diào)用溫度轉(zhuǎn)換函數(shù)
LcdDisplay(get_temp());   //讀取溫度并顯示
void LcdDisplay(int temp)   //lcd顯示
{   
   unsigned char datas[] = {0, 0, 0, 0, 0}; //定義數(shù)組
float tp;  
if(temp< 0)    //當(dāng)溫度值為負數(shù)
   {
  temp=temp-1;
  temp=~temp;
  tp=temp;
  temp=tp*0.0625*100+0.5;
   }
  else
   {   
   
  tp=temp;//因為數(shù)據(jù)處理有小數(shù)點所以將溫度賦給一個浮點型變量
  temp=tp*0.0625*100+0.5;
}
datas[0] = temp / 10000;
datas[1] = temp % 10000 / 1000;
datas[2] = temp % 1000 / 100;
datas[3] = temp % 100 / 10;
datas[4] = temp % 10;
write_str("溫度:");
write_data('0'+datas[1]|0x30);
write_data('0'+datas[2]|0x30);
write_data('.');
write_data('0'+datas[3]|0x30);
write_data('0'+datas[4]|0x30);
location(4,6);
write_data(0xA1);
write_data(0xE6);
}
他書主函數(shù)調(diào)用了
作者: 熊熊生風(fēng)    時間: 2018-8-27 11:29
uint get_temp(void)
{
   uchar a,b;
   uint temp;
   dsreset();
   delay(1);
   tempwritebyte(0xcc);
   tempwritebyte(0xbe);
   a =tempread();                           //存放溫度值的低字節(jié)
   b =tempread();
   temp=b;
   temp<<=8;
   temp=temp|a;
   temp=temp*0.0625*10+0.5;
   return temp;
}
這個函數(shù)已經(jīng)是溫度了,樓上那一段又算了一遍,但也沒有看到哪里調(diào)用了這段函數(shù)。復(fù)雜。
啟動溫度采集,等待足夠時間(看配置,有的配置好像需要900ms左右,其他忘了),讀取數(shù)據(jù),一般就可以了。就算手不去摸他;径紩。
作者: tony2dora    時間: 2018-8-27 14:13
熊熊生風(fēng) 發(fā)表于 2018-8-27 11:29
uint get_temp(void)
{
   uchar a,b;

LcdDisplay(get_temp());   在主函數(shù)的顯示函數(shù)調(diào)用了
作者: fhmd    時間: 2018-8-28 01:40
LcdDisplay(get_temp());   //讀取溫度并顯示 需要加一個中間變量,分開寫
作者: 人中狼    時間: 2018-8-28 10:27
temp=b;
   temp<<=8;
   temp=temp|a;
   temp=temp*0.0625*10+0.5;
   return temp;
這里的temp*0.0625*10+0.5;去除

temp=tp*0.0625*100+0.5;
   }
  else
   {   
   
  tp=temp;//因為數(shù)據(jù)處理有小數(shù)點所以將溫度賦給一個浮點型變量
  temp=tp*0.0625*100+0.5;
}
這里改成 temp=(tp*0.0625*100+0.5)*100;
   }
  else
   {   
   
  tp=temp;//因為數(shù)據(jù)處理有小數(shù)點所以將溫度賦給一個浮點型變量
  temp=(tp*0.0625*100+0.5)*100;
}





歡迎光臨 (http://www.torrancerestoration.com/bbs/) Powered by Discuz! X3.1