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

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

QQ登錄

只需一步,快速開始

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

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

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:110653 發(fā)表于 2016-3-29 01:03 | 只看該作者 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式

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







電路和介紹詳見:http://www.zg4o1577.cn/bbs/dpj-47286-1.html(在這貼附件中可下載完整的源碼壓縮包)
  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.                 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);                  //  有顯示無光標(biāo)
  73.         }
  74. }
復(fù)制代碼

ds18b20.c

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

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

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

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

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

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

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



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

使用道具 舉報(bào)

本版積分規(guī)則

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

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

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 日韩在线视频观看 | 亚洲日产精品 | 日韩精品久久久久久 | 天天干狠狠操 | 精品视频免费在线 | 国产精品海角社区在线观看 | 在线看h| 日韩视频 中文字幕 | 免费人成激情视频在线观看冫 | 日韩在线中文字幕 | 国产一区二区三区高清 | 精品一区二区三区在线观看国产 | 欧美激情a∨在线视频播放 成人免费共享视频 | 欧美性生活一区二区三区 | 国产一区二区三区在线 | 午夜在线影院 | 免费观看羞羞视频网站 | 四色成人av永久网址 | 91 视频网站 | 欧美日韩高清免费 | 国产成人网 | 亚洲免费人成在线视频观看 | 九九热国产视频 | 成人欧美一区二区三区白人 | 天天看夜夜 | 一级黄色大片 | 日韩精品免费视频 | 国产精品2区 | 97视频人人澡人人爽 | 九九精品在线 | 一区在线观看 | 欧美v片| 不卡一区二区三区四区 | re久久| 99精彩视频 | 成人在线视频一区 | 美女在线观看av | 91在线影院 | 精品久久国产 | 草草视频在线观看 | 国产精品国产三级国产aⅴ中文 |