DS18B20
1.特性
- 独特的单线接口,只需1个接口引脚即可通信
- 多点(multidrop)能力使分布式温度检测应用得以简化
- 不需要外部元件
- 可用数据线供电
- 测量范围从-55摄氏度至+125摄氏度,增量值为0.5摄氏度
- 以 9 位数字值方式读出温度
- 在 1 秒内把温度变换为数字
- 用户可定义的,非易失性的温度告警设置
- 告警搜索命令识别和寻址温度在编定的极限之外的器件
- 应用范围包括恒温控制,工业系统 ,消费类产品 ,温度计或任何热敏系统
2.通信流程
- 复位
- 51单片机发送0xCC,代表跳过ROM
- 51单片机发送0x44,代表ds18b20开启温度转换
- 延时等待
- 复位
- 51单片机发送0xCC,代表跳过ROM
- 51单片机发送0xBE,代表读取ds18b20发送过来的温度值
- 读取温度数据
3.代码实现
复位
int ds18b20_Reset(void){ int t = 0; DQ_DOWN; Delay10us(70); DQ_HIGH; Delay10us(5); while(DQ_CHECK && t < 30){ Delay10us(1); t++; } if(t >= 30){ return 0; } t = 0; while(!DQ_CHECK && t < 30){ Delay10us(1); t++; } if(t >= 30){ return 0; } return 1; }
51单片机发送数据
void write_ds18b20(unsigned char dat){ int i = 0; for(i = 0;i < 8;i++){ if(dat & 1){ DQ_DOWN; _nop_(); _nop_(); DQ_HIGH; Delay10us(5); } else{ DQ_DOWN; Delay10us(5); DQ_HIGH; } dat >>= 1; } }
51单片机读取数据
unsigned char read_ds18b20(void){ int i = 0; unsigned char ret = 0; for(i = 0;i < 8;i++){ DQ_DOWN; _nop_(); _nop_(); DQ_HIGH; _nop_(); _nop_(); _nop_(); if(DQ_CHECK){ ret |= (1 << i); } Delay10us(5); } return ret; }
获取温度
float get_temp(void){ short ret = 0; unsigned char tl = 0; unsigned char th = 0; ds18b20_Reset(); write_ds18b20(0xCC); write_ds18b20(0x44); Delay1ms(1000); ds18b20_Reset(); write_ds18b20(0xCC); write_ds18b20(0xBE); tl = read_ds18b20(); th = read_ds18b20(); ret = th << 8; ret |= tl; return ret * 0.0625; }