|
|||||||||||
| 技術(shù)交流 | 電路欣賞 | 工控天地 | 數(shù)字廣電 | 通信技術(shù) | 電源技術(shù) | 測控之家 | EMC技術(shù) | ARM技術(shù) | EDA技術(shù) | PCB技術(shù) | 嵌入式系統(tǒng) 驅(qū)動編程 | 集成電路 | 器件替換 | 模擬技術(shù) | 新手園地 | 單 片 機 | DSP技術(shù) | MCU技術(shù) | IC 設(shè)計 | IC 產(chǎn)業(yè) | CAN-bus/DeviceNe |
18B20干擾問題,求救。。 |
| 作者:zhouxunp 欄目:單片機 |
用18B20測溫,電纜線長度50m,每個128只用一個18B20。 在測試數(shù)據(jù)中,經(jīng)常出現(xiàn)-2000度。源程序如下,請大蝦賜教。 #include <iom128v.h> #include <macros.h> #include "mega128.h" #include "includes.h" #define T18B20_GLOBALS 1 #include "18b20.h" // ============================================================================= // BASIC TIME OPERATION // ----------------------------------------------------------------------------- // void Delay600US(void) { unsigned int i; for(i = 0; i < 1200; i ++) NOP(); } // ----------------------------------------------------------------------------- void Delay15US(void) { unsigned int i; for(i = 0; i < 28; i ++) NOP(); } // ----------------------------------------------------------------------------- void Delay60US(void) { unsigned int i; for(i = 0; i < 118; i ++) NOP(); } // ----------------------------------------------------------------------------- void Delay1US(void) { NOP(); } // ============================================================================= // BASIC DALLAS FUNCDTION // ----------------------------------------------------------------------------- // RESET 18B20 unsigned CHAR TReset(void) { // CLI(); // Disable the GLOBAL function T18B20_OFF; Delay600US(); T18B20_ON; Delay60US(); // CLI(); if(T18B20_VALUE == 0) { Delay600US(); SEI(); return 0; } Delay600US(); SEI(); return 1; } // ----------------------------------------------------------------------------- // WRITE ONE BIT TO 18B20 void TWriteBit(unsigned CHAR ucBit) { CLI(); // Delay 1US T18B20_OFF; Delay1US(); if(ucBit) T18B20_ON; else T18B20_OFF; SEI(); Delay60US(); T18B20_ON; } // ----------------------------------------------------------------------------- // READ ONE BIT FROM 18B20 unsigned CHAR TReadBit(void) { unsigned CHAR ucReturn; // CLI(); OS_ENTER_CRITICAL(); T18B20_OFF; Delay1US(); T18B20_ON; Delay15US(); if(T18B20_VALUE) ucReturn = 1; else ucReturn = 0; OS_EXIT_CRITICAL(); // SEI(); Delay15US(); return ucReturn; } // ----------------------------------------------------------------------------- // WRITE BYTE void TWriteByte(unsigned CHAR ucByte) { unsigned CHAR ucMask; unsigned CHAR i; ucMask = 0x1; for(i = 0; i < 8; i ++) { TWriteBit(ucByte & ucMask); ucMask = ucMask << 1; } } // ----------------------------------------------------------------------------- unsigned CHAR TReadByte(void) { unsigned CHAR ucMask, i, ucChar, ucBit; ucChar = 0; ucMask = 0x1; for(i = 0; i < 8; i ++) { ucBit = TReadBit(); if(ucBit) ucChar |= ucMask; ucMask = ucMask << 1; } return ucChar; } // ----------------------------------------------------------------------------- // READ THE CODE FROM 18B20 unsigned CHAR TReadCode(unsigned CHAR * pCode) { unsigned CHAR i; unsigned CHAR ucChar; if(TReset() != 0) return 1; TWriteByte(RC_READROM); for(i = 0; i < 8; i ++) { *(pCode + i) = TReadByte(); } return 0; } // ----------------------------------------------------------------------------- // SET CONFIGRATION void TSetConfig(unsigned CHAR ucConfig) { ucConfig = ucConfig << 5; // The bit6 and bit5 is the config bit. TReset(); TWriteByte(RC_SKIPROM); TWriteByte(MC_WRITESCRATCHPAD); TWriteByte(00); // TH/User byte1 TWriteByte(00); // TH/User byte2 TWriteByte(ucConfig); TReset(); } // ----------------------------------------------------------------------------- // START TEMPERATURE CONVERTION unsigned CHAR TStartConvertT(void) { // if(TReset()!= 0) return 1; TReset(); // CLI(); TWriteByte(RC_SKIPROM); TWriteByte(MC_CONVERTT); // SEI(); retur |
| 2樓: | >>參與討論 |
| 作者: NE5532 于 2006/3/25 18:05:00 發(fā)布:
電纜線長度50m。?? 兄弟,考慮用個8腳的低成本單片機本地讀取溫度數(shù)據(jù)然后通過RS485總線傳送,50m的線對1-W是在是太變態(tài)了。 |
|
| 3樓: | >>參與討論 |
| 作者: lwtlwt 于 2006/3/25 20:27:00 發(fā)布:
re. 很明顯: 你的線實在太長了,即使是RS232C也不能這么長,更不用說是用開漏輸出的1-Wrie |
|
| 4樓: | >>參與討論 |
| 作者: zhouxunp 于 2006/3/26 9:58:00 發(fā)布:
50米線,不算長。 在實驗室,用200米線都可以。只是到現(xiàn)場后,才會出現(xiàn)亂嗎。 |
|
| 5樓: | >>參與討論 |
| 作者: 何以解憂 于 2006/3/26 10:13:00 發(fā)布:
直接接到單片機的IO上吧 別說50米,5米都夠嗆 NE5532 是正解 嚴重干擾的情況下單片機直接就死機了 I/O口特別容易串入干擾的 * - 本貼最后修改時間:2006-3-26 10:14:55 修改者:何以解憂 |
|
|
|
| 免費注冊為維庫電子開發(fā)網(wǎng)會員,參與電子工程師社區(qū)討論,點此進入 |
Copyright © 1998-2006 m.58mhw.cn 浙ICP證030469號 |