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

QQ登錄

只需一步,快速開始

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

基于單片機(jī)的DS18B20液晶顯示的溫度測(cè)溫

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:144543 發(fā)表于 2016-11-23 10:30 | 只看該作者 |只看大圖 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
包括proteus仿真和程序


資料下載:
LCD1602溫度測(cè)量.rar (71.36 KB, 下載次數(shù): 69)

程序源碼:
  1. /*******************************************
  2. 程序功能:利用單線制DS18B20溫度傳感器
  3.           LED數(shù)碼管顯示當(dāng)前的溫度值
  4. ********************************************/
  5. #include <reg51.h>                 //DS18B20溫度傳感器程序
  6. #include "LCD1602.h"
  7. #include "stdio.h"


  8. sbit DQ=P3^6; //數(shù)據(jù)傳輸線接單片機(jī)的相應(yīng)的引腳
  9. unsigned char tempL=0; //設(shè)全局變量
  10. unsigned char tempH=0;

  11. unsigned int sdata =0;
  12. unsigned long value;
  13.   float m ;
  14. float temper=0;
  15. bit  fg=1;        //溫度正負(fù)標(biāo)志

  16. //******************延時(shí)子程序 *******************************

  17. //這個(gè)延時(shí)程序的具體延時(shí)時(shí)間是time=i*8+10,適用于小于2ms的延時(shí)

  18. //************************************************************
  19. void delay(unsigned char i)
  20. {
  21. for(i;i>0;i--);
  22. }


  23. //***********************************************************

  24. //                     延時(shí)子程序

  25. //************************************************************
  26. void Delay1ms(unsigned int count)
  27. {
  28.         unsigned int i,j;
  29.         for(i=0;i<count;i++)
  30.         for(j=0;j<120;j++);
  31. }




  32. //*****************************初始化程序 *********************************//

  33. Init_DS18B20(void)
  34. {
  35. unsigned char x=0;
  36. DQ=1; //DQ先置高
  37. delay(8); //稍延時(shí)
  38. DQ=0; //發(fā)送復(fù)位脈沖
  39. delay(80); //延時(shí)(>480us)
  40. DQ=1; //拉高數(shù)據(jù)線
  41. delay(5); //等待(15~60us)
  42. x=DQ; //用X的值來判斷初始化有沒有成功,18B20存在的話X=0,否則X=1
  43. delay(20);
  44. }


  45. //**********讀一個(gè)字節(jié)************//

  46. ReadOneChar(void)  //主機(jī)數(shù)據(jù)線先從高拉至低電平1us以上,再使數(shù)據(jù)線升為高電平,從而產(chǎn)生讀信號(hào)
  47. {
  48. unsigned char i=0; //每個(gè)讀周期最短的持續(xù)時(shí)間為60us,各個(gè)讀周期之間必須有1us以上的高電平恢復(fù)期
  49. unsigned char dat=0;
  50. for (i=8;i>0;i--) //一個(gè)字節(jié)有8位
  51. {
  52. DQ=1;
  53. delay(1);
  54. DQ=0;
  55. dat>>=1;
  56. DQ=1;
  57. if(DQ)
  58. dat|=0x80;
  59. delay(4);
  60. }
  61. return(dat);
  62. }



  63. //*********************** **寫一個(gè)字節(jié)**************************//

  64. WriteOneChar(unsigned char dat)
  65. {
  66.   unsigned char i=0; //數(shù)據(jù)線從高電平拉至低電平,產(chǎn)生寫起始信號(hào)。15us之內(nèi)將所需寫的位送到數(shù)據(jù)線上,
  67.   for(i=8;i>0;i--) //在15~60us之間對(duì)數(shù)據(jù)線進(jìn)行采樣,如果是高電平就寫1,低寫0發(fā)生。
  68.   {
  69.    DQ=0; //在開始另一個(gè)寫周期前必須有1us以上的高電平恢復(fù)期。
  70.    DQ=dat&0x01;
  71.    delay(5);
  72.    DQ=1;
  73.    dat>>=1;
  74.   }
  75.   delay(4);
  76. }


  77. //讀溫度值(低位放tempL;高位放tempH;)
  78. ReadTemperature(void)
  79. {
  80. Init_DS18B20(); //初始化
  81. WriteOneChar(0xcc); //跳過讀序列號(hào)的操作
  82. WriteOneChar(0x44); //啟動(dòng)溫度轉(zhuǎn)換
  83. delay(125); //轉(zhuǎn)換需要一點(diǎn)時(shí)間,延時(shí)
  84. Init_DS18B20(); //初始化
  85. WriteOneChar(0xcc); //跳過讀序列號(hào)的操作
  86. WriteOneChar(0xbe); //讀溫度寄存器(頭兩個(gè)值分別為溫度的低位和高位)
  87. tempL=ReadOneChar(); //讀出溫度的低位LSB
  88. tempH=ReadOneChar(); //讀出溫度的高位MSB

  89.   if(tempH>0x7f)      //最高位為1時(shí)溫度是負(fù)
  90.     {
  91.          tempL=~tempL;         //補(bǔ)碼轉(zhuǎn)換,取反加一
  92.         tempH=~tempH+1;      
  93.          fg=0;            //讀取溫度為負(fù)時(shí)fg=0
  94.     }
  95.   temper= ((tempH*256) +tempL)*0.0625;

  96. }






  97. //**************************** //主程序


  98. main()
  99. {
  100.    unsigned int value = 0;
  101.    unsigned char buffer[40];
  102.   
  103.    while (1)
  104.     {
  105.       
  106.                 LCD_Initial();
  107.              GotoXY(0,0);
  108.              Print("  temperature");
  109.        
  110.              while(1)
  111.               {  
  112.                    ReadTemperature() ;
  113.                    GotoXY(3,1);  
  114.                     if (fg==1)
  115.                         {
  116.                       sprintf(buffer,"+%6.3f",temper);
  117.                       Print(buffer);
  118.                       Delay1ms(200);
  119.                          }

  120.                          if (fg==0)
  121.                         {
  122.                       sprintf(buffer,"-%6.3f",temper);
  123.                       Print(buffer);
  124.                       Delay1ms(200);
  125.                          }
  126.               }            
  127.         }
  128. }
復(fù)制代碼


評(píng)分

參與人數(shù) 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎(jiǎng)勵(lì)!

查看全部評(píng)分

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

相關(guān)帖子

回復(fù)

使用道具 舉報(bào)

沙發(fā)
ID:301302 發(fā)表于 2018-4-3 09:54 | 只看該作者
感謝樓主的分享,DS18B20調(diào)好幾天了
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

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

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

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