久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 3466|回復: 0
打印 上一主題 下一主題
收起左側

單只DS18B20測溫程序(1602寫單字符方式)

[復制鏈接]
跳轉到指定樓層
樓主
ID:110653 發表于 2016-3-29 01:03 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式

DS18B20是一種很常用的數字溫度傳感器,溫度檢測范圍是-55~+125度,手冊 說明在-10~+85度范圍內檢測誤差為±0.5度,作者在自己的產品中隨機抽樣驗證 了幾只傳感器,在-25度誤差0.1度,+25度與+50度誤差小于0.1度,可見這種傳感 器實際精度是很高的,傳感器引腳如圖19-1所示,工作電壓范圍是3.0~5.5V,通 常使用+5V,電源接反或接錯一般是不會損壞傳感器的,對于單只DS18B20的使用,我們按圖19-2連接即可。







電路和介紹詳見:http://www.zg4o1577.cn/bbs/dpj-47286-1.html(在這貼附件中可下載完整的源碼壓縮包)
  1. //單只DS18B20的溫度檢測,測溫范圍-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表示負溫。
  7. unsigned char baiw,shiw,gew;           // 百位、十位、個位 ASCII碼
  8. unsigned char point_1,point_2,point_3,point_4;    // 小數點后1、2、3、4位ASCII碼
  9.         
  10. //****************溫度數據處理函數************************/
  11. void gettemp()                           //讀取溫度值
  12. {                     
  13.          unsigned int temp0,temp1,temp;      // 存放小數、整數、符號,10000倍小數值
  14.          unsigned char temh,teml;                  // 存放原始高字節與低字節         
  15.          temp=DS18B20_ReadTemperature();         // 從18B20中讀取2字節原始溫度值
  16.          flag=0;
  17.          if ((temp&0xf800)!=0)                   // 如果是負溫,將補碼取反加1變為原碼
  18.          {
  19.                  temp=~temp        +1;
  20.                  flag=1;
  21.          }        
  22.          temh=temp/256;                                   // 高字節(5位符號+3位數據)
  23.          teml=temp%256;                                   // 低字節(4位整數+4位小數)
  24.          
  25.          temp0=teml&0x0F;              // 4 位小數
  26.      temp1=(temh<<4)|(teml>>4);    // 8 位整數(最高一位符號0不用管)      
  27.      baiw=temp1/100+48;            // 百位ASCII碼         
  28.      shiw=(temp1%100)/10+48;       // 十位 ASCII碼
  29.      gew=(temp1%100)%10+48;            // 個位 ASCII碼  
  30.      temp=temp0*625;               // 將結果中的小數乘以分辨溫度0.0625
  31.                                                             // 擴大10000倍進行輸出,不用浮點,同樣可以保留4位小數精度
  32.          point_1=temp/1000+48;                   // 小數點后1位ASCII碼
  33.          point_2=(temp%1000)/100+48;   // 小數點后2位ASCII碼
  34.          point_3=(temp%100)/10+48;           // 小數點后3位ASCII碼
  35.          point_4=temp%10+48;                   // 小數點后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口設為準雙向弱上拉方式。
  47.         xPos=0;                              // xPos表示水平右移字符數(0-15)
  48.         yPos=0;                              // yPos表示垂直下移字符數(0-1)
  49.         delay100ms();                 // 等待LCD1602上電時內部復位
  50.         LCD1602_Init();
  51.         WriteString(xPos,yPos,s);          // X坐標、Y坐標、字符串,屏幕左上角為坐標原點        
  52.         DS18B20_SetResolution(3); //設置DS18B20的分辨率為12位(默認值,新器件可以不作任何設置)
  53.         while(1)
  54.         {
  55.                 gettemp();
  56.                 if(flag)      // 負溫度
  57.                 {
  58.                         WriteChar(0,1,'-');
  59.                 }
  60.                 if(!flag)     // 正溫度
  61.                 {
  62.                         WriteChar(0,1,'+');
  63.                 }               
  64.                 WriteChar(1,1,baiw);
  65.                 WriteChar(2,1,shiw);
  66.                 WriteChar(3,1,gew);
  67.                 WriteChar(4,1,'.');
  68.                 WriteChar(5,1,point_1);
  69.                 WriteChar(6,1,point_2);
  70.                 WriteChar(7,1,point_3);
  71.                 WriteChar(8,1,point_4);

  72.                 SetCur(NoCur);                  //  有顯示無光標
  73.         }
  74. }
復制代碼

ds18b20.c

  1. /****************《51單片機輕松入門-基于STC15W4K系列》配套例程 *************
  2. ★★★★★★★★★★★★★★★★★★★★★★★★
  3. 《51單片機輕松入門-基于STC15W4K系列》 一書已經由北航出版社正式出版發行。
  4.   作者親手創作的與教材配套的51雙核實驗板(2個MCU)對程序下載、調試、仿真方便,不需要外部
  5.   仿真器與編程器,這種設計方式徹底解決了系統中多個最高優先級誰也不能讓誰的中斷競爭問題。
  6.   QQ群:STC51-STM32(3) :515624099 或 STC51-STM32(2):99794374。
  7.         驗證信息:STC15單片機
  8.   郵箱:xgliyouquan@126.com
  9.   ★★★★★★★★★★★★★★★★★★★★★★★★*/

  10. #include "DS18b20.h"
  11. #include "myfun.h"
  12. sbit  DQTest=P2^2;    //時間調整觀察參考引腳        
  13. /****************************************************************/
  14. unsigned char DS18B20_Reset()
  15. {
  16.         unsigned char x=0;
  17.         DQ=1;           // DQ拉高
  18.                         //DQTest=1;     // 時間調整觀察參考引腳
  19.         delay2us();            // 延時約2uS
  20.         DQ=0;           // 單片機將DQ拉低         
  21.                     //DQTest=0;          // 時間調整觀察參考引腳
  22.         delay720us();   // 要求延時 480us~960us (這里取中心值720uS)
  23.         DQ=1;           // DQ拉高釋放總線
  24.                             //DQTest=1;          // 時間調整觀察參考引腳
  25.                         // 以上是由單片機產生"復位脈沖"
  26.         delay75us();    // 要求延時大于60 us  (這里取75uS)
  27.         x=DQ;           // DS18B20產生"存在脈沖"
  28.                         // 檢測DQ 如果為低,說明復位成功,DS18B20存在
  29.                         // 如果為高,說明復位失敗,DS18B20損壞或不存在
  30.         delay500us();   // 讓18B20釋放總線,避免影響到下一步操作。
  31.         return x;            // 返回復位結果
  32. }

  33. void DS18B20_WriteBit(unsigned char bdat)   // 向DS18B20寫入一個位
  34. {
  35.         DQ=1;           // 將數據線置為高電平
  36.                                         //DQTest=1;        // 時間調整觀察參考引腳
  37.         delay2us();            // 兩次寫過程間隔大于1us,這里取2uS      
  38.         DQ=0;                // 開始一個寫過程
  39.                                         //DQTest=0;        // 時間調整觀察參考引腳
  40.         delay4us();     // 低電平保持1us以上,這里延時約4uS,
  41.         DQ=bdat;
  42.         delay60us();    // 延時60uS,寫過程開始15us后DS18B20對數據線進行采樣
  43.                         // 寫周期在60us-120 us之間。
  44.         DQ=1;                          // 釋放總線
  45.                                         //DQTest=1;        // 時間調整觀察參考引腳
  46. }  
  47. void DS18B20_WriteByte(unsigned char dat)        // 向DS18B20寫入一個字節
  48. {
  49.         unsigned char i=0;
  50.         for(i=0;i<8;i++)                       // 調用8次寫時間片實現寫入字節(8個位)
  51.         {
  52.                 DS18B20_WriteBit(dat&(1<<i));      // 從低位開始寫入,0xCC&1=(0100 1110 &0000 0001)=        0
  53.         }
  54. }

  55. unsigned char DS18B20_ReadBit()         // 從DS18B20讀取一個位
  56. {
  57.         unsigned char bdat=0;
  58.         DQ=1;           // 將數據線置為高電平
  59.                                 DQTest=1;        // 時間調整觀察參考引腳
  60.         delay2us();            // 兩次讀過程間隔大于1us,這里取2uS
  61.         DQ=0;           // 開始一個讀過程
  62.                                 DQTest=0;        // 時間調整觀察參考引腳
  63.         delay4us();     // 低電平保持1us以上,這里取4uS
  64.         DQ=1;           // 開始讀取數據線狀態
  65.                                 DQTest=1;   // 時間調整觀察參考引腳
  66.         delay4us();     // 讀時間片開始后15us內主機對數據線進行采樣,這里取4uS
  67.         bdat=DQ;
  68.         delay60us();    // 讀周期60us<T<120uS   (60 uS)
  69.         return bdat;  
  70. }

  71. unsigned char DS18B20_ReadByte()                 // 從DS18B20讀取一個字節
  72. {
  73.         unsigned char i=0,dat=0;
  74.         for(i=0;i<8;i++)                     // 調用8次讀過程實現字節讀取(8個位)
  75.         {
  76.                 dat|=(DS18B20_ReadBit()<<i);     // 從低位開始讀取
  77.         }
  78.         return(dat);
  79. }  

  80. void DS18B20_SetResolution(unsigned char res)           // 設置DS18B20的分辨率
  81. {                                                                                           // res:0:9位 1:10位 2:11位 3:12位
  82.         while(DS18B20_Reset());                    // 復位,通信前必須復位
  83.         DS18B20_WriteByte(0x4e);                   // 寫暫存器指令
  84.         DS18B20_WriteByte(0xff);                   // 此值被寫入TH
  85.         DS18B20_WriteByte(0xff);                   // 此值被寫入TL
  86.         DS18B20_WriteByte(0x1f|(res<<5));          // 設置分辨率 (0 R1 R0 1   1 1 1 1)
  87. }

  88. unsigned int DS18B20_ReadTemperature()            // 從DS18B20中讀取溫度
  89. {
  90.         unsigned int Temp=0;  
  91.         DS18B20_Reset();                // 復位,通信前必須復位
  92.         DS18B20_WriteByte(0xcc);        // 如果總線上只有一個DS18B20,則可跳過ROM操作(0xCC)
  93.         DS18B20_WriteByte(0x44);        // 啟動溫度轉換(0x44)
  94.                                                         // 實驗結果:執行完上面 2 條命令后信號線將永久呈高電平狀態
  95.         
  96. //        while(!DS18B20_ReadBit());      // 啟動溫度轉換后要進行讀忙,9~12位精度溫度轉換所需的
  97.                                         // 最長時間分別為93.75ms、187.5ms、375ms、750ms(實驗結果:602mS)
  98.         delay760ms();                   // 這里也可以不判忙,避免數據線不停的發送數據,直接延時750ms再讀取溫度值。
  99.                
  100.         DS18B20_Reset();                // 溫度轉換后DS18B20處于空閑狀態,要進行通信,需要重新復位
  101.         DS18B20_WriteByte(0xcc);        // 跳過ROM操作
  102.         DS18B20_WriteByte(0xbe);        // 寫入讀取暫存器命令
  103.                                         //(共可讀9個寄存器,直接連續讀取,前兩個就是溫度)
  104.         Temp=DS18B20_ReadByte();            // 讀取的第一個字節是溫度值的低字節,第二個字節是溫度值的高字節。        
  105.         Temp|=((unsigned int)DS18B20_ReadByte())<<8;        // 將讀到的兩個字節進行整合
  106.         return Temp;                            // 返回讀得的2個溫度原始字節。                                                         
  107. }
復制代碼



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

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 久久精品日产第一区二区三区 | 精品久久久久久亚洲综合网站 | aa级毛片毛片免费观看久 | 午夜在线视频一区二区三区 | 国产精品久久久久久亚洲调教 | 天天干天天操天天看 | 蜜臀久久99精品久久久久久宅男 | 91在线网站| 日韩欧美一区二区三区四区 | 国产精品精品久久久久久 | 国产在线一级片 | 国产精品日韩在线观看一区二区 | 日本福利视频 | 亚洲综合在线一区 | 精品久久久久久久久久久久 | 国产精品久久网 | 成人一区二区三区在线观看 | 日本一二区视频 | 亚洲国产成人精品久久 | 国产九一精品 | 中文字幕日韩三级 | 五月网婷婷| 日韩a视频 | 黄色大片免费网站 | 人人玩人人添人人澡欧美 | 欧美日韩视频 | 欧美无乱码久久久免费午夜一区 | 伊人国产精品 | 色播av| 玖玖玖在线观看 | 欧美一区二区三区国产精品 | 国产一区二区三区免费视频 | 国产网站在线免费观看 | h免费观看| 亚洲永久在线 | 视频一区二区三区在线观看 | 久久久91精品国产一区二区精品 | 日韩一区二区成人 | 久久久久久国产精品 | 欧美久久久网站 | 青青久久av北条麻妃海外网 |