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

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

QQ登錄

只需一步,快速開始

搜索
查看: 3440|回復(fù): 2
收起左側(cè)

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

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

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

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

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

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

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

  個(gè)別顯示的溫度值,是因?yàn)榉挪幌滤赃M(jìn)行了收縮,從而造成字體變形。如U8=-18.6收縮以后看起來(lái)有點(diǎn)像-13.5’C。等你仿真實(shí)際看時(shí)就會(huì)正常。
溫度顯示結(jié)構(gòu)如圖。如果想顯示其他內(nèi)容,那就需要自行安排了。

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

     

第八、  壓縮文件結(jié)構(gòu)
    這樣做的目的是避免你在改動(dòng)程序的時(shí)候,改錯(cuò)了,你又找不回來(lái)源程序。最后你不得不放棄。這樣在Keil C下永遠(yuǎn)存儲(chǔ)著一套正確的程序,你可以在Code下放心修改了。而且這種存儲(chǔ)結(jié)構(gòu)會(huì)讓你思路更加清晰。
     
     
     
     
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序列號(hào),通過(guò)調(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. //延時(shí)16us子函數(shù)
  16. void Delay16us()
  17. {
  18.         unsigned char a;

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

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

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

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

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

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

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

  39. //延時(shí)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();                         //延時(shí)480us
  54.                 DQ = 1;
  55.                 Delay60us();                        //延時(shí)60us
  56.                 if(!DQ)                                  //收到ds18b20的應(yīng)答信號(hào)
  57.                 {      
  58.                         DQ = 1;
  59.                         Delay240us();                //延時(shí)240us
  60.                         break;               
  61.                 }
  62.         }
  63. }

  64. //寫一個(gè)字節(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. //讀一個(gè)字節(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. //序列號(hào)匹配
  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);                                                        //跳過(guò)ROM匹配
  133.         WriteByte(TEMP_SWITCH);                                                        //啟動(dòng)轉(zhuǎn)換
  134.         Delay500ms();                                                                          //調(diào)用一次就行      
  135.         Delay500ms();                        
  136.         Initialization();

  137.         //多個(gè)芯片的時(shí)候用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);                                                        //跳過(guò)ROM匹配(單個(gè)芯片時(shí)用這句換掉上面的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;                                //負(fù)數(shù)求補(bǔ)
  159.         }

  160.         //為了省去浮點(diǎn)運(yùn)算帶來(lái)的開銷,而采用整數(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   //跳過(guò)ROM #define  MATCH_ROM    0x55   //匹配ROM #define  SEARCH_ROM   0xF0   //搜索ROM #define  ALARM_SEARCH 0xEC   //告警搜索
//存儲(chǔ)器操作命令#define  ANEW_MOVE     0xB8  //重新調(diào)出E^2數(shù)據(jù)#define  READ_POWER    0xB4  //讀電源#define  TEMP_SWITCH   0x44  //啟動(dòng)溫度變換 #define  READ_MEMORY   0xBE  //讀暫存存儲(chǔ)器#define  COPY_MEMORY   0x48  //復(fù)制暫存存儲(chǔ)器#define  WRITE_MEMORY  0x4E  //寫暫存存儲(chǔ)器
//數(shù)據(jù)存儲(chǔ)結(jié)構(gòu)typedef struct tagTempData{        unsigned char         btThird;                //百位數(shù)據(jù)                                                unsigned char         btSecond;                //十位數(shù)據(jù)        unsigned char         btFirst;                //個(gè)位數(shù)據(jù)        unsigned char         btDecimal;        //小數(shù)點(diǎn)后一位數(shù)據(jù)        unsigned char                btNegative;        //是否為負(fù)數(shù)                unsigned char         btNumber;                //檢測(cè)頭編號(hào)                                        }TEMPDATA;
//芯片初始化void Initialization();
//寫一個(gè)字節(jié)(從低位開始寫)void WriteByte(unsigned char btData);
//讀一個(gè)字節(jié)(從低位開始讀)unsigned char ReadByte();
//序列號(hào)匹配void MatchROM(const unsigned char *pMatchData);
//讀取溫度值TEMPDATA ReadTemperature();
//得到64位ROM序列void GetROMSequence();
#endif



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

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

03系列號(hào)關(guān)聯(lián)存儲(chǔ)

03系列號(hào)關(guān)聯(lián)存儲(chǔ)

00仿真程序界面

00仿真程序界面

02系列號(hào)對(duì)應(yīng)檢查

02系列號(hào)對(duì)應(yīng)檢查

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

12程序備份位置

12程序備份位置

多點(diǎn)溫度測(cè)量系統(tǒng)設(shè)計(jì).zip

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

評(píng)分

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

查看全部評(píng)分

回復(fù)

使用道具 舉報(bào)

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

《多點(diǎn)溫度測(cè)量》.zip

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

程序及仿真

回復(fù)

使用道具 舉報(bào)

ID:8222 發(fā)表于 2020-7-24 09:58 | 顯示全部樓層
這個(gè)很好,可以方便的進(jìn)行多點(diǎn)測(cè)量了。
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

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

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

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