DS18B20 介绍
数字温度传感器 DS18B20
。
具有体积小、硬件开销低、抗干扰能力强、精度高的特点。
常见的封装形式有:直插式、管道式、螺纹式、磁铁吸附式、不锈钢封装式等。
DS18B20的测温范围可达-55°C ~ +125°C
,在-10°C ~ +85°C
范围时精度为±0.5°C
,工作电压3.0v ~ 5.0v
。
文档链接
特性
- 独特的
1-Wire
接口只需要一个引脚进行通信
- 每个器件都有一个存储在板载ROM中的唯一64位串行代码
- 不需要其他外部辅助器件
- 可以从数据线供电
- 电源范围为3.0V至5.5V
- 测温范围从–55°C到+125°C (–67°F到+257°F),–10°C到+85°C的精度为±0.5°C
- 分辨率9或12位可调
- 12位转换最多用时750ms
- 用户可定义的非易失性报警
单总线介绍
1-Wire是Maxim子公司达拉斯半导体的专利技术,仅用单一信号线就可像I²C、SPI一样,传输时钟(clock)又传输数据(data),并且数据传输是双向的。1-Wire使用较低的数据传输速率,通常是用来沟通小型设备,如数字温度计。
-- 维基百科
Arduino 如何使用 DS18B20
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
| #include <OneWire.h> #include <DallasTemperature.h>
const int ONE_WIRE_BUS = 2;
OneWire oneWire(ONE_WIRE_BUS); DallasTemperature sensors(&oneWire);
void setup(void) { Serial.begin(9600); sensors.begin(); }
void loop(void){ sensors.requestTemperatures();
Serial.print("Celsius temperature: "); Serial.print(sensors.getTempCByIndex(0)); Serial.print(" - Fahrenheit temperature: "); Serial.println(sensors.getTempFByIndex(0)); delay(1000); }
|
51单片机如何使用 DS18B20
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130
| #include <mcs51/8051.h> #include <stdio.h> #define __nop() __asm nop __endasm
#define ONE_BUS P2_0
void delay_t(unsigned int t) { while(t--); }
void delay(unsigned int t) { signed int a, b; for(a=t; a>0; a--) for(b=125; b>0; b--); }
__bit one_wire_init() { __bit status = 1; ONE_BUS = 1; delay_t(8); ONE_BUS = 0; delay_t(80); ONE_BUS = 1; delay_t(8); status = ONE_BUS; delay_t(4); return status; }
void one_wire_write_byte(unsigned char data) { unsigned char i; for(i=0; i<8; i++) { ONE_BUS = 0; ONE_BUS = data & 0x01; delay_t(4); ONE_BUS = 1; data >>= 1; } delay_t(4); }
unsigned char one_wire_read_byte() { unsigned char i = 0; unsigned char data = 0; for(i=0; i<8; i++) { ONE_BUS = 0; data >>= 1; ONE_BUS = 1; if(ONE_BUS) { data |= 0x80; } delay_t(4); } return data; }
void request_temperature() { one_wire_init(); one_wire_write_byte(0xCC); one_wire_write_byte(0x44); }
unsigned char get_temperature() { unsigned char lsb, msb; one_wire_init(); one_wire_write_byte(0xCC); one_wire_write_byte(0xBE);
lsb = one_wire_read_byte(); msb = one_wire_read_byte();
msb <<= 4; msb += (lsb >> 4); return msb; }
void serial_init() { TMOD |= 0x20; SCON |= 0x50; TH1 = 0XFD; TL1 = 0XFD; TR1=1; EA=1; }
void putchar(char c) { SBUF = c; while(!TI); TI = 0; }
void setup() { __bit status = 1; serial_init(); status = one_wire_init(); if(!status) { printf("invalid status\n"); } }
void loop() { char value = 0; request_temperature(); printf("value: %d \n", get_temperature()); delay(500); }
void main() { setup(); while(1) loop(); }
|
一些有用的链接