51單片機多點溫度采集系統(tǒng)程序清單.doc_第1頁
51單片機多點溫度采集系統(tǒng)程序清單.doc_第2頁
51單片機多點溫度采集系統(tǒng)程序清單.doc_第3頁
51單片機多點溫度采集系統(tǒng)程序清單.doc_第4頁
51單片機多點溫度采集系統(tǒng)程序清單.doc_第5頁
免費預(yù)覽已結(jié)束,剩余9頁可下載查看

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

#include #include #defineDATAP1 /1602驅(qū)動端口/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)出E2數(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 tagTempDataunsigned char btThird;/百位數(shù)據(jù)unsigned char btSecond;/十位數(shù)據(jù)unsigned char btFirst;/個位數(shù)據(jù)unsigned char btDecimal;/小數(shù)點后一位數(shù)據(jù)unsigned charbtNegative;/是否為負(fù)數(shù)TEMPDATA;TEMPDATA m_TempData;/引腳定義sbit DQ = P27;/數(shù)據(jù)線端口sbit RS=P20;sbit RW=P21;sbit E=P22;/DS18B20序列號,通過調(diào)用GetROMSequence()函數(shù)在P1口讀出(讀8次)const unsigned char code ROMData18 = 0x28, 0x33, 0xC5, 0xB8, 0x00, 0x00, 0x00, 0xD7;/U1const unsigned char code ROMData28 = 0x28, 0x30, 0xC5, 0xB8, 0x00, 0x00, 0x00, 0x8E;/U2const unsigned char code ROMData38 = 0x28, 0x31, 0xC5, 0xB8, 0x00, 0x00, 0x00, 0xB9;/U3const unsigned char code ROMData48 = 0x28, 0x32, 0xC5, 0xB8, 0x00, 0x00, 0x00, 0xE0;/U4const unsigned char code ROMData58 = 0x28, 0x34, 0xC5, 0xB8, 0x00, 0x00, 0x00, 0x52;/U5const unsigned char code ROMData68 = 0x28, 0x35, 0xC5, 0xB8, 0x00, 0x00, 0x00, 0x65;/U6const unsigned char code ROMData78 = 0x28, 0x36, 0xC5, 0xB8, 0x00, 0x00, 0x00, 0x3C;/U7const unsigned char code ROMData88 = 0x28, 0x37, 0xC5, 0xB8, 0x00, 0x00, 0x00, 0x0B;/U8/判斷忙指令void Busy()DATA = 0xff;RS = 0;RW = 1; while(DATA & 0x80) E = 0; E = 1; E = 0;/寫指令程序void WriteCommand(unsigned char btCommand)Busy();RS = 0;RW = 0;E = 1;DATA = btCommand;E = 0;/寫數(shù)據(jù)程序void WriteData(unsigned char btData)Busy();RS = 1;RW = 0;E = 1;DATA = btData;E = 0;/清屏顯示void Clear()WriteCommand(1);/初始化void Init()WriteCommand(0x0c);/開顯示,無光標(biāo)顯示W(wǎng)riteCommand(0x06);/文字不動,光標(biāo)自動右移WriteCommand(0x38);/設(shè)置顯示模式:8位2行5x7點陣/顯示單個字符void DisplayOne(bit bRow, unsigned char btColumn, unsigned char btData, bit bIsNumber)if (bRow) WriteCommand(0xc0 + btColumn);else WriteCommand(0x80 + btColumn);if (bIsNumber) WriteData(btData + 0x30);else WriteData(btData);/顯示字符串函數(shù)void DisplayString(bit bRow, unsigned char btColumn, unsigned char *pData)while (*pData != 0) if (bRow) WriteCommand(0xc0 + btColumn);/顯示在第1行 else WriteCommand(0x80 + btColumn);/顯示在第0行WriteData(*(pData+);/要顯示的數(shù)據(jù)btColumn+;/列數(shù)加一 /延時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(); /延時480usDQ = 1;Delay60us();/延時60usif(!DQ) /收到ds18b20的應(yīng)答信號DQ = 1;Delay240us();/延時240usbreak;/寫一個字節(jié)(從低位開始寫)void WriteByte(unsigned char btData)unsigned char i, btBuffer;for (i = 0; i i;if (btBuffer & 1)DQ = 0;_nop_();_nop_();DQ = 1;Delay60us();elseDQ = 0;Delay60us();DQ = 1;/讀一個字節(jié)(從低位開始讀)unsigned char ReadByte()unsigned char i, btDest;for (i = 0; i = 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); break;/匹配1case 2 : MatchROM(ROMData2); break;/匹配2case 3 : MatchROM(ROMData3); break;/匹配3case 4 : MatchROM(ROMData4); break;/匹配4case 5 : MatchROM(ROMData5); break;/匹配5case 6 : MatchROM(ROMData6); break;/匹配6case 7 : MatchROM(ROMData7); break;/匹配7case 8 : MatchROM(ROMData8); break;/匹配8/WriteByte(SKIP_ROM);/跳過ROM匹配(單個芯片時用這句換掉上面的switch)WriteByte(READ_MEMORY);/讀數(shù)據(jù)iTempDataL = ReadByte();iTempDataH = ReadByte();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;/數(shù)據(jù)處理子程序void DataProcess()m_TempData = ReadTemperature();if (m_TempData.btNegative) DisplayOne(1, 6, -, 0);else DisplayOne(1, 6, m_TempData.btThird, 1);D

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論