找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開始

搜索
查看: 3427|回復(fù): 0
打印 上一主題 下一主題
收起左側(cè)

單只18B20測(cè)溫程序帶負(fù)溫度(LCD1602寫單字符方式)

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主


單片機(jī)源程序如下:
  1. //單只DS18B20的溫度檢測(cè),測(cè)溫范圍-55 —— +125度,1602液晶顯示。
  2. #include "STC15W4K.H"
  3. #include "DS18b20.h"
  4. #include "myfun.h"
  5. #include "LCD1602.h"
  6. bit flag;                              // flag=0表示正溫,flag=1表示負(fù)溫。
  7. unsigned char baiw,shiw,gew;           // 百位、十位、個(gè)位 ASCII碼
  8. unsigned char point_1,point_2,point_3,point_4;    // 小數(shù)點(diǎn)后1、2、3、4位ASCII碼
  9.         
  10. //****************溫度數(shù)據(jù)處理函數(shù)************************/
  11. void gettemp()                           //讀取溫度值
  12. {                     
  13.          unsigned int temp0,temp1,temp;      // 存放小數(shù)、整數(shù)、符號(hào),10000倍小數(shù)值
  14.          unsigned char temh,teml;                  // 存放原始高字節(jié)與低字節(jié)         
  15.          temp=DS18B20_ReadTemperature();         // 從18B20中讀取2字節(jié)原始溫度值
  16.          flag=0;
  17.          if ((temp&0xf800)!=0)                   // 如果是負(fù)溫,將補(bǔ)碼取反加1變?yōu)樵a
  18.          {
  19.                  temp=~temp        +1;
  20.                  flag=1;
  21.          }        
  22.          temh=temp/256;                                   // 高字節(jié)(5位符號(hào)+3位數(shù)據(jù))
  23.          teml=temp%256;                                   // 低字節(jié)(4位整數(shù)+4位小數(shù))
  24.          
  25.          temp0=teml&0x0F;              // 4 位小數(shù)
  26.      temp1=(temh<<4)|(teml>>4);    // 8 位整數(shù)(最高一位符號(hào)0不用管)      
  27.      baiw=temp1/100+48;            // 百位ASCII碼         
  28.      shiw=(temp1%100)/10+48;       // 十位 ASCII碼
  29.      gew=(temp1%100)%10+48;            // 個(gè)位 ASCII碼  
  30.      temp=temp0*625;               // 將結(jié)果中的小數(shù)乘以分辨溫度0.0625
  31.                                                             // 擴(kuò)大10000倍進(jìn)行輸出,不用浮點(diǎn),同樣可以保留4位小數(shù)精度
  32.          point_1=temp/1000+48;                   // 小數(shù)點(diǎn)后1位ASCII碼
  33.          point_2=(temp%1000)/100+48;   // 小數(shù)點(diǎn)后2位ASCII碼
  34.          point_3=(temp%100)/10+48;           // 小數(shù)點(diǎn)后3位ASCII碼
  35.          point_4=temp%10+48;                   // 小數(shù)點(diǎn)后4位ASCII碼
  36. }

  37. void port_mode()            // 端口模式
  38. {
  39.         P0M1=0x00; P0M0=0x00;P1M1=0x00; P1M0=0x00;P2M1=0x00; P2M0=0x00;P3M1=0x00; P3M0=0x00;
  40.         P4M1=0x00; P4M0=0x00;P5M1=0x00; P5M0=0x00;P6M1=0x00; P6M0=0x00;P7M1=0x00; P7M0=0x00;
  41. }

  42. void main()
  43. {
  44.         unsigned char xPos,yPos;
  45.         unsigned char *s="Now temp is:";
  46.         port_mode();                      // 所有IO口設(shè)為準(zhǔn)雙向弱上拉方式。
  47.         xPos=0;                              // xPos表示水平右移字符數(shù)(0-15)
  48.         yPos=0;                              // yPos表示垂直下移字符數(shù)(0-1)
  49.         delay100ms();                 // 等待LCD1602上電時(shí)內(nèi)部復(fù)位
  50.         LCD1602_Init();
  51.         WriteString(xPos,yPos,s);          // X坐標(biāo)、Y坐標(biāo)、字符串,屏幕左上角為坐標(biāo)原點(diǎn)        
  52.         DS18B20_SetResolution(3); //設(shè)置DS18B20的分辨率為12位(默認(rèn)值,新器件可以不作任何設(shè)置)
  53.         while(1)
  54.         {
  55.                 gettemp();
  56.                 if(flag)      // 負(fù)溫度
  57.                 {
  58.                         WriteChar(0,1,'-');
  59.                 }
  60.                 if(!flag)     // 正溫度
  61.                 {
  62.                         WriteChar(0,1,'+');
  63.                 }               
  64.                 WriteChar(1,1,baiw);
  65. ……………………

  66. …………限于本文篇幅 余下代碼請(qǐng)從51黑下載附件…………
復(fù)制代碼

所有資料51hei提供下載:
單只18B20測(cè)溫(1602寫單字符方式).rar (57.38 KB, 下載次數(shù): 11)


分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

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

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表