多點溫度測量仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)
0.png (18.13 KB, 下載次數: 26)
下載附件
2018-11-25 15:51 上傳
單片機源程序如下:
- //頭文件包含
- #include <AT89X51.H>
- #include <Intrins.h>
- #include "DS18B20.H"
- //引腳定義
- sbit DQ = P2^7; //數據線端口
- //DS18B20序列號,通過調用GetROMSequence()函數在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子函數
- void Delay16us()
- {
- unsigned char a;
- for (a = 0; a < 4; a++);
- }
- //延時60us子函數
- void Delay60us()
- {
- unsigned char a;
- for (a = 0; a < 18; a++);
- }
- //延時480us子函數
- void Delay480us()
- {
- unsigned char a;
- for (a = 0; a < 158; a++);
- }
- //延時240us子函數
- void Delay240us()
- {
- unsigned char a;
- for (a = 0; a < 78; a++);
- }
- //延時500ms子函數
- 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的應答信號
- {
- DQ = 1;
- Delay240us(); //延時240us
- break;
- }
- }
- }
- //寫一個字節(從低位開始寫)
- 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;
- }
- }
- }
- //讀一個字節(從低位開始讀)
- 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聯調且在單步調試下才能得到)
- /*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); //啟動轉換
- Delay500ms(); //調用一次就行
- Delay500ms();
- Initialization();
- //多個芯片的時候用MatchROM(ROMData)換掉WriteByte(SKIP_ROM)
- switch (i)
- {
- case 1 : MatchROM(ROMData1); break; //匹配1
- case 2 : MatchROM(ROMData2); break; //匹配2
- case 3 : MatchROM(ROMData3); break; //匹配3
- case 4 : MatchROM(ROMData4); break; //匹配4
- case 5 : MatchROM(ROMData5); break; //匹配5
- case 6 : MatchROM(ROMData6); break; //匹配6
- case 7 : MatchROM(ROMData7); break; //匹配7
- case 8 : MatchROM(ROMData8); break; //匹配8
- }
- //WriteByte(SKIP_ROM); //跳過ROM匹配(單個芯片時用這句換掉上面的switch)
- WriteByte(READ_MEMORY); //讀數據
- iTempDataL = ReadByte();
- iTempDataH = ReadByte();
- iTempDataH <<= 8;
- iTempDataH |= iTempDataL;
- if (iTempDataH & 0x8000)
- {
- TempData.btNegative = 1;
- iTempDataH = ~iTempDataH + 1; //負數求補
- }
- //為了省去浮點運算帶來的開銷,而采用整數和小數部分分開處理的方法(沒有四舍五入)
- btDot = (unsigned char)(iTempDataH & 0x000F); //得到小數部分
- iTempDataH >>= 4; //得到整數部分
- btDot *= 5; //btDot*10/16得到轉換后的小數數據
- btDot >>= 3;
- //數據處理
- TempData.btThird = (unsigned char)iTempDataH / 100;
- TempData.btSecond = (unsigned char)iTempDataH % 100 / 10;
- TempData.btFirst = (unsigned char)iTempDataH % 10;
- TempData.btDecimal = btDot;
- return TempData;
- }
復制代碼
所有資料51hei提供下載:
多點溫度測量.zip
(82.37 KB, 下載次數: 55)
2018-11-25 09:25 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|