|
|||||||||||
| 技術(shù)交流 | 電路欣賞 | 工控天地 | 數(shù)字廣電 | 通信技術(shù) | 電源技術(shù) | 測控之家 | EMC技術(shù) | ARM技術(shù) | EDA技術(shù) | PCB技術(shù) | 嵌入式系統(tǒng) 驅(qū)動編程 | 集成電路 | 器件替換 | 模擬技術(shù) | 新手園地 | 單 片 機(jī) | DSP技術(shù) | MCU技術(shù) | IC 設(shè)計 | IC 產(chǎn)業(yè) | CAN-bus/DeviceNe |
關(guān)于18b20的讀寫 |
| 作者:buou 欄目:ARM技術(shù) |
請教大家,為什么我讀出來的值總是0xFFFF啊,初始化返回0,是不是就說明是成功啊,我是用lpc2214+ds18B20、晶振11.0592代碼如下 #define Fosc 11059200 #define Fcclk (Fosc * 4) #define Fcco (Fcclk * 4) #define Fpclk (Fcclk / 4) * 1 #define FAIL 1 #define SUCC 0 #define DQ_18B20 (1 << 24 ) // PD3 #define DQ_TO_0() (IO0CLR= DQ_18B20) // p0.24='0' #define DQ_TO_1() (IO0SET = DQ_18B20) // p0.24='1' #define DQ_status() (IO0PIN& DQ_18B20) // read p0.24 pin //延時t×1u秒程序 void wait_us(uint32 t) { T1TC = 0; T1PR = 0; T1MCR = 0x05; T1MR0 =t*(Fpclk/1000000); /* 1u秒鐘定時 */ T1TCR = 0x01; while((T1IR & 0x01) == 0); T1IR = 0x01; } uint8 ds18B20_reset(void) { uint8 bus_flag; PINSEL1 &= 0xFFFCFFFF; //設(shè)置P0.18為通用IO IO0DIR |= DQ_18B20; DQ_TO_1(); // 設(shè)置1-wire總線為高電平(釋放總線) wait_us(480); DQ_TO_0(); // 設(shè)置1-wire總線為低電平(占領(lǐng)總線)... wait_us(490); // 490us OS_ENTER_CRITICAL(); DQ_TO_1(); // 設(shè)置1-wire總線為高電平(釋放總線) IO0DIR = IO0DIR&(~DQ_18B20); //拉高總線輸入 wait_us(67.5); // 最佳時間: 60us+7.5us!(忙延時,只是一種策略) // 探測總線上是否有器件 if(DQ_status()) bus_flag=FAIL; // 復(fù)位單總線但沒有發(fā)現(xiàn)有器件在線 else bus_flag=SUCC; // 復(fù)位單總線并發(fā)現(xiàn)有器件在線 OS_EXIT_CRITICAL(); // (開中斷) wait_us(490-67.5); // 490-67.5us return(bus_flag); } void ds18B20_write(uint8 dat) { uint8 count; IO0DIR |= DQ_18B20; //改回輸出 OS_ENTER_CRITICAL(); // 每個字節(jié)共8位,一次發(fā)一位 for(count=0; count<8; count++) { DQ_TO_0(); // 設(shè)置1-wire總線為低電平 wait_us(2); // about 2us DQ_TO_1(); if(dat&0x01) DQ_TO_1(); // 并串轉(zhuǎn)換,先低位后高位 else DQ_TO_0(); dat >>= 1; // 下一位做好準(zhǔn)備 wait_us(62); // 62US DQ_TO_1(); wait_us(2); // 2us } OS_EXIT_CRITICAL(); // 恢復(fù)系統(tǒng)中斷 } uint8 ds18B20_read(void) { uint8 count,dat; dat = 0x00; // 數(shù)據(jù)接收準(zhǔn)備 OS_ENTER_CRITICAL(); // 每個字節(jié)共8位,一次收一位 for(count=0; count<8; count++) { IO0DIR |= DQ_18B20; //改回輸出 DQ_TO_0(); // 設(shè)置1-wire總線為低電平(拉低總線以同步) wait_us(2); // 2us DQ_TO_1(); // 設(shè)置1-wire總線為高電平(釋放總線) wait_us(4); // 4us IO0DIR = IO0DIR&(~DQ_18B20); //wait_us(4); // 4us dat >>= 1; if(DQ_status()) dat|=0x80; // 讀取總線電平,先收低位再收高位 wait_us(62); // 必須大于60us } OS_EXIT_CRITICAL(); // 恢復(fù)系統(tǒng)中斷 return(dat); } void convert_T(void) { if(ds18B20_reset()==SUCC) { // 如果復(fù)位成功 ds18B20_write(0xcc); // 跳過多器件識別 ds18B20_write(0x44); // 啟動溫度轉(zhuǎn)換 &nb |
| 2樓: | >>參與討論 |
| 作者: daxia7203 于 2006/12/19 20:48:00 發(fā)布:
我用定時器定時,并且關(guān)中斷的 |
|
| 3樓: | >>參與討論 |
| 作者: zlgarm 于 2006/12/20 9:57:00 發(fā)布:
re: 建議用示波器觀察波形,或用邏輯分析儀分析(http://www.embedtools.com/pro_analyser/analyser/LA1024.asp)。如果程序是在內(nèi)部FLASH運(yùn)行,較短的延時可以不定時器,直接用循環(huán)實(shí)現(xiàn)(延時的時間通過實(shí)測波形來確定)。 |
|
|
|
| 免費(fèi)注冊為維庫電子開發(fā)網(wǎng)會員,參與電子工程師社區(qū)討論,點(diǎn)此進(jìn)入 |
Copyright © 1998-2006 m.58mhw.cn 浙ICP證030469號 |