標(biāo)題: 單片機(jī)DS18B20點位關(guān)系對應(yīng)的多點溫度測量 含原理 源碼 文檔 仿真 [打印本頁]
作者: shinezhangxiao 時間: 2020-7-24 00:20
標(biāo)題: 單片機(jī)DS18B20點位關(guān)系對應(yīng)的多點溫度測量 含原理 源碼 文檔 仿真
《點位關(guān)系對應(yīng)的多點溫度測量問題的最終結(jié)果》過去的多點溫度測量并顯示模型,Proteus模擬時LCD1602上一陣溫度值,前后無序的顯示以后你搞不清哪個DS18B20對應(yīng)哪個溫度值,這樣造成很難實用。
我對程序進(jìn)行了研究解讀后發(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中,對于八個器件進(jìn)行序列號查詢,并將查詢結(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é)果如下
個別顯示的溫度值,是因為放不下所以進(jìn)行了收縮,從而造成字體變形。如U8=-18.6收縮以后看起來有點像-13.5’C。等你仿真實際看時就會正常。
溫度顯示結(jié)構(gòu)如圖。如果想顯示其他內(nèi)容,那就需要自行安排了。
第七、 Keil C程序結(jié)構(gòu)
第八、 壓縮文件結(jié)構(gòu)
這樣做的目的是避免你在改動程序的時候,改錯了,你又找不回來源程序。最后你不得不放棄。這樣在Keil C下永遠(yuǎn)存儲著一套正確的程序,你可以在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://頭文件包含
- #include <AT89X52.H>
- #include <Intrins.h>
- #include "DS18B20.h"
- //引腳定義
- sbit DQ = P2^7; //數(shù)據(jù)線端口
- //DS18B20序列號,通過調(diào)用GetROMSequence()函數(shù)在P1口讀出(讀8次)
- const unsigned char code ROMData1[8] = {0x28, 0x33, 0xC5, 0xB8, 0x00, 0x00, 0x00, 0xD7}; //U1
- const unsigned char code ROMData2[8] = {0x28, 0x30, 0xC5, 0xB8, 0x00, 0x00, 0x00, 0x8E}; //U2
- const unsigned char code ROMData3[8] = {0x28, 0x31, 0xC5, 0xB8, 0x00, 0x00, 0x00, 0xB9}; //U3
- const unsigned char code ROMData4[8] = {0x28, 0x32, 0xC5, 0xB8, 0x00, 0x00, 0x00, 0xE0}; //U4
- const unsigned char code ROMData5[8] = {0x28, 0x34, 0xC5, 0xB8, 0x00, 0x00, 0x00, 0x52}; //U5
- const unsigned char code ROMData6[8] = {0x28, 0x35, 0xC5, 0xB8, 0x00, 0x00, 0x00, 0x65}; //U6
- const unsigned char code ROMData7[8] = {0x28, 0x36, 0xC5, 0xB8, 0x00, 0x00, 0x00, 0x3C}; //U7
- const unsigned char code ROMData8[8] = {0x28, 0x37, 0xC5, 0xB8, 0x00, 0x00, 0x00, 0x0B}; //U8
- //延時16us子函數(shù)
- void Delay16us()
- {
- unsigned char a;
- for (a = 0; a < 4; a++);
- }
- //延時60us子函數(shù)
- void Delay60us()
- {
- unsigned char a;
- for (a = 0; a < 18; a++);
- }
- //延時480us子函數(shù)
- void Delay480us()
- {
- unsigned char a;
- for (a = 0; a < 158; a++);
- }
- //延時240us子函數(shù)
- void Delay240us()
- {
- unsigned char a;
- for (a = 0; a < 78; a++);
- }
- //延時500ms子函數(shù)
- void Delay500ms()
- {
- unsigned char a, b, c;
- for (a = 0; a < 250; a++)
- for (b = 0; b < 3; b++)
- for (c = 0; c < 220; c++);
- }
- //芯片初始化
- void Initialization()
- {
- while(1)
- {
- DQ = 0;
- Delay480us(); //延時480us
- DQ = 1;
- Delay60us(); //延時60us
- if(!DQ) //收到ds18b20的應(yīng)答信號
- {
- DQ = 1;
- Delay240us(); //延時240us
- break;
- }
- }
- }
- //寫一個字節(jié)(從低位開始寫)
- void WriteByte(unsigned char btData)
- {
- unsigned char i, btBuffer;
- for (i = 0; i < 8; i++)
- {
- btBuffer = btData >> i;
- if (btBuffer & 1)
- {
- DQ = 0;
- _nop_();
- _nop_();
- DQ = 1;
- Delay60us();
- }
- else
- {
- DQ = 0;
- Delay60us();
- DQ = 1;
- }
- }
- }
- //讀一個字節(jié)(從低位開始讀)
- unsigned char ReadByte()
- {
- unsigned char i, btDest;
- for (i = 0; i < 8; i++)
- {
- btDest >>= 1;
- DQ = 0;
- _nop_();
- _nop_();
- DQ = 1;
- Delay16us();
- if (DQ) btDest |= 0x80;
- Delay60us();
- }
- return btDest;
- }
- //序列號匹配
- void MatchROM(const unsigned char *pMatchData)
- {
- unsigned char i;
- Initialization();
- WriteByte(MATCH_ROM);
- for (i = 0; i < 8; i++) WriteByte(*(pMatchData + i));
- }
- //得到64位ROM序列(在P1口顯示,必須與Proteus聯(lián)調(diào)且在單步調(diào)試下才能得到)
- /*void GetROMSequence()
- {
- unsigned char i;
- Initialization();
- WriteByte(READ_ROM);
- for (i = 0; i < 8; i++)
- P1 = ReadByte();
- }*/
- //讀取溫度值
- TEMPDATA ReadTemperature()
- {
- TEMPDATA TempData;
- unsigned int iTempDataH;
- unsigned char btDot, iTempDataL;
- static unsigned char i = 0;
- TempData.btNegative = 0; //為0溫度為正
- i++;
- if (i == 9) i = 1;
- Initialization();
- WriteByte(SKIP_ROM); //跳過ROM匹配
- WriteByte(TEMP_SWITCH); //啟動轉(zhuǎn)換
- Delay500ms(); //調(diào)用一次就行
- Delay500ms();
- Initialization();
- //多個芯片的時候用MatchROM(ROMData)換掉WriteByte(SKIP_ROM)
- switch (i)
- {
- case 1 : MatchROM(ROMData1); TempData.btNumber = 1; break; //匹配1
- case 2 : MatchROM(ROMData2); TempData.btNumber = 2; break; //匹配2
- case 3 : MatchROM(ROMData3); TempData.btNumber = 3; break; //匹配3
- case 4 : MatchROM(ROMData4); TempData.btNumber = 4; break; //匹配4
- case 5 : MatchROM(ROMData5); TempData.btNumber = 5; break; //匹配5
- case 6 : MatchROM(ROMData6); TempData.btNumber = 6; break; //匹配6
- case 7 : MatchROM(ROMData7); TempData.btNumber = 7; break; //匹配7
- case 8 : MatchROM(ROMData8); TempData.btNumber = 8; break; //匹配8
- }
- //WriteByte(SKIP_ROM); //跳過ROM匹配(單個芯片時用這句換掉上面的switch)
- WriteByte(READ_MEMORY); //讀數(shù)據(jù)
- iTempDataL = ReadByte();
- iTempDataH = ReadByte();
- iTempDataH <<= 8;
- iTempDataH |= iTempDataL;
- if (iTempDataH & 0x8000)
- {
- TempData.btNegative = 1;
- iTempDataH = ~iTempDataH + 1; //負(fù)數(shù)求補
- }
- //為了省去浮點運算帶來的開銷,而采用整數(shù)和小數(shù)部分分開處理的方法(沒有四舍五入)
- btDot = (unsigned char)(iTempDataH & 0x000F); //得到小數(shù)部分
- iTempDataH >>= 4; //得到整數(shù)部分
- btDot *= 5; //btDot*10/16得到轉(zhuǎn)換后的小數(shù)數(shù)據(jù)
- btDot >>= 3;
- //數(shù)據(jù)處理
- TempData.btThird = (unsigned char)iTempDataH / 100;
- TempData.btSecond = (unsigned char)iTempDataH % 100 / 10;
- TempData.btFirst = (unsigned char)iTempDataH % 10;
- TempData.btDecimal = btDot;
- return TempData;
- }
復(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; //是否為負(fù)數(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)
下載附件
2020-7-23 23:46 上傳
04溫度對應(yīng)顯示框架
-
03系列號關(guān)聯(lián)存儲.jpg
(51.83 KB, 下載次數(shù): 74)
下載附件
2020-7-23 23:46 上傳
03系列號關(guān)聯(lián)存儲
-
00仿真程序界面.jpg
(127.09 KB, 下載次數(shù): 68)
下載附件
2020-7-23 23:46 上傳
00仿真程序界面
-
02系列號對應(yīng)檢查.jpg
(50.13 KB, 下載次數(shù): 59)
下載附件
2020-7-23 23:46 上傳
02系列號對應(yīng)檢查
-
01數(shù)據(jù)結(jié)構(gòu)變化.jpg
(44.58 KB, 下載次數(shù): 63)
下載附件
2020-7-23 23:46 上傳
01數(shù)據(jù)結(jié)構(gòu)變化
-
05數(shù)據(jù)結(jié)果顯示安排.jpg
(58.64 KB, 下載次數(shù): 65)
下載附件
2020-7-23 23:46 上傳
05數(shù)據(jù)結(jié)果顯示安排
-
06仿真結(jié)果的對應(yīng)關(guān)系.jpg
(127.15 KB, 下載次數(shù): 54)
下載附件
2020-7-23 23:46 上傳
06仿真結(jié)果的對應(yīng)關(guān)系
-
07溫度顯示結(jié)構(gòu).jpg
(10.72 KB, 下載次數(shù): 69)
下載附件
2020-7-23 23:46 上傳
07溫度顯示結(jié)構(gòu)
-
08Keil C程序結(jié)構(gòu).jpg
(47.74 KB, 下載次數(shù): 69)
下載附件
2020-7-23 23:46 上傳
08Keil C程序結(jié)構(gòu)
-
09壓縮文件結(jié)構(gòu).jpg
(27.5 KB, 下載次數(shù): 76)
下載附件
2020-7-23 23:46 上傳
09壓縮文件結(jié)構(gòu)
-
10調(diào)試程序位置.jpg
(49.42 KB, 下載次數(shù): 49)
下載附件
2020-7-23 23:46 上傳
10調(diào)試程序位置
-
11可執(zhí)行程序位置.jpg
(36.61 KB, 下載次數(shù): 51)
下載附件
2020-7-23 23:46 上傳
11可執(zhí)行程序位置
-
12程序備份位置.jpg
(37.24 KB, 下載次數(shù): 70)
下載附件
2020-7-23 23:46 上傳
12程序備份位置
-
-
多點溫度測量系統(tǒng)設(shè)計.zip
2020-7-24 00:19 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
827.97 KB, 下載次數(shù): 50, 下載積分: 黑幣 -5
作者: shinezhangxiao 時間: 2020-7-24 00:22
程序及仿真
-
-
《多點溫度測量》.zip
2020-7-24 00:21 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
119.5 KB, 下載次數(shù): 45, 下載積分: 黑幣 -5
程序及仿真
作者: 溫xyz 時間: 2020-7-24 09:58
這個很好,可以方便的進(jìn)行多點測量了。
歡迎光臨 (http://www.zg4o1577.cn/bbs/) |
Powered by Discuz! X3.1 |
主站蜘蛛池模板:
亚洲精品在线免费观看视频
|
羞羞的视频在线
|
欧美日韩一区二区在线
|
麻豆一区二区三区精品视频
|
国内久久
|
免费观看色
|
欧美极品一区二区
|
成人免费淫片aa视频免费
|
欧美黑人体内she精在线观看
|
超碰成人免费
|
欧美天天视频
|
久久久这里只有17精品
|
天天拍天天射
|
国产最新视频在线
|
免费在线观看一区二区三区
|
99在线免费观看视频
|
综合久久综合久久
|
午夜久久av
|
国产二区三区
|
嫩草视频免费
|
亚洲大片一区
|
成人av一区
|
国家一级黄色片
|
国产福利资源在线
|
韩日精品一区
|
9999在线视频
|
天天操天天射综合网
|
中文字幕一区二区三区乱码在线
|
日韩精品视频在线免费观看
|
亚洲小说图片
|
免费av电影网站
|
成人无遮挡毛片免费看
|
亚洲成人免费视频在线
|
日韩中字幕
|
国产精品久久久久久久久污网站
|
久久久www成人免费无遮挡大片
|
亚洲综合二区
|
国产精品久久久久不卡
|
午夜精品一区二区三区在线视
|
中文字幕国产精品
|
91成人精品视频
|