多個(gè)共總線
ds18b20.h
#ifndef __ds18b20
#define __ds18b20
#include "msp430g2553.h"
#include #include #include #define DQ_1 P2OUT |= BIT0 #define DQ_0 P2OUT &= ~BIT0 #define DQ_in P2DIR &= ~BIT0 #define DQ_out P2DIR |= BIT0 #define DQ_val (P2IN & BIT0) void read_rom(unsigned char rom[]); void WRITE_ROM(unsigned char T_H, unsigned char T_L, unsigned char CONFIG1); unsigned int get_one_temperature(unsigned char ch); unsigned char DS18B20_SearchRomId(unsigned char (*pID)[8], unsigned char Num);//沒用到 #endif ds18b20.c #include "ds18b20.h" #define CPU_F ( (double) 8000000) #define delay_us( x ) __delay_cycles( (long) (CPU_F * (double) x / 1000000.0) ) #define delay_ms( x ) __delay_cycles( (long) (CPU_F * (double) x / 1000.0) ) unsigned char ds18b20_rom1[8] = { 0x80, 0x3C, 0x01, 0xA8, 0x16, 0x8D, 0xB7, 0x28 }; /* 八個(gè)DS18B20的64位ROM地址 */ unsigned char ds18b20_rom2[8] = { 0xB4, 0x3C, 0x01, 0xA8, 0x16, 0x1C, 0x9C, 0x28 }; unsigned char ds18b20_rom3[8] = { 0x6E, 0x3C, 0x01, 0xA8, 0x16, 0x8E, 0x3A, 0x28 }; unsigned char ds18b20_rom4[8] = { 0x9F, 0x3C, 0x01, 0xA8, 0x16, 0x75, 0xA3, 0x28 }; /************************************************ ** 函數(shù)名稱 : void reset(void) ** 函數(shù)功能 : ds18b20復(fù)位函數(shù) ** 輸 入 : 無 ** 輸 出 : 無 ** 說 明 : ************************************************/ void reset(void) { DQ_out; /* 先設(shè)為輸入口 */ DQ_0; /* 主機(jī)發(fā)送復(fù)位脈沖,強(qiáng)制拉DQ至低電平 */ delay_us(750); /* 延時(shí)500vs */ DQ_1; delay_us(15); // DQ_in; /* 設(shè)為輸入口,釋放DQ線 */ // while (DQ_val == 1) // ; /* 等待器件DS18B20應(yīng)答(如果有低電平出現(xiàn)說明總線上有器件作出應(yīng)答) */ // delay_us(50); /* 延時(shí) */ } //等待DS18B20的回應(yīng) //返回1:未檢測到DS18B20的存在 //返回0:存在 unsigned char DS18B20_Check(void) { unsigned char retry = 0; DQ_in; //SET PA0 INPUT while (DQ_val && retry < 200) { retry++; delay_us(1); }; if (retry >= 200) return 1; else retry = 0; while (!DQ_val && retry < 240) { retry++; delay_us(1); }; if (retry >= 240) return 1; return 0; } //從DS18B20讀取一個(gè)位 //返回值:1/0 unsigned char DS18B20_Read_Bit(void) // read one bit { unsigned char data; DQ_out; //SET PA0 OUTPUT DQ_0; delay_us(2); DQ_1; DQ_in; //SET PA0 INPUT delay_us(12); if (DQ_val) data = 1; else data = 0; delay_us(50); return data; } //從DS18B20讀取一個(gè)字節(jié) //返回值:讀到的數(shù)據(jù) unsigned char DS18B20_Read_Byte(void) // read one byte { unsigned char i, j, dat; dat = 0; for (i = 1; i <= 8; i++) { j = DS18B20_Read_Bit(); dat = (j << 7) | (dat >> 1); } return dat; } //寫一個(gè)字節(jié)到DS18B20 //dat:要寫入的字節(jié) void DS18B20_Write_Byte(unsigned char dat) { unsigned char j; unsigned char testb; DQ_out; //SET PA0 OUTPUT; for (j = 1; j <= 8; j++) { testb = dat & 0x01; dat = dat >> 1; if (testb) { DQ_0; // Write 1 delay_us(2); DQ_1; delay_us(60); } else { DQ_0; // Write 0 delay_us(60); DQ_1; delay_us(2); } } } //開始溫度轉(zhuǎn)換 void DS18B20_Start(void) // ds1820 start convert { reset(); DS18B20_Check(); DS18B20_Write_Byte(0xcc); // skip rom DS18B20_Write_Byte(0x44); // convert } /************************************************ ** 函數(shù)名稱 : void read_rom(unsigned char rom[]) ** 函數(shù)功能 : 從ds18b20中讀出64位序列號 ** 輸 入 : 無 ** 輸 出 : 無 ** 說 明 : ************************************************/ void read_rom(unsigned char rom[]) { unsigned char i; reset(); DS18B20_Check(); DS18B20_Write_Byte(0x33); for (i = 8; i > 0; i--) { rom[i - 1] = DS18B20_Read_Byte(); } } /************************************************ ** 函數(shù)名稱 : bit match_rom(uchar *rom) ** 函數(shù)功能 : 64位的ROM序列號匹配 ** 輸 入 : 無 ** 輸 出 : 無 ** 說 明 : ************************************************/ char match_rom(unsigned char *rom) { unsigned char i; reset(); DS18B20_Check(); DS18B20_Write_Byte(0x55); for (i = 8; i > 0; i--) { DS18B20_Write_Byte(*(rom + i - 1)); } return (1); } //寫入配置 分辨率多少位 默認(rèn)12位 void WRITE_ROM(unsigned char T_H, unsigned char T_L, unsigned char CONFIG1) { reset(); /*復(fù)位 */ DS18B20_Write_Byte(0xCC); /* SKIP ROM */ DS18B20_Write_Byte(0x4E); /* 寫RAM命令 */ DS18B20_Write_Byte(T_H); /* 溫度報(bào)警高限值 */ DS18B20_Write_Byte(T_L); /* 溫度報(bào)警低限值 */ DS18B20_Write_Byte(CONFIG1); /* 配置位 */ reset(); /* 重新復(fù)位 */ DS18B20_Write_Byte(0xCC); /* SKIP ROM */ DS18B20_Write_Byte(0x48); /* 將RAM拷貝到EEPROM */ delay_ms(12); /* 耗時(shí)約10MS */ } /* 讀取溫度 */ unsigned int get_one_temperature(unsigned char ch) { unsigned int Temp_l = 0, Temp_h = 0, Temp = 0; float f_temp; switch (ch) { case 1: match_rom(ds18b20_rom1); break; case 2: match_rom(ds18b20_rom2); break; case 3: match_rom(ds18b20_rom3); break; case 4: match_rom(ds18b20_rom4); break; } DS18B20_Write_Byte(0xbe); // convert Temp_l = DS18B20_Read_Byte(); // LSB Temp_h = DS18B20_Read_Byte(); // MSB DS18B20_Start(); // ds1820 start convert Temp_h <<= 8; Temp = Temp_h + Temp_l; f_temp = Temp * 0.0625; /* 18b20的分辨率是0.0625 */ Temp = f_temp * 10 + 0.5; /* 乘以10表示小數(shù)點(diǎn)后面取一位,加0.5是四舍五入 */ return (Temp); /* Temp是整型 */ } /***************************************************************** * @brief :DS18B20_WriteBit() 主機(jī)向總線寫1bit 數(shù)據(jù) * @param : bit:要寫入位的值 0或1 * @retval :無 ****************************************************************/ void DS18B20_WriteBit(unsigned char bit) { DQ_out; /* 主機(jī)端口推挽輸出模式 */ DQ_0; /* Write 0 拉低總線10-15us */ delay_us(12); if (bit & 0x01) { DQ_1; // Write 1 } else { DQ_0; // Write 0 } delay_us(30); /* 寫入數(shù)據(jù)位,保持20-45us */ DQ_1; /* 釋放總線 */ delay_us(5); } /***************************************************************** * @brief :DS18B20_Read2Bit() 主機(jī)從總線上讀取2位的數(shù)據(jù) * @param :無 * @retval :讀到到的數(shù)據(jù) :00H,01H,10H,11H ****************************************************************/ unsigned char DS18B20_Read2Bit(void) { unsigned char i, data = 0; for (i = 0; i < 2; i++) { data <<= 1; if (DS18B20_Read_Bit()) data |= 1; } return (data); } /***************************************************************** * @brief :DS18B20_CRC8() DS18B20 ROMID CRC校驗(yàn) * @param :*pRomId :要校驗(yàn)訴RomID * @retval :返回校驗(yàn)值 ****************************************************************/ unsigned char DS18B20_CRC8(unsigned char *pRomId) { unsigned char i, x; unsigned char crcbuff; unsigned char crc; crc = 0; for (x = 0; x < 8; x++) { crcbuff = pRomId[x]; for (i = 0; i < 8; i++) { if (((crc ^ crcbuff) & 0x01) == 0) crc >>= 1; else { crc ^= 0x18; /* crc=x8+x5+x4+1 */ crc >>= 1; crc |= 0x80;
上一篇:MSP430 單片機(jī) 讀取 程序 LM75A LM75 溫度傳感器
下一篇:MSP430 DS1302 驅(qū)動(dòng)
推薦閱讀最新更新時(shí)間:2025-04-25 08:21




設(shè)計(jì)資源 培訓(xùn) 開發(fā)板 精華推薦
- 基于AVR EVK1105的移動(dòng)遠(yuǎn)程桌面多媒體設(shè)備
- 基于AVR EVK1105平臺的兒童伴睡寶方案設(shè)計(jì)
- 基于AVR的太陽能高速公路智能電子顯示屏設(shè)計(jì)
- 基于MIPS32設(shè)計(jì)的智能電網(wǎng)家庭用電監(jiān)控系統(tǒng)
- 基于Cerebot MX4開發(fā)板的家用智能監(jiān)控系統(tǒng)整體方案設(shè)計(jì)
- 確定運(yùn)算放大器輸出驅(qū)動(dòng)能力的方法分析
- 寵物狗無線感知交互系統(tǒng)軟硬件設(shè)計(jì)
- stm32晶振不起振的原因 stm32單片機(jī)的基本工作原理
- 從三個(gè)層次來介紹用于機(jī)器人主控板的設(shè)計(jì)思想
- 0.8寸數(shù)碼管時(shí)鐘
- 使用 ROHM Semiconductor 的 BM2P013 的參考設(shè)計(jì)
- 用于自動(dòng)測試設(shè)備的 16 位、4 通道 DAC
- LT1765 的典型應(yīng)用 - 單片式 3A、1.25MHz 降壓型開關(guān)穩(wěn)壓器
- AM6TW-2403SH35Z 3.3V 6瓦單路輸出DC-DC轉(zhuǎn)換器的典型應(yīng)用
- SESD0201X1UN-0020-090,使用 SESD0201X1UN-0020-090 ESD 抑制二極管陣列的典型應(yīng)用 20kV 2-Pin DFN
- 【ART-Pi】ART PI ZIGBEE及LORA網(wǎng)關(guān)擴(kuò)展板
- AR0234CSSM00SUKAH3-GEVB:帶有 2MP 單聲道 0deg 全局快門 CMOS 圖像傳感器的 2.3MP 評估板
- OP484FSZ 僅 5V、12 位 DAC 擺幅軌到軌運(yùn)算放大器的典型應(yīng)用
- 基于 ACS723LLCTR-10AU-T 傳感器板的 i.MX 應(yīng)用案例研究中的電流測量
- 人工智能在汽車行業(yè)中的應(yīng)用
- 麥格納集成式艙內(nèi)感知系統(tǒng) 引領(lǐng)車輛安全創(chuàng)新
- 2025世界人工智能大會(huì)上的各種機(jī)器人
- 際上導(dǎo)航:高精度組合定位感知技術(shù)在智能輔助駕駛中的應(yīng)用
- 量產(chǎn)元年的人形機(jī)器人,要破局C端?
- 上半年賺304億元的寧德時(shí)代,給出固態(tài)電池量產(chǎn)時(shí)間表
- 新泗威車載后排航空座椅控制顯示器 | 申報(bào)2025第七屆金輯獎(jiǎng)最佳技術(shù)實(shí)踐應(yīng)用獎(jiǎng)
- L3 智駕,需要?dú)⑹旨壸?/a>
- 2025動(dòng)力電池中場戰(zhàn)局,正力新能“三化策略”應(yīng)戰(zhàn)
- 智能手機(jī)共存解決方案協(xié)同合作使用共用天線
- 免費(fèi)申請|基于STM32H7處理器的機(jī)器視覺微控制器板OpenMV4 Cam H7
- VISHAY新能源主題月,幸運(yùn)闖關(guān)贏大獎(jiǎng)!
- 暑期加油站:零起點(diǎn)帶你學(xué)遍單片機(jī)
- 2016 TI 電機(jī)驅(qū)動(dòng)研討會(huì)資料大放送,不容錯(cuò)過!
- 答題抽獎(jiǎng):Mentor Tessent Automotive相關(guān)測試解決方案(獎(jiǎng)品池還剩不少獎(jiǎng)品喲)
- BeagleBone Black 開發(fā)板 DIY 創(chuàng)意設(shè)計(jì)大賽
- 【已結(jié)束】直播“戴”“芯”:英飛凌可穿戴設(shè)備保姆級解決方案