色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

您好,歡迎來電子發燒友網! ,新用戶?[免費注冊]

您的位置:電子發燒友網>電子元器件>傳感器>

DS18b20如何讀取它的負溫度值呢? - 全文

2017年11月23日 15:24 網絡整理 作者: 用戶評論(0
關鍵字:DS18B20(80746)

  單片機 測溫芯片 18B20 是一款常用的IC,優勢特點不多說,這里主要討論溫度值的處理,尤其是負溫度。

  18B20片內有一個9Byte的 SRAM 和一個3Byte的 EEPROM。如下圖:

 DS18b20如何讀取它的負溫度值呢?

  其中我們需要使用的就是SRAM中的前兩個字節,這里儲存的就是我們要的溫度值。這兩個字節的結構如下:

 DS18b20如何讀取它的負溫度值呢?

  我們可以看到,LS(低字節)的高四位 和 MS(高字節)的低四位共8個字節構成了實際的一個帶符號位的字節數據可以表示(-128~127)足夠表示18B20的溫度范圍。MS的高四位為符號為的擴展,當溫度值為正時MS高5位(圖中S的五位)全為0,溫度值為負時全為1。LS的低四位為小數部分,不是要求太高的話可以忽略。我們這里暫不套路小數部分的處理方法。

  下面我們就來討論整數部分的數據處理方法。

  整數部分我們實際只要高字節的第四位和低字節的高四位。首先通過移位求或后生成一個無符號位的字節。然后判斷這個無符號的值是否大于127,如果大于128說明是個負溫度需要處理,否則就可以直接返回。

  18B20的負溫度使用補碼形式輸出,我們只需要對這個字節進行取反加1后就是這個負溫度的絕對值,這時候我們需要一個符號標記告訴輸出函數這是個負溫度需要顯示負號即可。

  下面貼出數據處理部分的代碼:

  uchar readtemp() //讀取溫度

  {

  uchar temp = 0;

  uchar tmp[2]

  reset();

  writebyte(0xCC); // 跳過序列號

  writebyte(0x44); // 啟動溫度轉換

  delayms(1000);

  reset();

  writebyte(0xCC);

  writebyte(0xBE); //讀9個寄存器,前兩個為溫度

  tmp[0]=readbyte(); //低位

  tmp[1]=readbyte(); //高位

  temp = ((tmp[1]《《4)&0xF0)|((tmp[0]》》4)&0x0F);

  if(temp》127)

  {

  temp = ~temp + 1;

  }

  return (temp);

  }

  如何用51單片機讀取ds18b20的取負溫度?

  18b20的ram中,前兩個字節放的是溫度信息。其中第二個字節的高五位是符號位,當溫度為正的時候,高五位的字節是0,當溫度為負的時候,高五位字節為一。當溫度為正的時候,只需要將兩個字節的數合到一個字節,然后乘以0.0625就是實際的溫度。

  那么,當溫度為負的時候,該怎么讀取溫度呢?是將兩個字節合為一個字節,然后先取反,再加一,最后再和0.0625相乘嗎?這樣得出的結果就是實際的負溫度值嗎?

  判斷是否是負,就是取高幾位的讀取值采用與的方式判斷,比如(000) 11111 00001000,那么高5位可以這樣弄,tempH&0x1f,如果這個值=1;說明是負的,否則就是正的啊,不過有一點,取反是對的,還要加1啊,記得哦。

  至于在LCD中顯示的,確實是按你說的那樣,直接寫上一個符號即可。

  DS18b20 輸出的負溫度數據是定點補碼(小數點后固定二進制四位),符號可由最高位判定(0為正,1為負)。若是負數,則求其補碼即可,具體為“取反加一”或 0x10000 - T (T為度出來的補碼)。

  把讀出來的數temperaturebuffer定義成16位的帶符號整形,進行帶符號的移位,直接轉成浮點數,正負號就在里面了,用下面的表達式,你不用判斷正負。

  ((float)(temperaturebuffer》》4))+((temperaturebuffer&0x0F)/16.0)

  其內有兩個溫度上下限寄存器TH和TL,所采溫度若超過此溫度范圍后會置相應的報警標志位。至于那個校驗,是CRC-8,這并不太復雜,可以找些相關資料了解一下便知。

  DS18B20測負溫度程序

  //main.c

  #include

  #include

  #include “18B20.h”

  #include“disp.h”

  #define uint unsigned int

  #define uchar unsigned char

  const uchar shu[10]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,

  0x82,0xF8,0x80,0x90};

  const uchar bshu[3]={0xff,0xf9,0xbf};

  //延時函數在4M時延時1ms

  void s_1ms(unsigned int ms)

  {

  unsigned int aa;

  for(;ms》=1;ms--)

  {

  for(aa=0;aa《=800;aa++)

  {;}

  }

  }

  void main()

  {

  uint wendu,xiao,ge,shi,bai;

  uchar fh;

  DDRA = 0xff;

  PORTA = 0xff;

  s_1ms(200); //延時200ms

  ds1820_reset(); //DS18B20復位

  while (1)

  {

  ds1820_start();

  wendu = ds1820_read_temp(); //讀取溫度數值

  fh=ds1820_fh();

  if(fh)

  {

  wendu=~(wendu)+1;

  wendu = (wendu * 10)/ 16; //數值處理

  wendu = wendu % 1000;

  shi= wendu / 100; //顯示第2位

  wendu = wendu % 100;

  ge= wendu / 10; //顯示ge位

  xiao=wendu % 10; // 顯示小數位

  display(0,shu[xiao]); //小數位

  display(1,shu[ge]&0x7f); //個位

  display(2,shu[shi]); //shi

  display(3,bshu[2]); //bai位,0不顯示

  }

  else

  {

  wendu = (wendu * 10) / 16; //數值處理

  bai = wendu / 1000; //bai位

  wendu = wendu % 1000;

  shi= wendu / 100; //顯示第2位

  wendu = wendu % 100;

  ge= wendu / 10; //顯示ge位

  xiao=wendu % 10; // 顯示小數位

  display(0,shu[xiao]); //小數位

  display(1,shu[ge]&0x7f); //個位

  display(2,shu[shi]); //shi

  display(3,bshu[bai]); //bai位,0不顯示

  }

  }

  }

  //18B20.h

  #define uchar unsigned char

  #define uint unsigned int

  //設置成輸入

  #define DQ_INPUT DDRC &= ~BIT(7)

  //設置成輸出

  #define DQ_OUT DDRC |= BIT(7)

  //設置成低電平

  #define DQ_LO PORTC &= ~BIT(7)

  //設置成高電平

  #define DQ_HI PORTC |= BIT(7)

  //讀出

  #define DQ_R PINC & BIT(7)

  //中斷標志

  uchar init_f;

  //延時函數

  void delay_us(uint ms)

  {

  uchar tm;

  while(ms--)

  {

  for(tm=0;tm《2;tm++);

  }

  }

  //DS18B20復位

  void ds1820_reset(void)

  {

  uchar i;

  //中斷保護

  init_f = SREG;

  //關中斷

  CLI();

  DQ_OUT;

  DQ_LO;

  delay_us(80); //延時500us

  DQ_HI;

  DQ_INPUT;

  delay_us(10); //延時80us

  i = DQ_R;

  delay_us(80); //延時500us

  if (init_f & 0x80) //恢復中斷狀態

  {

  SEI();

  }

  }

  //DS18B20字節讀取

  uchar ds1820_read_byte(void)

  {

  uchar i;

  uchar value = 0;

  //中斷保護

  init_f = SREG;

  //關中斷

  CLI();

  for (i = 8; i != 0; i--) {

  value 》》= 1;

  DQ_OUT;

  DQ_LO;

  delay_us(2);

  DQ_HI;

  DQ_INPUT;

  if (DQ_R)

  {

  value|=0x80;

  }

  delay_us(10); //延時60us

  }

  if (init_f&&0x80) //恢復中斷狀態

  {

  SEI();

  }

  return(value);

  }

  //DS18B20字節寫入

  void ds1820_write_byte(unsigned char value)

  {

  uchar i;

  init_f = SREG;

  CLI();

  for (i = 8; i 》 0; i--)

  {

  DQ_OUT;

  DQ_LO;

  if (value & 0x01)

  {

  DQ_HI;

  }

  delay_us(10); //延時80us

  DQ_HI;

  value 》》= 1;

  }

  if (init_f & 0x80)//恢復中斷狀態

  {

  SEI();

  }

  }

  //啟動ds1820轉換

  void ds1820_start(void)

  {

  ds1820_reset();

  ds1820_write_byte(0xCC); //勿略ROM

  ds1820_write_byte(0x44); //啟動轉換

  }

  //讀溫度

  uint ds1820_read_temp(void)

  {

  uint i,wendu;

  uchar buf[2];

  ds1820_reset();

  ds1820_write_byte(0xCC); //勿略ROM

  ds1820_write_byte(0xBE); //讀溫度

  for (i = 0; i 《 2; i++)

  {

  buf[i] = ds1820_read_byte();

  }

  wendu = (buf[1]《《8)|buf[0];

  return wendu;

  }

  uint ds1820_fh(void) //讀正負溫度符號

  {

  uint i,bb;

  uchar buf[2];

  ds1820_reset();

  ds1820_write_byte(0xCC); //勿略ROM

  ds1820_write_byte(0xBE); //讀溫度

  for (i = 0; i 《 2; i++)

  {

  buf[i] = ds1820_read_byte();

  }

  bb=buf[1]&0xf0;

  return bb;

  }

  //disp.h

  #define uchar unsigned char

  #define uint unsigned int

  #define SHCP_0 PORTA&=~BIT(1)

  #define SHCP_1 PORTA|=BIT(1)

  #define DS_0 PORTA&=~BIT(3)

  #define DS_1 PORTA|=BIT(3)

  #define STCP_0 PORTA&=~BIT(2)

  #define STCP_1 PORTA|=BIT(2)

  void CKin()

  {

  SHCP_0;

  NOP();

  SHCP_1;

  }

  void Dataout() //并行輸出

  {

  STCP_0;

  NOP();

  STCP_1;

  }

  void Datein( uchar date ) //數據串行輸入

  {

  uchar i,mod;

  DDRA=0xff;

  for(i=0;i《8;i++)

  {

  mod=date&0x80;

  if(mod==0x80)

  {DS_1;}

  else

  {DS_0;}

  CKin();

  date《《=1;

  }

  Dataout(); //并行輸出

  }

  void weihao(uchar add)

  {

  DDRA=0xff;

  switch(add)

  {

  case 0:PORTA=0x1f;break;

  case 1:PORTA=0x1f|0x80;break;

  case 2:PORTA=0x1f|0x40;break;

  case 3:PORTA=0x1f|0xc0;break;

  case 4:PORTA=0x1f|0x20;break;

  case 5:PORTA=0x1f|0xA0;break;

  case 6:PORTA=0x1f|0x60;break;

  case 7:PORTA=0x1f|0xE0;break;

  default:break;

  }

  }

  void DELAY(uint tt)

  {

  uint mm;

  while(tt--)

  {

  for(mm=30;mm》0;mm--);

  }

  }

  void display(uchar wei,uchar data)

  {

  weihao(wei);

  Datein(data);

  DELAY(20);

  weihao(wei);

  Datein(0xff);

  }

上一頁12全文

非常好我支持^.^

(16) 94.1%

不好我反對

(1) 5.9%

( 發表人:李倩 )

      發表評論

      用戶評論
      評價:好評中評差評

      發表評論,獲取積分! 請遵守相關規定!

      ?
      主站蜘蛛池模板: 印度学生xxxxx性14一16| 我与旗袍老师疯狂床震| 色小姐.com| 99久久综合国产精品免费| 九九久久国产精品免费热6| 午夜影院一区二区三区| 国产Av影片麻豆精品传媒| 日本久久精品视频| 放射源分类办法| 熟妇少妇任你躁在线无码| 吃奶吸咪咪动态图| 乳交高H糙汉宠文| 床上色APP下载免费版| 色偷偷777| 国产剧情麻豆mv| 亚洲国产综合另类视频| 色婷婷亚洲五月| 国产99久9在线| 校花被扒衣吸乳羞羞漫画| 国产一区内射最近更新| 亚洲精品中文字幕无码A片蜜桃| 黄色三级网站在线观看| 一区两区三不卡| 免费。色婬网站| h片下载地址| 日日摸夜夜添夜夜爽出水| 国产精品人妻无码久久久2022| 亚洲AV精品无码成人| 黄色网址在线免费观看| 中文字幕乱码亚洲无线三区| 男男高H啪肉Np文多攻多一受| 99久久麻豆AV色婷婷综合| 日本一本道高清码v| 国产人妻午夜无码AV天堂| 伊人久久大香线蕉综合电影 | 嫩小性性性xxxxbbbb| 伧理片午夜伧理片| 久久热国产在线视频| 538在线视频一区二区视视频| 人妻仑乱少妇88MAV| 国产欧美一本道无码|