欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 3440|回復: 2
收起左側

單片機DS18B20點位關系對應的多點溫度測量 含原理 源碼 文檔 仿真

[復制鏈接]
ID:62509 發表于 2020-7-24 00:20 | 顯示全部樓層 |閱讀模式
點位關系對應的多點溫度測量問題的最終結果過去的多點溫度測量并顯示模型,Proteus模擬時LCD1602上一陣溫度值,前后無序的顯示以后你搞不清哪個DS18B20對應哪個溫度值,這樣造成很難實用。
                              
我對程序進行了研究解讀后發現,DS18B20的每個器件的序列號都是存在的,只是沒有對應圖中的模型號,比如:
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度,
那么,只要查詢到序列號給定對應的器件號,并將器件號和溫度存儲在數據結構中即可。
其他的我就不多說了,請看我的具體做法。
第一、  改變數據結構,增加器件號。
在DS18B20.h內存儲著數據結構,在數據結構中增加了btNumber這保證了,前面的數據都跟“檢測頭編號”對應成了一組數據。
當然你可以再增加檢測頭名稱和檢測位置等,這樣就更實用了。

第二、  調試系列號與檢測頭編號的一致對應性
    在DS18B20.c現在屏蔽的這一塊是用來做Proteus單步調節讀取序列碼的。對于有脈沖時間要求的數據讀取或存儲來說,如果不調試根本不知道結果是什么。
當你通過調試發現可以對應的時候,你就可以把兩者關聯起來了。

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

第四、  設置溫度顯示框架
    在Main.c的主程序循環顯示中,先顯示框架結構。如不滿意可自行調整。

第五、  設置溫度數值顯示架構
    在Main.c的主程序中,有一個數據值顯示結構,它是與框架結構對應的。

第六、  仿真運行的結果如下

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

第七、  Keil C程序結構

     

第八、  壓縮文件結構
    這樣做的目的是避免你在改動程序的時候,改錯了,你又找不回來源程序。最后你不得不放棄。這樣在Keil C下永遠存儲著一套正確的程序,你可以在Code下放心修改了。而且這種存儲結構會讓你思路更加清晰。
     
     
     
     
Main.C:
  • #include <Intrins.h>
  • #include <AT89X52.H>
  • #include "DS1602.h"
  • #include "DS18B20.h"
  • TEMPDATA m_TempData;
  • //數據處理子程序
  • 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;                                                        //數據線端口

  6. //DS18B20序列號,通過調用GetROMSequence()函數在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子函數
  16. void Delay16us()
  17. {
  18.         unsigned char a;

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

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

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

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

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

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

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

  39. //延時500ms子函數
  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的應答信號
  57.                 {      
  58.                         DQ = 1;
  59.                         Delay240us();                //延時240us
  60.                         break;               
  61.                 }
  62.         }
  63. }

  64. //寫一個字節(從低位開始寫)
  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. //讀一個字節(從低位開始讀)
  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聯調且在單步調試下才能得到)
  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);                                                        //啟動轉換
  134.         Delay500ms();                                                                          //調用一次就行      
  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);                                                        //讀數據
  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;                                //負數求補
  159.         }

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

  165.         //數據處理
  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. }
復制代碼


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  //重新調出E^2數據#define  READ_POWER    0xB4  //讀電源#define  TEMP_SWITCH   0x44  //啟動溫度變換 #define  READ_MEMORY   0xBE  //讀暫存存儲器#define  COPY_MEMORY   0x48  //復制暫存存儲器#define  WRITE_MEMORY  0x4E  //寫暫存存儲器
//數據存儲結構typedef struct tagTempData{        unsigned char         btThird;                //百位數據                                                unsigned char         btSecond;                //十位數據        unsigned char         btFirst;                //個位數據        unsigned char         btDecimal;        //小數點后一位數據        unsigned char                btNegative;        //是否為負數                unsigned char         btNumber;                //檢測頭編號                                        }TEMPDATA;
//芯片初始化void Initialization();
//寫一個字節(從低位開始寫)void WriteByte(unsigned char btData);
//讀一個字節(從低位開始讀)unsigned char ReadByte();
//序列號匹配void MatchROM(const unsigned char *pMatchData);
//讀取溫度值TEMPDATA ReadTemperature();
//得到64位ROM序列void GetROMSequence();
#endif



04溫度對應顯示框架

04溫度對應顯示框架

03系列號關聯存儲

03系列號關聯存儲

00仿真程序界面

00仿真程序界面

02系列號對應檢查

02系列號對應檢查

01數據結構變化

01數據結構變化

05數據結果顯示安排

05數據結果顯示安排

06仿真結果的對應關系

06仿真結果的對應關系

07溫度顯示結構

07溫度顯示結構

08Keil C程序結構

08Keil C程序結構

09壓縮文件結構

09壓縮文件結構

10調試程序位置

10調試程序位置

11可執行程序位置

11可執行程序位置

12程序備份位置

12程序備份位置

多點溫度測量系統設計.zip

827.97 KB, 下載次數: 50, 下載積分: 黑幣 -5

評分

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

查看全部評分

回復

使用道具 舉報

ID:62509 發表于 2020-7-24 00:22 | 顯示全部樓層
程序及仿真

《多點溫度測量》.zip

119.5 KB, 下載次數: 45, 下載積分: 黑幣 -5

程序及仿真

回復

使用道具 舉報

ID:8222 發表于 2020-7-24 09:58 | 顯示全部樓層
這個很好,可以方便的進行多點測量了。
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表