欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2532|回復: 9
收起左側

基于stc12c5a32s2單片的18b20溫度顯示固定數值不變,以下是程序,哪位大神能否指導...

[復制鏈接]
ID:389725 發表于 2018-8-24 17:18 | 顯示全部樓層 |閱讀模式
#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)  //復位,初始化
{
   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)   //讀一個字節函數
{
   uchar i,j,dat;
   dat=0;
   for(i=1;i<=8;i++)
   {
      j=tempreadbit();
   dat=(j<<7)|(dat>>1);  //讀出的數據最低位在最前面,這樣剛好一個字節在dat里
   }
   return dat;
}
void tempwritebyte(uchar dat)   //寫一個字節函數
{
   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)  //開始獲取溫度并轉換
{
    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();                           //存放溫度值的低字節
   b =tempread();
   temp=b;
   temp<<=8;
   temp=temp|a;
   temp=temp*0.0625*10+0.5;
   return temp;
}
顯示程序在主函數
tempchange();//調用溫度轉換函數
LcdDisplay(get_temp());   //讀取溫度并顯示
void LcdDisplay(int temp)   //lcd顯示
{   
   unsigned char datas[] = {0, 0, 0, 0, 0}; //定義數組
float tp;  
if(temp< 0)    //當溫度值為負數
   {
  temp=temp-1;
  temp=~temp;
  tp=temp;
  temp=tp*0.0625*100+0.5;
   }
  else
   {   
   
  tp=temp;//因為數據處理有小數點所以將溫度賦給一個浮點型變量
  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);
}
回復

使用道具 舉報

ID:388013 發表于 2018-8-24 17:43 | 顯示全部樓層
讀取后好像沒有返回

評分

參與人數 1黑幣 +20 收起 理由
admin + 20 回帖助人的獎勵!

查看全部評分

回復

使用道具 舉報

ID:137075 發表于 2018-8-24 18:12 | 顯示全部樓層
我也沒看到返回
回復

使用道具 舉報

ID:80221 發表于 2018-8-25 17:11 | 顯示全部樓層
沒刷新顯示
回復

使用道具 舉報

ID:389725 發表于 2018-8-27 08:11 | 顯示全部樓層

怎么樣修改才有返回呢
回復

使用道具 舉報

ID:308437 發表于 2018-8-27 10:06 | 顯示全部樓層
1984528951 發表于 2018-8-24 17:43
讀取后好像沒有返回

顯示程序在主函數
tempchange();//調用溫度轉換函數
LcdDisplay(get_temp());   //讀取溫度并顯示
void LcdDisplay(int temp)   //lcd顯示
{   
   unsigned char datas[] = {0, 0, 0, 0, 0}; //定義數組
float tp;  
if(temp< 0)    //當溫度值為負數
   {
  temp=temp-1;
  temp=~temp;
  tp=temp;
  temp=tp*0.0625*100+0.5;
   }
  else
   {   
   
  tp=temp;//因為數據處理有小數點所以將溫度賦給一個浮點型變量
  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);
}
他書主函數調用了

評分

參與人數 1黑幣 +30 收起 理由
admin + 30 回帖助人的獎勵!

查看全部評分

回復

使用道具 舉報

7#
無效樓層,該帖已經被刪除
ID:307368 發表于 2018-8-27 11:29 | 顯示全部樓層
uint get_temp(void)
{
   uchar a,b;
   uint temp;
   dsreset();
   delay(1);
   tempwritebyte(0xcc);
   tempwritebyte(0xbe);
   a =tempread();                           //存放溫度值的低字節
   b =tempread();
   temp=b;
   temp<<=8;
   temp=temp|a;
   temp=temp*0.0625*10+0.5;
   return temp;
}
這個函數已經是溫度了,樓上那一段又算了一遍,但也沒有看到哪里調用了這段函數。復雜。
啟動溫度采集,等待足夠時間(看配置,有的配置好像需要900ms左右,其他忘了),讀取數據,一般就可以了。就算手不去摸他。基本都會跳。

評分

參與人數 1黑幣 +90 收起 理由
admin + 90 回帖助人的獎勵!

查看全部評分

回復

使用道具 舉報

ID:389725 發表于 2018-8-27 14:13 | 顯示全部樓層
熊熊生風 發表于 2018-8-27 11:29
uint get_temp(void)
{
   uchar a,b;

LcdDisplay(get_temp());   在主函數的顯示函數調用了
回復

使用道具 舉報

ID:317472 發表于 2018-8-28 01:40 來自觸屏版 | 顯示全部樓層
LcdDisplay(get_temp());   //讀取溫度并顯示 需要加一個中間變量,分開寫
回復

使用道具 舉報

ID:384109 發表于 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;//因為數據處理有小數點所以將溫度賦給一個浮點型變量
  temp=tp*0.0625*100+0.5;
}
這里改成 temp=(tp*0.0625*100+0.5)*100;
   }
  else
   {   
   
  tp=temp;//因為數據處理有小數點所以將溫度賦給一個浮點型變量
  temp=(tp*0.0625*100+0.5)*100;
}
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表