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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

單片機DS18B20點位關(guān)系對應(yīng)的多點溫度測量 含原理 源碼 文檔 仿真

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:62509 發(fā)表于 2020-7-24 00:20 | 只看該作者 |只看大圖 回帖獎勵 |倒序瀏覽 |閱讀模式
點位關(guān)系對應(yīng)的多點溫度測量問題的最終結(jié)果過去的多點溫度測量并顯示模型,Proteus模擬時LCD1602上一陣溫度值,前后無序的顯示以后你搞不清哪個DS18B20對應(yīng)哪個溫度值,這樣造成很難實用。
                              
我對程序進行了研究解讀后發(fā)現(xiàn),DS18B20的每個器件的序列號都是存在的,只是沒有對應(yīng)圖中的模型號,比如:
U5是ROMData5={0x28,0x34, 0xC5, 0xB8, 0x00, 0x00, 0x00, 0x52}; //U5其溫度是25.5度,
U4是ROMData4={0x28,0x32, 0xC5, 0xB8, 0x00, 0x00, 0x00, 0xE0}; //U4其溫度是17.0度,
那么,只要查詢到序列號給定對應(yīng)的器件號,并將器件號和溫度存儲在數(shù)據(jù)結(jié)構(gòu)中即可。
其他的我就不多說了,請看我的具體做法。
第一、  改變數(shù)據(jù)結(jié)構(gòu),增加器件號。
在DS18B20.h內(nèi)存儲著數(shù)據(jù)結(jié)構(gòu),在數(shù)據(jù)結(jié)構(gòu)中增加了btNumber這保證了,前面的數(shù)據(jù)都跟“檢測頭編號”對應(yīng)成了一組數(shù)據(jù)。
當(dāng)然你可以再增加檢測頭名稱和檢測位置等,這樣就更實用了。

第二、  調(diào)試系列號與檢測頭編號的一致對應(yīng)性
    在DS18B20.c現(xiàn)在屏蔽的這一塊是用來做Proteus單步調(diào)節(jié)讀取序列碼的。對于有脈沖時間要求的數(shù)據(jù)讀取或存儲來說,如果不調(diào)試根本不知道結(jié)果是什么。
當(dāng)你通過調(diào)試發(fā)現(xiàn)可以對應(yīng)的時候,你就可以把兩者關(guān)聯(lián)起來了。

第三、  序列號與器件號對應(yīng)存儲程序
    程序在DS18B20.c中,對于八個器件進行序列號查詢,并將查詢結(jié)果與檢測頭編號一一對應(yīng)起來,并存儲。
當(dāng)然也可以利用該程序存儲你自己定義的比如檢測頭名稱和檢測位置等。

第四、  設(shè)置溫度顯示框架
    在Main.c的主程序循環(huán)顯示中,先顯示框架結(jié)構(gòu)。如不滿意可自行調(diào)整。

第五、  設(shè)置溫度數(shù)值顯示架構(gòu)
    在Main.c的主程序中,有一個數(shù)據(jù)值顯示結(jié)構(gòu),它是與框架結(jié)構(gòu)對應(yīng)的。

第六、  仿真運行的結(jié)果如下

  個別顯示的溫度值,是因為放不下所以進行了收縮,從而造成字體變形。如U8=-18.6收縮以后看起來有點像-13.5’C。等你仿真實際看時就會正常。
溫度顯示結(jié)構(gòu)如圖。如果想顯示其他內(nèi)容,那就需要自行安排了。

第七、  Keil C程序結(jié)構(gòu)

     

第八、  壓縮文件結(jié)構(gòu)
    這樣做的目的是避免你在改動程序的時候,改錯了,你又找不回來源程序。最后你不得不放棄。這樣在Keil C下永遠存儲著一套正確的程序,你可以在Code下放心修改了。而且這種存儲結(jié)構(gòu)會讓你思路更加清晰。
     
     
     
     
Main.C:
  • #include <Intrins.h>
  • #include <AT89X52.H>
  • #include "DS1602.h"
  • #include "DS18B20.h"
  • TEMPDATA m_TempData;
  • //數(shù)據(jù)處理子程序
  • void DataProcess()
  • {
  •         m_TempData = ReadTemperature();
  • //        DisplayOne(1, 4,  m_TempData.btNumber,  1);
  •         if (m_TempData.btNegative)
  •         {
  •                 DisplayOne(1, 6, '-', 0);
  •         }
  •         else
  •         {
  •                 DisplayOne(1, 6, m_TempData.btThird, 1);
  •         }
  •         DisplayOne(1, 7,  m_TempData.btSecond,  1);
  •         DisplayOne(1, 8,  m_TempData.btFirst,   1);
  •         DisplayOne(1, 10, m_TempData.btDecimal, 1);
  •         DisplayOne(2, 3,  m_TempData.btNumber,  1);
  • }
  • void main()
  • {
  •         //GetROMSequence();
  •         unsigned char a=0;
  •         Clear();
  •         Init();
  •         DisplayString(0, 0, "  Temperature");
  •         DisplayOne(1, 9, '.', 0);
  •         DisplayOne(1, 11, '`', 0);
  •         DisplayOne(1, 12, 'C', 0);
  •         DisplayOne(2, 2, 'U', 0);
  •         DisplayOne(2, 4, '=', 0);
  •         while (1)
  •         {
  •     a++;
  •                 if(a > 9) a = 0;
  •                 DataProcess();
  •         }
  • }



DS18B20.C://頭文件包含
  1. #include <AT89X52.H>
  2. #include <Intrins.h>
  3. #include "DS18B20.h"

  4. //引腳定義
  5. sbit                                                         DQ = P2^7;                                                        //數(shù)據(jù)線端口

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

  102.         return btDest;
  103. }

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

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

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

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

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

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

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

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

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

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

  170.         return TempData;
  171. }
復(fù)制代碼


DS18B20.h:
        #ifndef __DS18B20_H__#define __DS18B20_H__
//ROM操作命令#define  READ_ROM     0x33   //讀ROM #define  SKIP_ROM     0xCC   //跳過ROM #define  MATCH_ROM    0x55   //匹配ROM #define  SEARCH_ROM   0xF0   //搜索ROM #define  ALARM_SEARCH 0xEC   //告警搜索
//存儲器操作命令#define  ANEW_MOVE     0xB8  //重新調(diào)出E^2數(shù)據(jù)#define  READ_POWER    0xB4  //讀電源#define  TEMP_SWITCH   0x44  //啟動溫度變換 #define  READ_MEMORY   0xBE  //讀暫存存儲器#define  COPY_MEMORY   0x48  //復(fù)制暫存存儲器#define  WRITE_MEMORY  0x4E  //寫暫存存儲器
//數(shù)據(jù)存儲結(jié)構(gòu)typedef struct tagTempData{        unsigned char         btThird;                //百位數(shù)據(jù)                                                unsigned char         btSecond;                //十位數(shù)據(jù)        unsigned char         btFirst;                //個位數(shù)據(jù)        unsigned char         btDecimal;        //小數(shù)點后一位數(shù)據(jù)        unsigned char                btNegative;        //是否為負數(shù)                unsigned char         btNumber;                //檢測頭編號                                        }TEMPDATA;
//芯片初始化void Initialization();
//寫一個字節(jié)(從低位開始寫)void WriteByte(unsigned char btData);
//讀一個字節(jié)(從低位開始讀)unsigned char ReadByte();
//序列號匹配void MatchROM(const unsigned char *pMatchData);
//讀取溫度值TEMPDATA ReadTemperature();
//得到64位ROM序列void GetROMSequence();
#endif



04溫度對應(yīng)顯示框架.jpg (23.96 KB, 下載次數(shù): 61)

04溫度對應(yīng)顯示框架

04溫度對應(yīng)顯示框架

03系列號關(guān)聯(lián)存儲.jpg (51.83 KB, 下載次數(shù): 74)

03系列號關(guān)聯(lián)存儲

03系列號關(guān)聯(lián)存儲

00仿真程序界面.jpg (127.09 KB, 下載次數(shù): 68)

00仿真程序界面

00仿真程序界面

02系列號對應(yīng)檢查.jpg (50.13 KB, 下載次數(shù): 59)

02系列號對應(yīng)檢查

02系列號對應(yīng)檢查

01數(shù)據(jù)結(jié)構(gòu)變化.jpg (44.58 KB, 下載次數(shù): 63)

01數(shù)據(jù)結(jié)構(gòu)變化

01數(shù)據(jù)結(jié)構(gòu)變化

05數(shù)據(jù)結(jié)果顯示安排.jpg (58.64 KB, 下載次數(shù): 65)

05數(shù)據(jù)結(jié)果顯示安排

05數(shù)據(jù)結(jié)果顯示安排

06仿真結(jié)果的對應(yīng)關(guān)系.jpg (127.15 KB, 下載次數(shù): 54)

06仿真結(jié)果的對應(yīng)關(guān)系

06仿真結(jié)果的對應(yīng)關(guān)系

07溫度顯示結(jié)構(gòu).jpg (10.72 KB, 下載次數(shù): 69)

07溫度顯示結(jié)構(gòu)

07溫度顯示結(jié)構(gòu)

08Keil C程序結(jié)構(gòu).jpg (47.74 KB, 下載次數(shù): 69)

08Keil C程序結(jié)構(gòu)

08Keil C程序結(jié)構(gòu)

09壓縮文件結(jié)構(gòu).jpg (27.5 KB, 下載次數(shù): 76)

09壓縮文件結(jié)構(gòu)

09壓縮文件結(jié)構(gòu)

10調(diào)試程序位置.jpg (49.42 KB, 下載次數(shù): 49)

10調(diào)試程序位置

10調(diào)試程序位置

11可執(zhí)行程序位置.jpg (36.61 KB, 下載次數(shù): 51)

11可執(zhí)行程序位置

11可執(zhí)行程序位置

12程序備份位置.jpg (37.24 KB, 下載次數(shù): 70)

12程序備份位置

12程序備份位置

多點溫度測量系統(tǒng)設(shè)計.zip

827.97 KB, 下載次數(shù): 50, 下載積分: 黑幣 -5

評分

參與人數(shù) 1黑幣 +100 收起 理由
admin + 100 共享資料的黑幣獎勵!

查看全部評分

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

使用道具 舉報

沙發(fā)
ID:62509 發(fā)表于 2020-7-24 00:22 | 只看該作者
程序及仿真

《多點溫度測量》.zip

119.5 KB, 下載次數(shù): 45, 下載積分: 黑幣 -5

程序及仿真

回復(fù)

使用道具 舉報

板凳
ID:8222 發(fā)表于 2020-7-24 09:58 | 只看該作者
這個很好,可以方便的進行多點測量了。
回復(fù)

使用道具 舉報

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

本版積分規(guī)則

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

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

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 在线黄色网 | 国产精品一区二区三区四区 | 九九99精品| 成人亚洲精品 | 男人天堂免费在线 | 亚洲午夜精品一区二区三区 | 亚洲三区在线观看 | 在线免费观看黄a | 一区二区在线不卡 | 精品久久久久久久久久久下田 | 理论片免费在线观看 | 亚洲免费成人 | 成人黄视频在线观看 | 亚洲中午字幕 | 国产免费一区二区 | 日韩中文一区二区三区 | 九九久久国产精品 | 亚洲精品一区二区网址 | 中文在线一区 | 国产免费拔擦拔擦8x高清 | 午夜日韩 | 激情a| a黄毛片 | 久久久久久久久久久久91 | 91xxx在线观看 | 国产美女黄色片 | 国产精品一区二区免费看 | 精品国产亚洲一区二区三区大结局 | 午夜影院网站 | 国产三级一区二区 | 欧美在线观看网站 | 一区精品视频 | 在线中文字幕av | 精品日韩一区 | 亚洲色图综合 | 狠狠色狠狠色综合日日92 | 欧美一级欧美一级在线播放 | 日本三级做a全过程在线观看 | 成人国产在线视频 | 高清av在线 | 成人黄色电影在线观看 |