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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

單片機DS18B20多點測量溫度程序與Proteus仿真圖

[復制鏈接]
跳轉到指定樓層
樓主
仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)


單片機源程序如下:
  1. //頭文件包含
  2. #include <AT89X51.H>
  3. #include <Intrins.h>
  4. #include "DS18B20.H"

  5. //引腳定義
  6. sbit                                                         DQ = P2^7;                                                        //數據線端口

  7. //DS18B20序列號,通過調用GetROMSequence()函數在P1口讀出(讀8次)
  8. const unsigned char code ROMData1[8] = {0x28, 0x33, 0xC5, 0xB8, 0x00, 0x00, 0x00, 0xD7};        //U1
  9. const unsigned char code ROMData2[8] = {0x28, 0x30, 0xC5, 0xB8, 0x00, 0x00, 0x00, 0x8E};        //U2
  10. const unsigned char code ROMData3[8] = {0x28, 0x31, 0xC5, 0xB8, 0x00, 0x00, 0x00, 0xB9};        //U3
  11. const unsigned char code ROMData4[8] = {0x28, 0x32, 0xC5, 0xB8, 0x00, 0x00, 0x00, 0xE0};        //U4
  12. const unsigned char code ROMData5[8] = {0x28, 0x34, 0xC5, 0xB8, 0x00, 0x00, 0x00, 0x52};        //U5
  13. const unsigned char code ROMData6[8] = {0x28, 0x35, 0xC5, 0xB8, 0x00, 0x00, 0x00, 0x65};        //U6
  14. const unsigned char code ROMData7[8] = {0x28, 0x36, 0xC5, 0xB8, 0x00, 0x00, 0x00, 0x3C};        //U7
  15. const unsigned char code ROMData8[8] = {0x28, 0x37, 0xC5, 0xB8, 0x00, 0x00, 0x00, 0x0B};        //U8

  16. //延時16us子函數
  17. void Delay16us()
  18. {
  19.         unsigned char a;

  20.         for (a = 0; a < 4; a++);
  21. }

  22. //延時60us子函數
  23. void Delay60us()
  24. {
  25.         unsigned char a;

  26.         for (a = 0; a < 18; a++);
  27. }

  28. //延時480us子函數
  29. void Delay480us()
  30. {
  31.         unsigned char a;

  32.         for (a = 0; a < 158; a++);
  33. }

  34. //延時240us子函數
  35. void Delay240us()
  36. {
  37.         unsigned char a;

  38.         for (a = 0; a < 78; a++);
  39. }

  40. //延時500ms子函數
  41. void Delay500ms()
  42. {
  43.         unsigned char a, b, c;

  44.         for (a = 0; a < 250; a++)
  45.         for (b = 0; b < 3; b++)
  46.         for (c = 0; c < 220; c++);
  47. }

  48. //芯片初始化
  49. void Initialization()
  50. {
  51.         while(1)
  52.         {
  53.                 DQ = 0;
  54.                 Delay480us();                         //延時480us
  55.                 DQ = 1;
  56.                 Delay60us();                        //延時60us
  57.                 if(!DQ)                                  //收到ds18b20的應答信號
  58.                 {       
  59.                         DQ = 1;
  60.                         Delay240us();                //延時240us
  61.                         break;               
  62.                 }
  63.         }
  64. }

  65. //寫一個字節(從低位開始寫)
  66. void WriteByte(unsigned char btData)
  67. {
  68.         unsigned char i, btBuffer;

  69.         for (i = 0; i < 8; i++)
  70.         {
  71.                 btBuffer = btData >> i;
  72.                 if (btBuffer & 1)
  73.                 {
  74.                         DQ = 0;
  75.                         _nop_();
  76.                         _nop_();
  77.                         DQ = 1;
  78.                         Delay60us();
  79.                 }
  80.                 else
  81.                 {
  82.                         DQ = 0;
  83.                         Delay60us();
  84.                         DQ = 1;                       
  85.                 }
  86.         }
  87. }

  88. //讀一個字節(從低位開始讀)
  89. unsigned char ReadByte()
  90. {
  91.         unsigned char i, btDest;

  92.         for (i = 0; i < 8; i++)
  93.         {
  94.                 btDest >>= 1;
  95.                 DQ = 0;
  96.                 _nop_();
  97.                 _nop_();
  98.                 DQ = 1;
  99.                 Delay16us();
  100.                 if (DQ) btDest |= 0x80;
  101.                 Delay60us();
  102.         }

  103.         return btDest;
  104. }

  105. //序列號匹配
  106. void MatchROM(const unsigned char *pMatchData)
  107. {
  108.         unsigned char i;

  109.         Initialization();
  110.         WriteByte(MATCH_ROM);
  111.         for (i = 0; i < 8; i++) WriteByte(*(pMatchData + i));       
  112. }

  113. //得到64位ROM序列(在P1口顯示,必須與Proteus聯調且在單步調試下才能得到)
  114. /*void GetROMSequence()
  115. {
  116.         unsigned char i;

  117.         Initialization();
  118.         WriteByte(READ_ROM);
  119.         for (i = 0; i < 8; i++)
  120.         P1 = ReadByte();       
  121. }*/

  122. //讀取溫度值
  123. TEMPDATA ReadTemperature()
  124. {
  125.         TEMPDATA TempData;
  126.         unsigned int iTempDataH;
  127.         unsigned char btDot, iTempDataL;
  128.         static unsigned char i = 0;

  129.         TempData.btNegative = 0;                                                //為0溫度為正
  130.         i++;
  131.         if (i == 9) i = 1;
  132.         Initialization();
  133.         WriteByte(SKIP_ROM);                                                        //跳過ROM匹配
  134.         WriteByte(TEMP_SWITCH);                                                        //啟動轉換
  135.         Delay500ms();                                                                          //調用一次就行       
  136.         Delay500ms();                         
  137.         Initialization();

  138.         //多個芯片的時候用MatchROM(ROMData)換掉WriteByte(SKIP_ROM)
  139.         switch (i)
  140.         {
  141.                 case 1 : MatchROM(ROMData1); break;                        //匹配1
  142.                 case 2 : MatchROM(ROMData2); break;                        //匹配2
  143.                 case 3 : MatchROM(ROMData3); break;                        //匹配3
  144.                 case 4 : MatchROM(ROMData4); break;                        //匹配4       
  145.                 case 5 : MatchROM(ROMData5); break;                        //匹配5
  146.                 case 6 : MatchROM(ROMData6); break;                        //匹配6
  147.                 case 7 : MatchROM(ROMData7); break;                        //匹配7
  148.                 case 8 : MatchROM(ROMData8); break;                        //匹配8
  149.         }
  150.         //WriteByte(SKIP_ROM);                                                        //跳過ROM匹配(單個芯片時用這句換掉上面的switch)
  151.         WriteByte(READ_MEMORY);                                                        //讀數據
  152.         iTempDataL = ReadByte();
  153.         iTempDataH = ReadByte();       
  154.         iTempDataH <<= 8;
  155.         iTempDataH |= iTempDataL;

  156.         if (iTempDataH & 0x8000)
  157.         {
  158.                 TempData.btNegative = 1;
  159.                 iTempDataH = ~iTempDataH + 1;                                //負數求補
  160.         }

  161.         //為了省去浮點運算帶來的開銷,而采用整數和小數部分分開處理的方法(沒有四舍五入)
  162.         btDot = (unsigned char)(iTempDataH & 0x000F);        //得到小數部分
  163.         iTempDataH >>= 4;                                                                //得到整數部分
  164.         btDot *= 5;                                                                         //btDot*10/16得到轉換后的小數數據
  165.         btDot >>= 3;

  166.         //數據處理
  167.         TempData.btThird   = (unsigned char)iTempDataH / 100;
  168.         TempData.btSecond  = (unsigned char)iTempDataH % 100 / 10;
  169.         TempData.btFirst   = (unsigned char)iTempDataH % 10;
  170.         TempData.btDecimal = btDot;       

  171.         return TempData;
  172. }
復制代碼

Keil2代碼與Proteus7.5和8.8仿真下載:
多點溫度測量.7z (59.97 KB, 下載次數: 49)

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

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 精品亚洲一区二区三区四区五区 | 成人国产精品一级毛片视频毛片 | 国产精品欧美精品日韩精品 | 日韩在线91 | 国产一区二区 | 午夜影院在线观看免费 | 久久精品国产一区 | 91麻豆精品一区二区三区 | 日韩中出 | 欧美亚洲激情 | 二区三区视频 | 久久久久9999亚洲精品 | 国产成人精品久久二区二区91 | 成人精品一区二区三区 | 欧美日韩不卡合集视频 | 久久福利网站 | 国产一区二区高清在线 | 91精品国产91久久久久久最新 | 伊人超碰 | 日韩av大片免费看 | 日韩免费av网站 | 伊大人久久| 欧美a级成人淫片免费看 | 国产亚洲一区二区三区在线观看 | 欧美一区二区三区在线看 | 免费在线观看成人 | 一区二区三区四区在线播放 | 日韩精品在线看 | www狠狠干 | 国产精品久久av | 一本色道精品久久一区二区三区 | 国产区精品在线观看 | 男女羞羞在线观看 | 日韩国产在线 | 亚洲精品国产综合区久久久久久久 | 国产一级视频在线观看 | 久久久久久久国产精品影院 | 久久中文字幕一区 | 精品久久久久久久久久久久久久 | 亚洲一区二区三区免费视频 | 久久久久久久夜 |